6

我正在使用 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();

提前致谢

4

2 回答 2

9

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

您是否有机会这样做来创建您的“长字符串”?

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 更高效。

于 2011-10-13T15:23:06.283 回答
3

readline() 可以以大约 90 MB/s 的速度读取,这是您对数据读取速度缓慢所做的事情。顺便说一句,readline 删除了换行符,因此您使用的这种方法存在缺陷,因为它会将所有内容都变成一行。

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

于 2011-10-13T16:23:24.987 回答