2013-03-04 23 views
5

Mam gniazdo do którego zapisuję dane postaci i niektóre dane bajtowe. W przypadku danych postaciowych łatwiej jest użyć PrintWriter. W przypadku danych o bajtach surowych łatwiej jest pisać bezpośrednio do OutputStream. Więc w całym moim kodu, mam segmenty tak:Czy istnieje sposób zamknięcia programu Writer bez zamykania strumienia bazowego?

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

Dopóki jestem uważać, aby nie pisać do tego Writer po rozpoczęciu zapisu strumienia w jakiś inny sposób, to jest w porządku. Ale wolałbym mieć pewność, że dostanę IOException, jeśli przypadkowo napiszę do strumienia (tak jak bym to zrobił, gdybym go zamknął).

Czy istnieje sposób, aby jawnie zapobiec przyszłym zapisom do Writer bez zamykania podstawowego strumienia?

Odpowiedz

7

Po prostu, nie. Sposób, w jaki klasy strumienia Java io są zapisywane, zawsze zamykają operacje łańcuchowe. Można oczywiście stworzyć własną implementację programu piszącego, która mogłaby zmienić to zachowanie.

9

Dlaczego? close() robi tylko dwie rzeczy: (1) opróżnia pisarza i (2) wywołuje close() na zagnieżdżonym pisarzu. Jeśli nie chcesz (2), zadzwoń pod numer flush() i nie dzwoń w ogóle pod numer close().

0

Chciałbym utworzyć specjalną klasę pozwalającą pisać obie postacie i danych binarnych, coś jak:

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

może przedłużyć lub nie przedłużyć Writer; w tym drugim przypadku nie ma potrzeby zastępowania metod nie używanych w kodzie.

Sztuczka z flushem pisarza nadal istnieje, ale jest zlokalizowana w jednej klasie; Ponadto, jeśli sztuczka ulegnie uszkodzeniu w jakiejś przyszłej wersji, klasa może zostać przepisana w celu wyeliminowania sztuczki (jeden będzie prawdopodobnie potrzebował pożyczyć część kodu ze źródeł Androida).

0

To jak używać OutputStream zarówno charakterem i danych binarnych:

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

Wymień "UTF-8", jeśli chcesz kodowanie different.