Utilizzare invece ClassLoader#getResource()
se il relativo URI rappresenta un percorso del file system del disco locale valido.
URL resource = classLoader.getResource("resource.ext");
File file = new File(resource.toURI());
FileInputStream input = new FileInputStream(file);
// ...
In caso contrario (ad esempio JAR), la soluzione migliore è copiarla in un file temporaneo.
Path temp = Files.createTempFile("resource-", ".ext");
Files.copy(classLoader.getResourceAsStream("resource.ext"), temp, StandardCopyOption.REPLACE_EXISTING);
FileInputStream input = new FileInputStream(temp.toFile());
// ...
Detto questo, io davvero non vedo alcun beneficio di farlo, oppure deve essere richiesto da una povera classe di supporto/metodo che richiede FileInputStream
invece di InputStream
. Se è possibile, è sufficiente correggere l'API per chiedere un InputStream
invece. Se si tratta di una terza parte, segnalalo in ogni caso come un bug. In questo caso specifico inserisco anche dei punti interrogativi attorno al resto dell'API.
Perché è necessario che sia un FileInputStream? – nos
Sei sicuro che ci sia anche un file reale che supporta la tua risorsa e non una voce in un file JAR? –