2017-05-09 32 views
0

我正尝试读取大量的数据(消息),我从服务器获取的数据(我没有)。我正在使用BufferedReader对象,函数readLine()是因为我收到的消息包含换行符(\ n)。如何在处理海量数据时使用BufferedReader

  1. 我有一个线程读取消息并将消息保存到消息框中。
  2. 我有轮询从消息框中的消息(我有 线程同步)第二线程

这是第一个线程的代码的一部分:

 while(!isInterrupted()) 
     {     
     if((line = input_reader.readLine()) != null) 
     { 
      Util.offer_message(message_box, line); 
     } 
     } 

我已被告知由一位支持程序员(他在拥有服务器的公司工作)使用readLine()从套接字读取消息,使我经常丢失数据。

无论如何,我无法真正验证我是否会丢失数据(因为我没有拥有服务器)。

所以我的问题是:

  1. 是关于经常丢失,因为数据的海量数据的程序员吗?
  2. 如果他这样做,那我该如何处理呢?我应该使用像read(char cbuf [],int off,int len)函数然后分离消息吗?

如果需要了解我的问题,我可以提供一些更多的细节。

Thx帮助。

+0

[tag:datainputstream]与此无关,但[tag:bufferedreader]的确如此。 – EJP

+0

@ close-voter太宽?离开它。这是一个非常具体的问题。 – EJP

回答

1

程序员是否因为海量数据而定期丢失数据?

首先,应用程序丢失数据?如果是这样,这个代码肯定不会发生。如果他以这个借口告诉你不要使用BufferedReader.readLine(),他就是疯了。或者,我们应该说,误导了。或者你误解了他。

如果他这样做,那我该如何处理呢?我应该使用像read(char cbuf [],int off,int len)函数然后分离消息吗?

号码没有什么不对,readLine()。这正是它所做的,但没有你一开始就会遇到的bug。

但我没有看到你的两个线程的重点。我会失去他们中的一个,并排队,直接在你想要的时候读线。

注意:您忽略了流结束。如果readLine()返回null,则应退出循环并关闭套接字。

+0

前几天应用程序丢失了一条消息,所以这就是为什么我跟他说话的原因(以前从未发生过)。这可能是一个误解。此外,我想了解一些事情。如果我失去了我的一个线程,然后我只是阅读消息并立即“处理”它们,它不会使缓冲区溢出?因为我不是一直读新消息并清空这个缓冲区,而是花费CPU时间来处理消息,只有当我读到另一个消息时。无论如何Thx为最后的答案和NB – DeSpeaker

+0

什么缓冲区将溢出?如果你的阅读速度不够快,发件人就会失速。这比你现在的代码会发生什么更可取,这是因为你的内部队列会填满内存并可能导致读线程崩溃。 – EJP

相关问题