gpt4 book ai didi

java - 多个引号导致 PipedOutputStream/OutputStreamWriter 失败

转载 作者:行者123 更新时间:2023-12-01 22:33:53 25 4
gpt4 key购买 nike

当我尝试将 OutputStream 复制到 InputStream 时,我偶然发现了 PipedOutputStream 的一个非常奇怪的行为。另请参阅How to write an nt:file programmatically

下面是一个小单元测试方法:

@Test
public void pipeTest() {
PipedInputStream pin = null;
try {
pin = new PipedInputStream();
PipedOutputStream pout = new PipedOutputStream(pin);
OutputStreamWriter writer = new OutputStreamWriter(pout);
for (int i = 0; i < 100; i++) {
writer.write("\"Test\";" + i + "\n");
// writer.write("\"Test\";" + "\"" + i + "\"\n");
}

writer.close();
pout.close();

System.out.print(IOUtils.toString(pin));
} catch (IOException e) {
System.out.print(e);
} finally {
IOUtils.closeQuietly(pin);
}

}

这很有效并打印出 100 行。如果取消注释第二个写入语句并注释掉第一个,writer.close() 就会卡住并且永远不会完成。第二组引号 \" 似乎有问题。有谁知道为什么会出现这种情况以及如何规避它?

最佳答案

这与引号无关,而与您正在写入的数据量有关。为了演示这一点,您可以完全摆脱编写器和循环,只需使用:

pout.write(new byte[1024]);

或者保留现有代码,但看看它是否有效(因为它写入了 1000 个字节):

writer.write("0123456789");

但这不会(因为它尝试写入 1100 字节):

writer.write("0123456789X");

这可行 - 但如果你将其更改为 1025,它将永远挂起...因为默认情况下内部缓冲区的长度为 1024 字节,并且没有任何内容消耗流。 (在完成写入之前,您不会从 pin 读取数据。)由于没有任何内容消耗前 1024 个字节中的任何一个,因此没有地方可以放置第 1025 个字节,因此 write 阻塞直到有空间。

你可以:

  • 在构造 PipedInputStream 时更改管道大小,以便获得更大的缓冲区
  • 在写入时从管道中读取 - 例如在一个单独的线程中。

关于java - 多个引号导致 PipedOutputStream/OutputStreamWriter 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27171638/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com