Readline太慢 - 什么更快?

时间:2011-10-13 15:19:08

标签: java xml servlets bufferedreader inputstreamreader

我正在使用BufferedReader和InputStreamReader从流中读取,以创建一个从读者创建的长字符串。它最多可达100,000行,然后抛出500错误(服务器上的调用失败)。我不确定是什么问题,有什么比这个方法更快?它的工作线路数千,但我正在使用大型数据集。

BufferedReader in = new BufferedReader(new InputStreamReader(newConnect.getInputStream()));
String inputLine;               
String xmlObject = "";
StringBuffer str = new StringBuffer();

while ((inputLine = in.readLine()) != null) {
    str.append(inputLine);
    str.toString();
}       
in.close();

提前致谢

2 个答案:

答案 0 :(得分:8)

  

创建一个从读者创建的长字符串。

你有没有机会这样做来创造你的“长串”?

String string;
while(...) 
 string+=whateverComesFromTheSocket;

如果是,则将其更改为

StringBuilder str = new StringBuilder(); //Edit:Just changed StringBuffer to StringBuilder
while(...)
 str.append(whateverComesFromTheSocket);
String string = str.toString(); 

字符串对象是不可变的,当你执行str + =“something”时,将重新分配内存并将str +“something”复制到新分配的区域。这是一项代价高昂的操作,运行51,000次是一件非常糟糕的事情。

StringBuffer和StringBuilder是String的可变兄弟和StringBuilder,非并发比StringBuffer更有效。

答案 1 :(得分:3)

readline()读取速度大约为90 MB / s,它对数据读取的速度很慢。 BTW readline删除了换行符,因此您使用的这种方法存在缺陷,因为它会将每个转换为一行。

我建议你试试FileUtils.readLineToString()而不是重新发明轮子 这将把文件作为STring读取,而不会有效地丢弃换行符。