【问题标题】:Java InputStreamReader tries to read whole stream?Java InputStreamReader 尝试读取整个流?
【发布时间】:2018-07-26 13:19:42
【问题描述】:

我正在尝试从 Socket 读取 UTF-16 字符串。关键是在读取字符串的前几个字符之前,我不知道它的字节长度。

所以我这样打开InputStreamReader

InputStreamReader reader = new InputStreamReader(inputStream, "UTF-16");

然后我尝试逐个字符地读取它。

reader.read();

它在尝试读取第一个字符时挂起!

在调试过程中,我意识到InputStreamReader 有点试图读取整个InputStream,然后将其转换为UTF-16 字符序列。当然,它一直到字符串的末尾,它什么都没有,所以它只是等待客户端发送更多的字节。

InputStreamReader 真的是这样吗?如果是 - 我如何读取 UTF-16 InputStream 的一部分,或者更好的是单个字符,而不到达它的结尾?

【问题讨论】:

  • 你可以试试 - new InputStreamReader(inputStream, Charset.forName("UTF-16"));
  • read() 阻塞直到数据可用。因此,如果它阻塞,则流是空的。
  • “我假设您还没有阅读文档” - 我已经阅读了它,并且 InputStream 可以正常工作。返回直到字符串末尾的字节,然后挂起。
  • Charset.forName("UTF-16") - 试过了,没用。
  • “流是空的” - 不

标签: java inputstreamreader


【解决方案1】:

如果我理解你 pb,你应该使用 byte[] 和

将你的输入流转换为字符串
IOUtils.toString(inputStream, StandardCharsets.UTF_8);

那么你应该能够对其进行迭代

或直接

FileUtils.readFileToByteArray(new File(path))

如果你想从文件中获取一个字节[]

【讨论】:

  • 不,关键是“在阅读前几个字符之前我不知道它的长度”。因此,我不能只读取整个流 - 它会在最后阻塞线程。
  • 如果你把输入翻译成一个字节[] 以便读取它的长度
  • 使用 IOUtils.toByteArray(Input) 你会得到你的 byte[] 然后你可以得到大小
  • 我无法将输入转换为字节[],因为它是一个套接字。并且套接字以这种方式工作,它无休止地等待新字节,而不是结束流。
  • 我不知道如何帮助你:/
【解决方案2】:

由于您使用的 BufferedInputStream 方法不会阻止您得到这样的情况,即一旦您的 InputStream 没有任何数据并且没有关闭,您不会得到 -1 而是 0。这会将您的方法发送到无限循环。

因此,对于读取本地流,最好检查 read()

【讨论】:

  • 嗯,等一下,它不返回0。它阻塞了。
  • 显示您尝试使用的代码
  • InputStreamReader reader = new InputStreamReader(inputStream, "UTF-16"); reader.read();
  • 你的循环在哪里?
  • 没有循环。我正在尝试读取第一个字符并且它会阻塞。 InputStream 不为空。
猜你喜欢
  • 2011-01-26
  • 1970-01-01
  • 1970-01-01
  • 2014-12-04
  • 2012-10-30
  • 2020-10-05
  • 2012-12-28
  • 1970-01-01
  • 2023-03-04
相关资源
最近更新 更多