gpt4 book ai didi

java - 从慢速流读取时,BufferedReader.readLine() 是否可能不读取整行?

转载 作者:行者123 更新时间:2023-12-01 15:18:22 30 4
gpt4 key购买 nike

我的一个系统遇到了一个奇怪的错误,我无法解释。在我们的系统中,后端正在生成一个大型 TSV 输出文件,然后我们使用以下代码通过 HTTP 提供该文件:

    BufferedInputStream input = new BufferedInputStream(p.getInputStream(), (int)FileUtils.BYTES_PER_MEGABYTE * 16);
OutputStream output = resp.getOutputStream();
byte[] buffer = new byte[(int) (FileUtils.BYTES_PER_KILOBYTE * 8)];
do
{
int read = input.read(buffer);
if (read <= 0) break;
output.write(buffer);
} while (true);
input.close();
output.close();

然后在客户端,有一个 TSV 解析器消耗 HTTP 响应,但在非常大的输入上,我们开始看到奇怪的工件,其中解析器将报告一行具有错误的项目数,并且错误消息会打印它将要显示的行正在解析,该行将是一个随机数据 block ,即不是整行数据

我的第一个想法是生成的 TSV 格式错误,但我通过直接从后端系统复制文件,然后通过三个独立编写的开源 TSV 解析器(包括客户端的解析器)运行它,几乎排除了这种可能性。代码正在使用)并且它们在本地文件上运行时都能够很好地解析文件。

作为引用,我们使用的 TSV 解析器的代码是 here

这让我想到了两种可能性:

  1. 我展示的用于通过 HTTP 复制文件的代码在某种程度上存在缺陷 - 在这种情况下,我希望有人指出我犯了哪些愚蠢但不明显的错误!
  2. 消费解析器正在使用的
  3. BufferedReader.readLine() 不能保证读取整行?如果是这种情况,我不会完全感到惊讶,因为我已经被 .Net 中慢速网络流的奇怪读取行为所困扰,所以想知道类似的问题是否也适用于 Java?

或者还有其他我忽略的解释吗?

最佳答案

在发布这个问题时,我突然发现错误是什么(通常!)

我发布的用于复制文件的代码的以下部分不正确:

int read = input.read(buffer);
if (read <= 0) break;
output.write(buffer);

它应该如下所示:

int read = input.read(buffer);
if (read <= 0) break;
output.write(buffer, 0, read);

问题是我总是将整个缓冲区写入输出流,即使我们从输入中读取的数据少于缓冲区的大小。这意味着在文件末尾,我们将打印最后一个数据 block 以及缓冲区其余部分中剩下的任何内容,因此留下了随机数据 block !

关于java - 从慢速流读取时,BufferedReader.readLine() 是否可能不读取整行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11319049/

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