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.