Wie konvertiere ich FileInputStream in InputStream? [geschlossen]

116

Ich möchte nur ein FileInputStreamin ein konvertieren InputStream. Wie kann ich das tun?

z.B

FileInputStream fis = new FileInputStream("c://filename");
InputStream is = ?; 
fis.close();
Ranjan
quelle
3
Ranjan. Können Sie bitte die richtige Antwort auf diesen Beitrag ändern? Die aktuelle Antwort ist unterdurchschnittlich. Wenn Sie es auf das unten stehende ändern, wäre das optimal.
Whitecat
Es war nur eine dumme Frage. Ich hatte keine richtige Vorstellung von der Serialisierung. Jeder kann sich auf @sudocode
ranjan
4
Es ist vielleicht eine dumme Frage, aber viele Leute beziehen sich immer noch auf diese Frage, weil sie nützlich ist.
Whitecat
1
@ WilliMentzel Ich bin hierher gekommen, um nach der tatsächlichen Konvertierung von FileKlasse zu Klasse zu suchen InputStream. Ihre Bearbeitung legt nahe, dass der Autor dies (zumindest teilweise) verlangt, und es ist nicht richtig.
Linie
@Line Ich habe lediglich die Formatierung geändert. Ich glaube nicht, dass ich die Bedeutung geändert habe. Wenn Sie immer noch Einwände erheben, können Sie meine Änderungen rückgängig machen. Dies wird dann von der Community überprüft. Übrigens: Woher wissen Sie, was der Autor meinte, außer was die Frage jetzt ist?
Willi Mentzel

Antworten:

7

Normalerweise lesen Sie zuerst aus dem Eingabestream und schließen ihn dann. Sie können den FileInputStream in einen anderen InputStream (oder Reader) einbinden. Es wird automatisch geschlossen, wenn Sie den Wrapping-Stream / Reader schließen.

Wenn dies eine Methode ist, die einen InputStream an den Aufrufer zurückgibt, liegt es in der Verantwortung des Aufrufers, den Stream zu schließen, wenn er damit fertig ist. Wenn Sie es in Ihrer Methode schließen, kann der Anrufer es nicht verwenden.

Um einige Ihrer Kommentare zu beantworten ...

Um den Inhalt von InputStream an einen Remote-Consumer zu senden, schreiben Sie den Inhalt des InputStream in einen OutputStream und schließen dann beide Streams.

Der Remote-Consumer weiß nichts über die von Ihnen erstellten Stream-Objekte. Er erhält nur den Inhalt in einem InputStream, den er erstellt, liest und schließt.

Sudocode
quelle
Was ist, wenn ich einen Inputstream per Mail senden möchte? .. ist es möglich auf der anderen Seite zu schließen .. oder es muss nicht geschlossen werden
Ranjan
2
Das Stream-Objekt selbst ist nicht serialisierbar. Der Inhalt des Stroms kann serialisiert werden - durch Schreiben von Inhalten auf einen Output
sudocode
Eigentlich ist es mein Ziel, eine Datei zu senden. Ich möchte nicht, dass etwas läuft, wenn ich sie sende. ZB als würde ich eine Zeichenfolge senden. Die andere Seite muss sich also nicht darum kümmern, etwas zu schließen.
Ranjan
1
Die Datei ist auch nicht serialisierbar. Der Inhalt einer Datei kann jedoch mit einem OutputStream serialisiert werden.
Sudocode
Ist es möglich, dass ich auf eine bestimmte Zeit warten und dann den Eingabestream schließen werde, z. B. abhängig von der Größe der Datei
Ranjan
135
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;
Kumar Vivek Mitra
quelle
12
Warum wird "is.close ()" aufgerufen, bevor das "is" am Ende zurückgegeben wird?
Talespin_Kit
56
InputStream is = new FileInputStream("c://filename");
return is;
Sumit Singh
quelle
2
Das ist die Antwort!
andreikashin
36

FileInputStream ist ein inputStream.

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

Natürlich wird dies nicht das tun, was Sie wollen ; Der von Ihnen zurückgegebene Stream wurde bereits geschlossen. Geben Sie einfach den FileInputStream zurück und fertig. Der aufrufende Code sollte ihn schließen.

Joeri Hendrickx
quelle
oder kehren Sie einfach zurück, fisobwohl ich nicht sicher bin, ob ich einen geschlossenen Stream zurückgeben soll.
Bala R
6
Das ist dumm - wenn Sie schließen fis- Sie schließen auchis
RonK
1
Wenn ich die Datei schließe, werden die Daten nicht
gesendet
2
@ RonK in der Tat. Deshalb erwähne ich es.
Joeri Hendrickx
3
Nur ein kurzer Code return FileInputStream("c://filename");in der Methode, deren Rückgabetyp istInputStream
Yatendra Goel
2

Wenn Sie einen Stream in einen anderen einbinden, schließen Sie keine Zwischen-Streams, und das ist sehr wichtig: Sie schließen sie nicht, bevor Sie die äußeren Streams nicht mehr verwenden. Weil du auch den äußeren Strom schließen würdest.

Benutzer unbekannt
quelle