我正在使用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();
提前致谢
答案 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读取,而不会有效地丢弃换行符。