2015-04-22 16 views
6

Mi chiedo perché è ancora possibile leggere i byte già chiusi ByteArrayOutputStream. Questa linea di documenti non significa il contrario?Perché è possibile leggere i dati da ByteArrayOutputStream già chiuso?

public void close(): chiude questo flusso. Questo rilascia le risorse di sistema utilizzate per questo flusso.

codice di esempio:

String data = "Some string ..."; 
ByteArrayOutputStream bOut = new ByteArrayOutputStream(); 
DataOutputStream dOut = new DataOutputStream(bOut); 
dOut.write(data.getBytes()); 
dOut.close(); 
System.out.println("Length: " + bOut.toByteArray().length); 
System.out.println("Byte #2: " + bOut.toByteArray()[2]); 

uscita:

Length: 15 
Byte #2: 109 

Sto facendo qualcosa di sbagliato?

+0

dove si chiude 'ByteArrayOutputStream', si è chiuso' DataOutputStream' –

+0

@MitulSanghani Quando si chiude uno stream, anche eventuali flussi annidati vengono chiusi. – Kayaman

+0

ok Grazie non lo so .. –

risposta

5

ByteArrayOutputStream.toByteArray copia solo ciò che ha nel buffer; non sta leggendo nulla di più dal flusso.

public synchronized byte[] toByteArray() { 
    return Arrays.copyOf(buf, count); 
} 

Anche questa classe è un po 'speciale. Vedi Java documentation e codice.

La chiusura di un ByteArrayOutputStream non ha alcun effetto. I metodi in questa classe possono essere chiamati dopo che lo stream è stato chiuso senza generare una IOException.

public void close() throws IOException { 
} 

close() in realtà non fa nulla.

+0

Ok, grazie. Pensavo che close() avrebbe dovuto svuotare il buf sottostante. Ma sembra che non lo sia – Roman

+0

@Roman Flush a cosa? – EJP