6

BufferedReader と InputStreamReader を使用してストリームから読み込んで、リーダーから作成される 1 つの長い文字列を作成しています。最大で 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

リーダーから作成される 1 つの長い文字列を作成します。

ひょっとして「長い紐」を作るためにこんなことをしていませんか?

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は改行を削除するので、使用しているこのアプローチには欠陥があり、すべてが1行になります。

車輪の再発明ではなく、 FileUtils.readLineToString()を試してみることをお勧めします。 これにより、改行を破棄せずにファイルをSTRingとして効率的に読み取ることができます。

于 2011-10-13T16:23:24.987 に答える