gpt4 book ai didi

java - 读取 Java BufferedReader 的所有内容,包括行终止字符

转载 作者:行者123 更新时间:2023-11-29 04:59:08 24 4
gpt4 key购买 nike

我正在编写一个 TCP 客户端,它接收一些二进制数据并将其发送到设备。当我使用 BufferedReader 读取它收到的内容时出现问题。

我非常困惑,发现没有方法可以读取所有数据。每个人都在使用的 readLine() 方法将 \n\r 字符都检测为行终止字符,所以我无法获取数据并连接这些行,因为我不知道哪个字符是行终止符。我也不能使用 read(buf, offset, num),因为它不返回已读取的字节数。如果我使用 read() 方法逐字节读取它,它会变得非常慢。请有人告诉我解决方案是什么,这个 API 对我来说似乎很愚蠢!


嗯,首先感谢大家。我认为主要问题是因为我阅读了 tutorialspoint 而不是 Java 文档。但请原谅我,因为我住在伊朗,而且 Oracle 出于某种原因不允许我们访问该文档。无论如何,感谢您的耐心和有益的答复。

最佳答案

这很可能是 XY 问题。

问题的开头是:

I'm writing a TCP client that receives some binary data and sends it to a device. The problem arises when I use BufferedReader to read what it has received.

这是二进制数据; 不要使用 Reader 开始!Reader 使用 Charset 包装 InputStream 并产生 char 流,而不是 字节。参见,除其他来源外,here了解更多详情。

下一步:

I'm extremely puzzled by finding out that there is no method available to read all the data

有道理。不知道数据有多大,因此如果您接收到的数据太大,这种方法会充满问题。

所以,既然使用 Reader 已经不可行了,那么您真正需要做的是:

  • Socket读取一些二进制数据;
  • 将此数据复制到另一个来源。

解决方案有很多;这是一个只需要标准 JDK (7+) 的解决方案:

final byte[] buf = new byte[8192]; // or other

try (
final InputStream in = theSocket.getInputStream();
final OutputStream out = whatever();
) {
int nrBytes;
while ((nrBytes = in.read(buf)) != -1)
out.write(buf, 0, nrBytes);
}

将此代码包装在方法或其他内容中。

关于java - 读取 Java BufferedReader 的所有内容,包括行终止字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32660331/

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