2012-06-19 9 views
99

Voglio convertire un File in un InputStream, come posso farlo?File to InputStream

es

FileInputStream fis = new FileInputStream("c://filename"); 
InputStream is = ?; 
fis.close(); 

Come convertire FileInputStream a InputStream, in modo che possa chiudere fis o c'è qualche altro modo per convertire il File-InputStream?

+2

ranjan. Puoi per favore cambiare la risposta corretta a questo post. La risposta attuale è scadente. Se lo cambi a quello sotto che sarebbe ottimale. – Whitecat

+0

Era solo una domanda stupida .. Non avevo un'idea adeguata sulla serializzazione ... chiunque può riferirsi a @sudocode – ranjan

+4

forse una domanda stupida ma molte persone si riferiscono ancora a questa domanda perché è utile. – Whitecat

risposta

5

In genere, è necessario innanzitutto leggere dallo stream di input e quindi chiuderlo. È possibile avvolgere FileInputStream in un altro InputStream (o Reader). Sarà chiuso automaticamente quando si chiude il flusso/lettore di wrapping.

Se questo è un metodo che restituisce un InputStream al chiamante, è quindi responsabilità del chiamante chiudere lo stream al termine dell'operazione. Se lo chiudi nel tuo metodo, il chiamante non sarà in grado di usarlo.

Per rispondere ad alcune delle vostre osservazioni ...

Per inviare il contenuto InputStream ad un consumatore a distanza, si può scrivere il contenuto del InputStream ad un OutputStream, e quindi chiudere entrambi i flussi.

L'utente remoto non sa nulla degli oggetti stream che sono stati creati. Riceve solo il contenuto, in un InputStream che creerà, leggerà e chiuderà.

+0

E se voglio inviare un inputstream via mail. .. è possibile chiudere dall'altra parte .. o non è necessario essere chiuso – ranjan

+2

L'oggetto flusso non è serializzabile. Il contenuto del flusso può essere serializzato - scrivendo il contenuto su un OutputStream – sudocode

+0

In realtà il mio obiettivo è inviare un file .. Non voglio eseguire nulla una volta inviato. Ad es. come se stessi mandando una stringa ... in modo che l'altra parte non debba preoccuparsi di chiudere nulla. – ranjan

33

FileInputStream è un inputStream.

FileInputStream fis = new FileInputStream("c://filename"); 
InputStream is = fis; 
fis.close(); 
return is; 

Naturalmente, questo non fare quello che vuoi che faccia; lo stream che ritorni è già stato chiuso. Basta restituire FileInputStream e averlo fatto. Il codice chiamante dovrebbe chiuderlo.

+0

o semplicemente restituisco 'fis' anche se non sono sicuro su come restituire un flusso chiuso. –

+4

Questo è stupido - se chiudi 'fis' - chiudi anche' is' – RonK

+1

se chiudo il file i dati non vengono inviati – ranjan

46
InputStream is = new FileInputStream("c://filename"); 
return is; 
2

Se si avvolgono uno stream in un altro, non si chiude flussi intermedi, e molto importante: Tu non li chiude prima di finire utilizzando i flussi esterni. Perché dovresti chiudere anche il flusso esterno.

122
InputStream is; 

try { 
    is = new FileInputStream("c://filename"); 

    is.close(); 
} catch (FileNotFoundException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} catch (IOException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} 

return is; 
+8

Perché "is.close()" chiamato prima che "is" venga restituito alla fine. –