2

HttpURLConnectionを使用してWebページのコンテンツを取得するAndroidプログラムを作成しています。私はJavaとAndroidの両方に不慣れです。

問題は次のとおりです。リーダーはページソース全体を読み取りますが、最後の反復では、最後の部分のstringBufferに追加されません。

debbugerを使用して、最後のループ反復で文字列バフが作成されることを確認しましたが、stringBufferはそれを追加しません。

取得したコンテンツを解析する必要があります。文字列を使用するよりも、解析のためにコンテンツを処理するためのより良い方法はありますか?Javaの文字列サイズは、使用可能なヒープサイズによってのみ制限されることを他の多くのサイトで読んだことがあります。私もStringBuilderを試してみました。

何が問題になるのかは誰でも知っています。ところで、コードの改善を提案してください。

ありがとう!

URL u;
    try {
        u = new URL("http://feeds.timesonline.co.uk/c/32313/f/440134/index.rss");
        HttpURLConnection c = (HttpURLConnection) u.openConnection();
        c.setRequestProperty("User-agent","Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; InfoPath.1; .NET CLR 2.0.50727)");
        c.setRequestMethod("GET");
        c.setDoOutput(true);
       c.setReadTimeout(3000);
          c.connect();
        StringBuffer stringBuffer = new StringBuffer("");
        InputStream in = c.getInputStream();
        InputStreamReader inp = new InputStreamReader(in);
        BufferedReader reader = new BufferedReader(inp);
        char[] buffer = new char[3072];
        int len1 = 0;
        while ( (len1 = reader.read(buffer)) != -1 ) 
        {
            String buff = new String(buffer,0,len1);
            stringBuffer.append(buff);
        }
        String stranica = new String(stringBuffer);
        c.disconnect();
        reader.close();
        inp.close();
        in.close();
4

2 に答える 2

1

より単純な実装を使用することをお勧めします。または、特にパターンHttpClientを使用して、を使用してデータを取得するように切り替えます。ResponseHandler

于 2010-05-22T17:58:57.673 に答える
1

J2SEとAndroidの両方でコードをテストし、正常に動作しました。J2SEの結果を比較するために、いくつかの行を追加しました。

System.out.println("ITERATIONS: " + iterations);
System.out.println("LEN: " + stranica.length());
System.out.println("LAST 50 chars: "
        + stranica.substring(stranica.length() - 50, stranica
                .length()));

FileWriter fw = new FileWriter("/tmp/tmp-j2se.txt");
fw.write(stranica);
fw.close();

そしてAndroid:

System.out.println("ITERATIONS: " + iterations);
System.out.println("LEN: " + stranica.length());
System.out.println("LAST 50 chars: "
        + stranica.substring(stranica.length() - 50, stranica
                .length()));

FileOutputStream fos = openFileOutput("tmp-and.txt",
        Context.MODE_WORLD_READABLE | Context.MODE_WORLD_WRITEABLE);

System.out.println(getFileStreamPath("tmp-and.txt")
        .getAbsolutePath());

fos.write(stranica.getBytes());
fos.close();

私は両方のファイルを比較し、同一でしたが、私を困惑させたのは、両方のプラットフォームでStringによって返される長さが一致しなかったことです。

J2SE:

レン:22479

アンドロイド:

05-22 20:28:22.733:INFO / System.out(455):LEN:22433

ただし、Androidプラットフォームで取得されたファイルのサイズも22479バイトの長さでした。さらなる調査なしで私が見つけることができる唯一の説明は、いくつかのエンコーディング(おそらく行/終了)変換が透過的に行われているということです。

質問のポイントに戻ると、コードは正しいように見えます(そして証明されています)。どのAndroidプラットフォームバージョン/ハードウェアでコードをテストしていますか?

于 2010-05-22T18:42:29.450 に答える