Come convertire FileInputStream in InputStream? [chiuso]


116

Voglio solo convertire un FileInputStreama in InputStream, come posso farlo?

per esempio

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

3
Ranjan. Puoi cambiare la risposta corretta a questo post. La risposta attuale è scadente. Se lo cambi con quello sotto, sarebbe ottimale.
Whitecat

Era solo una domanda stupida .. Non avevo un'idea precisa della serializzazione ... chiunque può fare riferimento a @sudocode
ranjan

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

1
@WilliMentzel Sono venuto qui alla ricerca di una conversione effettiva dalla Fileclasse a InputStream. La tua modifica suggerisce che è ciò che l'autore sta chiedendo (almeno in parte), e non è giusto.
Linea

@Line Ho semplicemente cambiato la formattazione Non credo di aver cambiato il significato. Se continui a obiettare, sentiti libero di annullare le mie modifiche. Questo sarà poi esaminato dalla comunità. A proposito: come fai a sapere cosa intendeva l'autore tranne che per qual è la domanda ora?
Willi Mentzel

Risposte:


7

In genere dovresti prima leggere dal flusso di input e poi chiuderlo. Puoi avvolgere FileInputStream in un altro InputStream (o Reader). Verrà chiuso automaticamente quando chiudi lo stream / lettore di wrapping.

Se questo è un metodo che restituisce un InputStream al chiamante, è responsabilità del chiamante chiudere il flusso una volta terminato. Se lo chiudi nel tuo metodo, il chiamante non sarà in grado di usarlo.

Per rispondere ad alcuni dei tuoi commenti ...

Per inviare il contenuto InputStream a un consumatore remoto, scrivere il contenuto di InputStream in un OutputStream e quindi chiudere entrambi i flussi.

Il consumatore remoto non sa nulla degli oggetti stream che hai creato. Riceve solo il contenuto, in un InputStream che creerà, leggerà e chiuderà.


cosa succede se voglio inviare un inputstream tramite posta. .. è possibile chiudere dall'altra parte .. o non è necessario che sia chiuso
ranjan

2
L'oggetto stream stesso non è serializzabile. Il contenuto dello stream può essere serializzato - scrivendo contenuto in un OutputStream
sudocodice

In realtà il mio obiettivo è inviare un file .. Non voglio che venga eseguito nulla una volta inviato .. ad es. Come se stessi inviando una stringa .. in modo che l'altra parte non debba preoccuparsi di chiudere qualcosa.
ranjan

1
Il file non è nemmeno serializzabile. Ma il contenuto di un file può essere serializzato utilizzando un OutputStream.
sudocodice

è possibile che aspetterò per un determinato periodo di tempo e quindi chiuderò il flusso di input, ad esempio a seconda della dimensione del file
ranjan

136
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;

12
Perché "is.close ()" viene chiamato prima che "is" venga restituito alla fine.
Talespin_Kit


36

FileInputStream è un inputStream.

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

Naturalmente, questo non farà quello che vuoi che faccia ; lo stream a cui ritorni è già stato chiuso. Restituisci semplicemente FileInputStream e finisci. Il codice chiamante dovrebbe chiuderlo.


o semplicemente tornare fisanche se non sono sicuro di restituire un flusso chiuso.
Bala R

6
Questo è stupido - se chiudi fis- chiudi ancheis
RonK

1
se chiudo il file i dati non vengono inviati
ranjan

2
@ RonK in effetti. Ecco perché ne parlo.
Joeri Hendrickx

3
Solo un codice più breve return FileInputStream("c://filename");nel metodo il cui tipo di ritorno èInputStream
Yatendra Goel

2

Se avvolgi un flusso in un altro, non chiudi i flussi intermedi e molto importante: non li chiudi prima di aver finito di utilizzare i flussi esterni. Perché chiuderesti anche il flusso esterno.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.