2010-02-28 18 views
42

ho questa linea nel mio programma:Come convertire InputStream per FileInputStream

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

Ma come posso ottenere FileInputStream da esso [Resource_InputStream]?

+9

Perché è necessario che sia un FileInputStream? – nos

+2

Sei sicuro che ci sia anche un file reale che supporta la tua risorsa e non una voce in un file JAR? –

risposta

53

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.

+0

invece di 'FileInputStream input = new FileInputStream (temp.toFile());', ho usato 'FileInputStream input = new FileInputStream (temp.toString());'. poiché 'temp.toFile' potrebbe lasciare un input vuoto (FileInputStream). per la possibile ragione puoi controllare Path.toFile java api doc –

11

Breve storia: Non utilizzare FileInputStream come parametro o tipo di variabile. Usa invece la classe base astratta, in questo caso InputStream.

+17

Non mi piace questa risposta, a volte hai davvero bisogno di un FileInputStream perché hai bisogno di metodi dalla sua API come getChannel() per esempio, e lui non gli ha chiesto se è una buona idea o non usare un InputStream, solo se è possibile o meno creare un flusso di input di file da un flusso di input. Potresti aver usato un commento invece di aggiungere una nuova risposta. – arielsan

+0

Che dire di java.util.Properties? – sloven

0

avete bisogno di qualcosa di simile:

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(); 
    } 

ma funzionerà solo all'interno del vostro IDE, non in JAR eseguibile. Ho avuto lo stesso problema spiegato here.

Problemi correlati