【问题标题】:Why you can read data from already closed ByteArrayOutputStream?为什么你可以从已经关闭的 ByteArrayOutputStream 中读取数据?
【发布时间】:2015-06-29 18:35:24
【问题描述】:

我想知道为什么你仍然可以从已经关闭的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

我是不是做错了什么?

【问题讨论】:

  • 在你关闭ByteArrayOutputStream的地方,你已经关闭了DataOutputStream
  • @MitulSanghani 当你关闭一个流时,任何嵌套的流也会被关闭。
  • 好的,谢谢,我不知道..
  • 因为这就是它的用途。如果您事后无法从中获取数据,那将没有多大用处。

标签: java java-io bytearrayoutputstream


【解决方案1】:

ByteArrayOutputStream.toByteArray 只是复制缓冲区中的内容;它不再从流中读取任何内容。

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

这门课也有点特别。请参阅Java documentation 和代码。

关闭 ByteArrayOutputStream 无效。该类中的方法可以在流关闭后调用,不会产生 IOException。

public void close() throws IOException {
}

close() 并没有真正做任何事情。

【讨论】:

  • 好的,谢谢。我认为 close() 应该刷新底层 buf。但是好像没有
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-01-13
  • 2010-11-07
  • 1970-01-01
  • 1970-01-01
  • 2010-09-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多