2

このコードを実行すると、Web ページのコンテンツが取得されます。

コンソールに出力するのではなく、その文字列全体を連結したかったのですが、以下のコードの 2 行のコメントを外すと、System.out.println(inputLine);何も出力されません (ただし、下のコメント行では機能しました) と value fileText = null

このエラーはどこから来たのですか?

import java.net.*;
import java.io.*;

public class URLReader {

    public static void main(String[] args) throws Exception {

        URL oracle = new URL("http://www.oracle.com");
        BufferedReader in = new BufferedReader(
        new InputStreamReader(oracle.openStream()));

        String fileText = "";
        String inputLine;
        while ((inputLine = in.readLine()) != null)
            //fileText.concat(inputLine);
            System.out.println(inputLine);
        in.close();
        //System.out.println(fileText);
    }
}
4

7 に答える 7

12

String不変であり、concat()は収集していない新しいものを返しますString(リンクされたドキュメントを確認してください)。

StringBuilderを使用して文字列を効率的に作成し、toString()完了したらそれを呼び出して、結果の文字列を取得する必要があります。

例えば

StringBuilder sb = new StringBuilder();
while (....) {
   sb.append("more string data");
}
String str = sb.toString();

たとえば、追加できますStrings

   str = str + "more string data";

の実装のため、あまり効率的ではありませんString。AStringBuilderは連結を効率的に行うために構築されています。StringBuilder構築しているサイズがわかっている場合は、初期容量を介して調整できStringます。

一部のソースがStringBuffer. これは非常に似ていますが、それは古く、デフォルトでメソッドを同期します。スレッド化されていない環境では無駄が多く、一般的なアドバイスはStringBuilder.

于 2012-08-10T16:17:32.327 に答える
8

String不変オブジェクトです。連結された値を文字列オブジェクトに再割り当てする必要があります。単に呼び出すだけでfileText.concat(inputLine);は、 の値は変更されませんfileText

fileText = fileText.concat(inputLine);

単純に、fileText += inputLine;あまりにもうまくいくはずです。

于 2012-08-10T16:17:59.297 に答える
6

Stringconcatは不変なので、単にaを呼び出しても変更されString ませんString。結果とともにnew が返されます。

代わりに result: を再割り当てfileText = fileText.concat(inputLine);できますが、ループ内にあり、多くの連結を行う可能性があるため、 を使用して連結を行い、からStringBuilderを取得することをお勧めします。StringStringBuilder

于 2012-08-10T16:17:41.423 に答える
4

こんにちは、fileText.concat(String) の戻り値を変数に割り当てる必要があります。あなたの場合、再びfileTextに。あなたのための解決策は次のとおりです。

fileText = fileText.concat(inputLine); 

Java APIをさらに見てください-> http://docs.oracle.com/javase/6/docs/api/index.html?java/lang/String.html

于 2012-08-10T16:17:53.233 に答える
2

Strings は不変です。これはfileText.concat(inputLine);、 の内容を変更しないことを意味しfileTextます。むしろ、concat()メソッドはString期待されるデータで新しいを返します。必要なものを取得するには、この戻り値をキャプチャする必要があります。

于 2012-08-10T16:18:33.060 に答える
1

に変更fileText.concat(inputLine)fileText = fileText.concat(inputLine)ます。

また、初期化String inputLine = null;

于 2012-08-10T16:20:09.887 に答える
1

そこを利用したほうがいいStringBuilderです。何かのようなもの

StringBuilder sb = new StringBuilder();
while (...)
    sb.append(line);

sを繰り返し連結するよりもはるかに効率的ですString

さらに簡単な解決策は、Apache Commons IO ライブラリ、特にIOUtils.toString(InputStream,String)を使用することです。

于 2012-08-10T16:21:38.000 に答える