FileInputStream'i InputStream'e nasıl dönüştürebilirim? [kapalı]


116

Sadece dönüştürmek istediğiniz FileInputStreambir için InputStreambunu yapabilirim, nasıl?

Örneğin

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

3
ranjan. Lütfen bu yazıya doğru cevabı değiştirir misiniz? Mevcut cevap subpar. Aşağıdakine değiştirirseniz bu optimal olacaktır.
Whitecat

Sadece aptalca bir soruydu .. Serileştirme hakkında doğru bir fikrim yoktu ... herhangi biri @sudocode'a başvurabilir
ranjan

4
Aptalca bir soru olabilir, ancak birçok kişi hala bu soruya başvuruyor çünkü yararlı.
Whitecat

1
@WilliMentzel Buraya Filesınıftan gerçek dönüşüm için geldim InputStream. Düzenlemeniz, yazarın (en azından kısmen) istediği şeyin bu olduğunu gösteriyor ve bu doğru değil.
Satır

@Line Sadece biçimlendirmeyi değiştirdim, anlamı değiştirdiğimi sanmıyorum. Hala itiraz ediyorsanız, değişikliklerimi geri almaktan çekinmeyin. Bu daha sonra topluluk tarafından incelenecektir. Bu arada, sorunun şimdi ne olduğu dışında yazarın ne demek istediğini nasıl anlarsınız?
Willi Mentzel

Yanıtlar:


7

Genellikle önce giriş akışından okur ve ardından onu kapatırsınız. FileInputStream'i başka bir InputStream'e (veya Reader'a) sarabilirsiniz. Sarma akışını / okuyucuyu kapattığınızda otomatik olarak kapanacaktır.

Bu, arayan kişiye bir InputStream döndüren bir yöntemse, onunla bittiğinde akışı kapatmak arayanın sorumluluğundadır. Yönteminizde kapatırsanız, arayan kişi onu kullanamayacaktır.

Bazı yorumlarınıza cevap vermek için ...

InputStream içeriğini uzak bir tüketiciye göndermek için, InputStream içeriğini bir OutputStream'e yazarsınız ve ardından her iki akışı da kapatırsınız.

Uzak tüketici, oluşturduğunuz akış nesneleri hakkında hiçbir şey bilmiyor. İçeriği, oluşturacağı, okuyacağı ve kapatacağı bir InputStream'de alır.


posta üzerinden bir girdi akışı göndermek istersem ne olur? .. diğer tarafta kapatmak mümkün mü .. yoksa kapatılması
gerekmiyor

2
Akış nesnesinin kendisi serileştirilemez. Akışın içeriği, bir OutputStream'e içerik yazarak serileştirilebilir
sudocode

Aslında amacım bir dosya göndermek .. Gönderdiğimde hiçbir şeyin çalışmasını istemiyorum .. Örneğin bir string gönderiyormuşum gibi .. böylece karşı tarafın herhangi bir şeyi kapatma konusunda endişelenmesine gerek kalmasın.
ranjan

1
Dosya da serileştirilemez. Ancak bir dosyanın içeriği bir OutputStream kullanılarak serileştirilebilir.
sudocode

belirli bir süre bekleyip ardından giriş akışını kapatmam mümkün mü, örneğin dosyanın boyutuna bağlı olarak
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
Neden sonunda "is" döndürülmeden önce "is.close ()" çağrılır?
Talespin_Kit


36

FileInputStream olan bir inputStream.

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

Elbette, bu sizin yapmasını istediğiniz şeyi yapmayacaktır ; geri döndüğünüz akış zaten kapatıldı. Sadece FileInputStream'i iade edin ve işiniz bitti. Çağıran kod onu kapatmalıdır.


veya fiskapalı bir akışı geri getirme konusunda emin olmasam da geri dönün .
Bala R

6
Bu aptalca - eğer kapatırsan fis- sen de kapatırsınis
RonK

1
kapatırsam dosya verileri gönderilmez
ranjan

2
@RonK gerçekten. Bu yüzden bundan bahsediyorum.
Joeri Hendrickx

3
return FileInputStream("c://filename");Dönüş türü olan yöntemdeki daha kısa bir kodInputStream
Yatendra Goel

2

Bir akışı diğerine sararsanız, ara akışları kapatmazsınız ve çok önemlidir: Dış akışları kullanmayı bitirmeden önce onları kapatmazsınız. Çünkü dış akıntıyı da kapatırdınız.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.