1

次のコードがあります。私がやりたいことは、メモリのオーバーヘッドを減らすために、BufferedReader から StringBuffer に直接各行を読み込むことです。データ ストリームの最後に到達したら、while ループを終了させたいと思います。

StringBuffer line = new StringBuffer();
        URL url = new URL("a url");
        BufferedReader reader = new BufferedReader(new InputStreamReader(url.openStream()));
                int count = 0;
                while(line.append(reader.readLine()) != null){
                    System.out.println(line.toString());
                    line.delete(0,line.length());
                }

ストリームを正常に読み取りますが、ストリームの最後に到達すると null を返し、ループを終了せずに null を出力し続けます。どれでも

4

3 に答える 3

4

これは基本的に、起こりそうにないことwhile(line.append(reader.readLine()) != null)を言っているのと同じです。while(line.append(reader.readLine()).toString() != null)

あなたが持っているかもしれない他の問題は、null実際に のリテラルに変換されていることStringです"null"。それが「null」を出力している理由です。値は実際にはありませんnull-まだ混乱しています...

代わりに、次のようなものを試してください...

String text = null;
while((text = reader.readLine()) != null){
    line.append(text)
    System.out.println(line.toString());
    line.delete(0,line.length());
}

更新しました

私がここにいる間、あなたは実際には自分自身を何も救っていないことを示唆するかもしれません.

readLineStringに入れているオブジェクトを作成しますStringBuffer。実際にはメモリを節約しているのではなく、プロセスを複雑にしています。

Stringメモリ内に大量のオブジェクトを作成することが本当に心配な場合は、BufferedReader#read(char[])代わりに使用してください。結果の文字配列を に追加しStringBufferます。

また、 への同期アクセスが必要でない限り、代わりにStringBuffer使用してください。より高速です。StringBuilder

于 2013-02-01T00:12:39.820 に答える
1

これは完全に機能します。NUllPointerException をキャッチするだけです

while(line.append(reader.readLine().toString()) != null){ 
于 2013-02-01T00:31:56.623 に答える
0

この for ループで同じことを試すことができます。

for (String line; (line = reader.readLine()) != null;) {
    System.out.println(line); // Or whatever
}
于 2013-02-01T00:13:03.250 に答える