2013-03-04 97 views
5

我有一個套接字,我寫了一些字符數據和一些原始字節數據。對於字符數據,使用PrintWriter更容易。對於原始字節數據,直接寫入OutputStream會更容易。所以,在我的代碼,我有這樣的片段:有沒有辦法在不關閉底層流的情況下關閉Writer?

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

只要我小心,不要寫這個Writer開始寫入流中的一些其他的方式之後,這是好的。但我寧願知道如果我不小心寫入流(如果我已經關閉它),我會得到一個IOException的安全性。

有沒有辦法明確阻止將來寫入Writer而不關閉其基礎流?

回答

7

簡而言之,沒有。 Java io流類被寫入的方式,它們總是鏈接關閉操作。當然,你可以創建自己的編寫器實現來覆蓋這種行爲。

9

爲什麼? close()只做兩件事:(1)刷新作者,(2)在嵌套作家上調用close()。如果你不想要(2),請自己撥打電話flush(),根本不要撥打close()

0

我想創建一個特殊的類,允許寫入字符和二進制數據是這樣的:

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() { 
     // ... 
    } 
} 

它可以擴展或不擴展Writer;在後一種情況下,您不需要重寫代碼中未使用的方法。

編寫器刷新的技巧仍然存在,但它本地化爲一個類;此外,如果技巧在未來版本中突破,該類可能會被重寫以消除該技巧(可能需要借用Android源代碼的一部分代碼)。

0

這是如何使用的OutputStream兩個字符和二進制數據:

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

替換 「UTF-8」 如果你想要一個different編碼。

相關問題