我正在尝试从Socket
中读取UTF-16字符串。关键是在读取字符串的前几个字符之前,我不知道其长度(以字节为单位)。
所以我像这样打开InputStreamReader
:
InputStreamReader reader = new InputStreamReader(inputStream, "UTF-16");
然后我尝试逐个字符地读取它。
reader.read();
并且在尝试读取第一个字符时挂起!
在调试过程中,我意识到InputStreamReader
有点像试图读取InputStream
,然后将其转换为UTF-16字符序列。当然,它会一直下降到字符串的末尾,那里什么也没有,所以它只是在等待客户端发送更多的字节。
InputStreamReader
确实是这样工作的吗?如果是的话,如何在不到达UTF-16 InputStream
的一部分的情况下阅读更好的单个char字符?
答案 0 :(得分:-1)
如果我了解您,请使用
使用byte []将输入流转换为字符串IOUtils.toString(inputStream, StandardCharsets.UTF_8);
那么您应该可以对其进行迭代
或直接
FileUtils.readFileToByteArray(new File(path))
如果要从文件中获取字节[]
答案 1 :(得分:-1)
由于您使用的BufferedInputStream方法不会阻塞,因此您会遇到以下情况:一旦InputStream没有任何数据并且没有关闭,您将不会得到-1而是0。这会将您的方法发送到一个无尽的循环。
因此,对于读取本地流,最好检查一下read()<= 0,因为通常可以足够快地获取数据。 最好的方法是通过关闭流来确保存在eof。