Zamiast tego należy użyć ClassLoader#getResource()
, jeśli jego identyfikator URI reprezentuje poprawną lokalną ścieżkę systemu plików dysku.
URL resource = classLoader.getResource("resource.ext");
File file = new File(resource.toURI());
FileInputStream input = new FileInputStream(file);
// ...
Jeśli nie (np. JAR), najlepiej jest skopiować go do pliku tymczasowego.
Path temp = Files.createTempFile("resource-", ".ext");
Files.copy(classLoader.getResourceAsStream("resource.ext"), temp, StandardCopyOption.REPLACE_EXISTING);
FileInputStream input = new FileInputStream(temp.toFile());
// ...
Powiedział, że ja naprawdę nie widzę żadnych korzyści tego robić, czy to musi być wymagane przez ubogich klasy pomocnik/metodę, która wymaga FileInputStream
zamiast InputStream
. Jeśli możesz, po prostu napraw API, aby poprosić o numer InputStream
. Jeśli jest to trzecia strona, należy to zgłosić jako błąd. W tym konkretnym przypadku umieściłbym również znaki zapytania na pozostałej części tego interfejsu API.
Dlaczego jest to plik FileInputStream? – nos
Czy na pewno istnieje rzeczywisty plik, który tworzy kopię zapasową zasobu, a nie wpis w pliku JAR? –