2015-04-22 2 views
6

Мне интересно, почему вы все еще можете читать байты с уже закрытого ByteArrayOutputStream. Разве эта линия из документов не означает противоположность?Почему вы можете читать данные из уже закрытого ByteArrayOutputStream?

public void close(): Закрывает этот поток. Это освобождает системные ресурсы, используемые для этого потока.

Пример кода:

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]); 

Выход:

Length: 15 
Byte #2: 109 

Я делаю что-то не так?

+0

, где вы закрываете 'ByteArrayOutputStream', вы закрыли' DataOutputStream' –

+0

@MitulSanghani. Когда вы закрываете поток, любые вложенные потоки также закрываются. – Kayaman

+0

ok Спасибо, я не знаю, что .. –

ответ

5

ByteArrayOutputStream.toByteArray просто копирует то, что у него есть в буфере; он ничего не читает из потока.

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

Также этот класс является немного особенным. См. Java documentation и код.

Закрытие ByteArrayOutputStream не влияет. Методы в этом классе могут быть вызваны после того, как поток был закрыт без генерации исключения IOException.

public void close() throws IOException { 
} 

close() не делает ничего.

+0

Хорошо, спасибо. Я думал, что close() должен очистить базовый буфер. Но похоже, что это не – Roman

+0

@Roman Промойте это к чему? – EJP

 Смежные вопросы

  • Нет связанных вопросов^_^