2013-03-04 16 views
5

Bazı karakter verilerini yazdığım bir soketim var ve bazı ham bayt verileri. Karakter verisi için PrintWriter'u kullanmak daha kolay. Ham bayt verileri için, doğrudan OutputStream'a yazmak daha kolaydır. Yani benim kod boyunca, böyle segmentleri vardır:Bir yazarın altta yatan akışı kapatmadan kapatmanın bir yolu var mı?

Writer writer = new PrintWriter(outputStream); 
writer.write(someText); 
... 
writer.flush(); 
// No call to writer.close(), because that would close the underlying stream. 

sürece ben başka bir şekilde akışa yazmaya başladıktan sonra bu Writer yazmak için dikkatli olduğum gibi, bu iyi. Ama ben yanlışlıkla (eğer kapatmış olsaydım) akışına yazdığımda IOException alacağımı bilmenin güvenliğini tercih ederim.

Gelecek yazılarını Writer temel akışını kapatmadan açıkça engellemenin bir yolu var mı?

cevap

7

Basitçe yazmayın, hayır. Java io akış sınıfları yazılırken, her zaman yakın işlemler zincirlerler. Tabii ki, bu davranışa zarar veren kendi yazar uygulamanızı yaratabilirsiniz.

9

Neden? close() sadece iki şey yapar: (1) yazarı yıkayın ve (2) iç içe yazarın üzerine close() numaralı telefonu arayın. Eğer istemiyorsanız (2), flush() numaralı telefonu arayın ve hiç close()'u arama.

0

Ben, karakterleri ve ikili veri, böyle bir şey yazmaya izin veren özel bir sınıf oluşturmak olacaktır:

class CombinedWriter extends Writer { 
    private boolean isWritingBinary; 
    private Writer mWriter; 
    private OutputStream mOutputStream; 
    public void write(byte[] bytes) { 
     // flush the writer if necessary 
     isWritingBinary = true; 
     mOutputStream.write(bytes); 
    } 
    public void write(String string) { 
     // flush if necessary 
     isWritingBinary = false; 
     mWriter.write(string); 
    } 
    public void flush() { 
     // ... 
    } 
    public void close() { 
     // ... 
    } 
} 
O Writer uzatmak uzatmak veya olmayabilir

; İkinci durumda, kodunuzda kullanılmayan yöntemleri geçersiz kılmanız gerekmez.

Yazar sifonuyla ilgili hile hala var, ancak bir sınıfa yerelleştiriliyor; ek olarak, eğer hile gelecek sürümlerde bozulursa, hile ortadan kaldırmak için sınıf yeniden yazılabilir (muhtemelen Android kaynaklarından kodların bir kısmını ödünç almanız gerekecektir).

0

Bu karakter ve ikili verilerin her ikisi için OutputStream nasıl kullanılacağını geçerli:

byte strBin[] = someText.getBytes("UTF-8"); 
outputStream.write(strBin); 

Değiştir "UTF-8" Eğer bir different kodlama istiyorum.

İlgili konular