2016-07-19 5 views
1

XMLを使ってRSSフィードを読むためのチュートリアルに従っていました。だから私は、誰かが説明することができます願っています。:(私は非常に視覚的な学習者だと人の教示は言葉でそれを説明しようとしたことを知っているが、悲しいことに、私は理解していなかったしてください。今AndroidでJava Pull Parserを理解しようとする - Java

StringBuilder tempBuffer = new StringBuilder(); 

     try{ 
      URL xmlUrl = new URL(URLPath); 
      HttpURLConnection httpURLConnection = (HttpURLConnection) xmlUrl.openConnection(); 
      int response = httpURLConnection.getResponseCode(); 
      Log.d("Downloaded Data", " Response Code:" + response); 

      InputStream is = httpURLConnection.getInputStream(); 
      InputStreamReader isr = new InputStreamReader(is); 

      int charRead; 
      char[] buffer = new char[500]; 

      while(true){ 

       charRead = isr.read(buffer); 

       if(charRead <= 0){ 
        break; 
       } 


       tempBuffer.append(String.copyValueOf(buffer, 0, charRead)); 

      } 
      return tempBuffer.toString(); 

私が欲しいものストリームの読み込みに関してcharRead = isr.read(バッファ)を実行するとどういう意味ですか?

答えて

0

私はそれを視覚的な例として説明しようとします。

InputStreamは、コンベアベルトが壁の穴(ネットワーク)から出てくると想像してください。コンベアベルトには一連のcharがありますが、コンベアベルトから取り除き、バケツに処理する前に持ち込む必要があります(buffer、これは500 charしか保持できません)。 isr.read(buffer)に電話すると、コンベヤベルトオペレータはコンベアベルトを始動するように指示されます。コンベアベルトが転がり始め、charのオブジェクトをバケツにダンプします(buffer)。コンベヤベルトはB.をバケット(buffer)に500charsダンプ、または

これはどちらか

A.まで続くコンベヤベルトは、壁(ネットワーク)の穴から出てくるcharsの不足します。

コードの行:

if(charRead <= 0){ 
    break; 
} 

は何も壁に穴から出てきていない場合、ボタンがボタンを押して停止し、ループを終了するために押されたときにコンベヤベルトに指示。

コードの行:

tempBuffer.append(String.copyValueOf(buffer, 0, charRead)); 

は、コンベアベルトは、どちらか500 charsはバケツに捨ててしまったり、コンベヤベルトはcharsを使い果たしたので、移動を停止した後、彼は(やっているものを停止するには、コンベヤベルトのオペレーターに伝えます)、バケツにあるもの(buffer)をすべて取り出し、のの量を取り出す。基本的に、これはバケツに入っているすべてです。はコンベアベルトから出てきたバケツに入ったcharsの数であることがわかっていますので、charReadcharsをバケツから取ると、これらはStringBuilderに追加され、ループが再び開始されます。

0

これは、最大500バイト(バッファの長さ)をストリームから取り出し、バッファに格納します。charReadは、実際に読み取られた文字の数です。データの待機量に応じて、0から500までの任意の数です。エラー。

+0

OKay。あなたが言ったことから、すべてのコードは、ストリームから500文字を取り出し、それをバッファ配列に入れて、charReadに割り当てて、読み込まれた文字数がゼロになるまでストリームを終了するまで続けます。この場合、ループが完了してから再起動すると、バッファにはすでに値が設定されていませんか?私はバッファの目的について混乱していると思う。 – Ridhwaan

+0

バッファには最後に読み取った結果が格納されます。したがって、500バイトで読み込み、処理してから、次の500で読み込み、ストリームが完了するまで処理します。だから、ループの最上部には既にバッファ変数が設定されていますが、既に使用しているデータで上書きされても構いません。新しいバッファを割り当てない理由は効率です。このループは迅速に反復され、割り当ては遅くなる可能性があります。 –