BufferedReader and Sockets in java



>假设我正在使用这样的套接字输入流,以便读取以下数据:
(第一部分以 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() 刷新流中的数据。

最新更新