Jak przekonwertować FileInputStream na InputStream? [Zamknięte]


116

Chcę tylko przekonwertować a FileInputStreamna InputStream, jak mogę to zrobić?

na przykład

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

3
ranjan. Czy możesz zmienić poprawną odpowiedź na ten post. Obecna odpowiedź to podpunkt. Jeśli zmienisz to na poniższy, będzie to optymalne.
Whitecat

To było tylko głupie pytanie ... Nie miałem pojęcia o serializacji ... każdy może odwołać się do @sudocode
ranjan.

4
może to głupie pytanie, ale wiele osób nadal odwołuje się do tego pytania, ponieważ jest przydatne.
Whitecat

1
@WilliMentzel Przyszedłem tutaj, szukając rzeczywistej konwersji z Fileklasy na InputStream. Twoja zmiana sugeruje, że o to prosi autor (przynajmniej częściowo) i nie jest to właściwe.
Linia

@Line Zmieniłem tylko formatowanie. Nie sądzę, że zmieniłem znaczenie. Jeśli nadal wyrażasz sprzeciw, możesz wycofać moje zmiany. Zostanie to następnie przejrzane przez społeczność. A propos: skąd wiesz, co autor miał na myśli, poza tym, jakie pytanie brzmi teraz?
Willi Mentzel,

Odpowiedzi:


7

Zwykle najpierw czytasz ze strumienia wejściowego, a następnie go zamykasz. Możesz opakować FileInputStream w inny InputStream (lub Reader). Zostanie automatycznie zamknięty po zamknięciu strumienia opakowywania / czytnika.

Jeśli jest to metoda zwracająca InputStream do obiektu wywołującego, to wywołujący jest odpowiedzialny za zamknięcie strumienia po zakończeniu. Jeśli zamkniesz ją w swojej metodzie, wywołujący nie będzie mógł jej użyć.

Aby odpowiedzieć na niektóre z twoich komentarzy ...

Aby wysłać zawartość InputStream do zdalnego konsumenta, należałoby zapisać zawartość InputStream do OutputStream, a następnie zamknąć oba strumienie.

Odbiorca zdalny nie wie nic o obiektach strumienia, które utworzyłeś. Po prostu odbiera zawartość w InputStream, który utworzy, przeczyta i zamknie.


co jeśli chcę wysłać inputstream pocztą. .. czy można zamknąć po drugiej stronie .. czy nie trzeba zamykać
ranjan

2
Sam obiekt strumienia nie jest możliwy do serializacji. Zawartość strumienia można serializować - zapisując zawartość w OutputStream
sudocode

Właściwie moim celem jest wysłanie pliku .. Nie chcę, aby cokolwiek działało po wysłaniu ... np. Tak, jakbym wysyłał ciąg znaków ... aby druga strona nie musiała się martwić o zamknięcie czegokolwiek.
ranjan

1
Pliku również nie można serializować. Ale zawartość pliku można serializować przy użyciu OutputStream.
sudocode

czy to możliwe, że poczekam przez określony czas, a następnie zamknę strumień wejściowy, np. w zależności od rozmiaru pliku
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
Dlaczego funkcja „is.close ()” jest wywoływana przed zwróceniem wartości „is” na końcu.
Talespin_Kit


36

FileInputStream to inputStream.

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

Oczywiście nie zrobi to tego, co chcesz ; strumień, który zwracasz, został już zamknięty. Po prostu zwróć FileInputStream i skończ z tym. Kod wywołujący powinien go zamknąć.


lub po prostu wróć, fischociaż nie jestem pewien, czy wrócę zamknięty strumień.
Bala R

6
To głupie - jeśli zamkniesz fis- również zamknieszis
RonK

1
jeśli zamknę plik dane nie są wysyłane
ranjan

2
@RonK rzeczywiście. Dlatego o tym wspominam.
Joeri Hendrickx

3
Jeszcze return FileInputStream("c://filename");InputStream
krótszy

2

Jeśli zawijasz jeden strumień w drugi, nie zamykasz strumieni pośrednich i bardzo ważne: nie zamykasz ich przed zakończeniem korzystania ze strumieni zewnętrznych. Ponieważ zamknąłbyś również zewnętrzny strumień.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.