2013-03-04 1 views
5

Ho una presa sulla quale scrivo alcuni dati di carattere e alcuni dati di byte grezzi. Per i dati dei personaggi, è più facile usare uno PrintWriter. Per i dati di byte non elaborati, è più facile scrivere direttamente su OutputStream. Così tutto il mio codice, ho segmenti come questo:C'è un modo per chiudere un writer senza chiudere lo stream sottostante?

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

Finché io sono attento a non scrivere in questo Writer dopo aver iniziato a scrivere al flusso in qualche altro modo, questo va bene. Ma preferirei la sicurezza di sapere che otterrò uno IOException se accidentalmente scrivo nello stream (come farei se lo avessi chiuso).

C'è un modo per impedire esplicitamente le future scritture a Writer senza chiudere il flusso sottostante?

risposta

7

In poche parole, no. Il modo in cui vengono scritte le classi di flusso io Java, esse eseguono sempre operazioni a catena. Potresti, ovviamente, creare la tua implementazione di sceneggiatore che ha annullato questo comportamento.

9

Perché? close() fa solo due cose: (1) svuota lo scrittore e (2) chiama close() nello scrittore nidificato. Se non si desidera (2), chiamare da solo il numero flush() e non chiamare il numero close().

0

vorrei creare una classe speciale che permette di scrivere entrambi i personaggi e dati binari, qualcosa di simile:

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

Si può ampliare o si estende Writer; in quest'ultimo caso, non è necessario sovrascrivere i metodi non utilizzati nel codice.

Il trucco con lo scrittore flush è ancora lì, ma è localizzato in una classe; Inoltre, se il trucco si interrompe in alcune versioni future, la classe può essere riscritta per eliminare il trucco (è probabile che sia necessario prendere in prestito una porzione di codice da fonti Android).

0

Questo è come utilizzare OutputStream sia per il carattere e dati binari:

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

sostituire "UTF-8" se si desidera una codifica different.