4

経由HttpURLConnectionでサーバーに http get 要求を行い、応答 ( ) を 2 回読み取る必要がありInputStreamます。ログの目的と応答の解析のためです。返されるのは、マーキングをサポートしていないInputStraemインスタンスです( return )。org.apache.harmony.luni.internal.net.www.protocol.http.ChunkedInputStreamis.markSupported()false

したがってmark()reset()ストリーミングできず、ログに応答を書き込んだ後、解析できません。もちろん、応答を一度Stringまたは別のものに読み取り、ログに記録して後で解析することもできます。しかし、ストリームで作業しているときは、ストリームOutOfMemomryErrorが私の代わりにバッファリングを処理するため、潜在的に回避しています。

この場合、ストリームを使用する利点を維持し、ログへの同時記録と応答の解析という望ましい結果を達成するのに役立つ最適なソリューションは何ですか?

編集:一時ファイルに応答を書き込むソリューションは適切ではありません

4

3 に答える 3

4

私が完全に理解しているかどうかはわかりませんが、InputStream1回読みたいと思います(実際には2回ではなく、少し汚れたIMOです。解析しているストリームではなくログストリームでのみエラーが発生した場合はどうなるでしょうか?)そして、単に同じものをログに記録して解析しInputStreamますか?

上記の場合は、解決策を表示するために疑似的にここに当てはまります。

InputStream is=...;
byte[] bytes=new byte[1028];
while(is.read(bytes)!=-1) {
log(bytes); //call function to log
parse(bytes);//call function to parse
}

同時にログと記録を行うには、両方のメソッドに対して新しいThread/を作成し、それらを開始して ( )Runnableを使用して戻るのを待つことをお勧めします。thread.join();

InputStream is=...;
byte[] bytes=new byte[1028];
while(is.read(bytes)!=-1) {
Thread t1=new Thread(new Runnable() {
        @Override
        public void run() {
          log(bytes); //call function to log
        }
    });
Thread t2=new Thread(new Runnable() {
        @Override
        public void run() {
           parse(bytes);//call function to parse
        }
    });
     t1.start();
     t2.start();
try {
     t1.join();
     t2.join();
    }catch(Exception ex) {
      ex.printStackTrace();
    }
}
于 2012-09-18T08:48:06.890 に答える
2

入力ストリームを 2 回読み取る必要はありません。読みながらログに記録します。

于 2012-09-18T08:57:57.163 に答える
0

ストリームの潜在的なサイズが事前にわからない場合 (または大きすぎて aStringや aに入れることができない場合byte[])、 の を使用しInputStreamHttpURLConnectionログを記録します (必要に応じて別のファイルに記録する可能性があります)。解析目的でログ ファイルを使用します。

これはおそらく最も効率的な複製方法ではありませんが、InputStreamメモリに関して最も安全な方法の 1 つです。

于 2012-09-18T08:44:59.107 に答える