Use ClassLoader#getResource()
en su lugar si su URI representa una ruta del sistema de archivos de disco local válida.
URL resource = classLoader.getResource("resource.ext");
File file = new File(resource.toURI());
FileInputStream input = new FileInputStream(file);
// ...
Si no lo hace (por ejemplo, JAR), la mejor opción es copiarlo en un archivo temporal.
Path temp = Files.createTempFile("resource-", ".ext");
Files.copy(classLoader.getResourceAsStream("resource.ext"), temp, StandardCopyOption.REPLACE_EXISTING);
FileInputStream input = new FileInputStream(temp.toFile());
// ...
Dicho esto, yo realmente no veo ningún beneficio de hacerlo, o debe ser requerido por una mala clase de ayuda/método que requiere FileInputStream
en lugar de InputStream
. Si puede, simplemente corrija la API para solicitar un InputStream
. Si es un tercero, de todos modos infórmelo como un error. En este caso específico también pondría signos de interrogación sobre el resto de esa API.
¿Por qué es necesario que sea un FileInputStream? – nos
¿Está seguro de que hay incluso un archivo real respaldando su recurso y no una entrada en un archivo JAR? –