>假设我正在使用这样的套接字输入流,以便读取以下数据:
(第一部分以 ASCII 编码)
the rest of this message is binaryCRLF
01100110010...
法典:
InputStreamReader isr = new InputStreamReader(socket.getInputStream());
BufferedReader in = new BufferedReader(isr);
String line = in.readLine();
在这一点上,我所期望的是line
包含文本:
此消息的其余部分是二进制的
然后我想使用原始套接字输入流:
InputStream is = socket.getInputStream();
...
以读取消息的二进制部分。
现在,如果 BufferedReader 缓冲了一些二进制数据,
这将是一个问题,因为我会错过部分数据。
我错过了什么吗?
在BufferedReader
源代码中,您将看到默认缓冲区大小为 8192。因此,readLine()
的调用将比第一行的字节数更多的内容读取到缓冲区中。
使用不同的方法。缓冲输入并读取两次。
试试
InputStreamReader isr = new InputStreamReader(socket.getInputStream());
BufferedReader in = new BufferedReader(isr);
String line ="";
String buffer="";
while((buffer= in.readLine()) != null){
line.concat(buffer);
}
这样,直到您在 BufferedReader 中有数据,您将将其读入行中,并且不会丢失任何缓冲数据。干杯。。:)
同样为了更快地 IO,请使用 nio(新输入输出)库,尤其是 ByteBuffer 对象,您还可以在其中使用 flush() 刷新流中的数据。