Java InputStreamReader尝试读取整个流吗?

时间:2018-07-26 13:19:42

标签: java inputstreamreader

我正在尝试从Socket中读取UTF-16字符串。关键是在读取字符串的前几个字符之前,我不知道其长度(以字节为单位)。

所以我像这样打开InputStreamReader

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

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

reader.read();

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

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

InputStreamReader确实是这样工作的吗?如果是的话,如何在不到达UTF-16 InputStream的一部分的情况下阅读更好的单个char字符?

2 个答案:

答案 0 :(得分:-1)

如果我了解您,请使用

使用byte []将输入流转换为字符串
IOUtils.toString(inputStream, StandardCharsets.UTF_8);

那么您应该可以对其进行迭代

或直接

FileUtils.readFileToByteArray(new File(path))

如果要从文件中获取字节[]

答案 1 :(得分:-1)

由于您使用的BufferedInputStream方法不会阻塞,因此您会遇到以下情况:一旦InputStream没有任何数据并且没有关闭,您将不会得到-1而是0。这会将您的方法发送到一个无尽的循环。

因此,对于读取本地流,最好检查一下read()<= 0,因为通常可以足够快地获取数据。 最好的方法是通过关闭流来确保存在eof。