2010-02-28 15 views
42

Mam ten wiersz w moim programie:Jak przekonwertować InputStream do FileInputStream

InputStream Resource_InputStream=this.getClass().getClassLoader().getResourceAsStream("Resource_Name"); 

Ale jak mogę dostać FileInputStream od niego [Resource_InputStream]?

+9

Dlaczego jest to plik FileInputStream? – nos

+2

Czy na pewno istnieje rzeczywisty plik, który tworzy kopię zapasową zasobu, a nie wpis w pliku JAR? –

Odpowiedz

53

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.

+0

zamiast 'FileInputStream input = new FileInputStream (temp.toFile());', użyłem 'FileInputStream input = new FileInputStream (temp.toString());'. ponieważ "temp.toFile" prawdopodobnie pozostawiłoby puste wejście (FileInputStream). dla możliwego powodu możesz sprawdzić Path.toFile java api doc –

11

Krótka historia: Nie należy używać FileInputStream jako parametru lub typu zmiennej. Użyj abstrakcyjnej klasy bazowej, w tym przypadku InputStream zamiast.

+17

Nie podoba mi się ta odpowiedź, czasami naprawdę potrzebujesz FileInputStream, ponieważ potrzebujesz metod z jego API, jak na przykład getChannel(), a on nie zapytał, czy to jest dobrym pomysłem lub nie używać InputStream, tylko jeśli jest to możliwe lub nie, aby utworzyć strumień wejściowy pliku ze strumienia wejściowego. Zamiast dodawania nowej odpowiedzi mógłbyś użyć komentarza. – arielsan

+0

Co na temat właściwości java.util.Properties? – sloven

0

Trzeba coś takiego:

URL resource = this.getClass().getResource("/path/to/resource.res"); 
    File is = null; 
    try { 
     is = new File(resource.toURI()); 
    } catch (URISyntaxException e1) { 
     // TODO Auto-generated catch block 
     e1.printStackTrace(); 
    } 
    try { 
     FileInputStream input = new FileInputStream(is); 
    } catch (FileNotFoundException e1) { 
     // TODO Auto-generated catch block 
     e1.printStackTrace(); 
    } 

Ale to będzie działać tylko w swoim IDE, a nie w runnable JAR. Miałem ten sam problem wyjaśniony here.

Powiązane problemy