私はHTTPライブラリを使用して、200 MBのサイズのデータを取得しています。次に、データの各行が処理されます。メモリを節約するために、最初に200 MBがすべてダウンロードされるのを待つのではなく、データがストリーミングされるたびに1行ずつデータを処理したいと考えています。Javaの無制限PipedInputStream
は、私が使用していますHTTPライブラリは、私はエフェクト処理中のデータの各チャンクは、それがに来ることができますようように上書きすることができますOnCharReceived(CharBufferのバッファ)のようになります方法を公開しています。
は私がしたいと思います このデータをInputStreamとして公開します。私の最初の考えは、PipedInputStreamとPipedOutputStreamのペアを使用し、OnCharReceived()でPipedOutputStreamとPipedInputStreamから読み込んだスレッドに書き込むことでした。しかし、これは、スレッドのデータが処理されるまでOnCharReceivedで書き込みスレッドをブロックする必要があるため、パイプの基になるバッファがいっぱいになるという問題があります。しかし、OnCharReceivedをブロックすると、httpライブラリのIOスレッドでブロックされている可能性があり、非常に悪いです。
独自のカスタム実装をロールバックせずにここで解決する必要がある抽象的な問題を処理するJavaクラスがあります。私は大きなソリューションの一部として使用できるBlockingQueueのようなものを知っています。しかし、単純な解決策はありますか?
レガシーコードの理由から、私は実際にはInputStreamとして公開されているデータが必要です。
編集:私はPiped[In/Out]putStream
の近くに取得しません簡単な解決策があるのなら、私は、Apache HTTP非同期ライブラリーから、次の例に
あなたは丘陵地帯から山を作っています。本当に本当にそのライブラリを使用する必要があるのであれば、 'URL.openStream()'やそれに相当するライブラリを使用してください。コールバックを使用し、別のスレッドが使用するために* back *をストリームに変換しようとするのは時間と空間を無駄にするだけです。 – EJP
@EJP小さなライブラリーは解読の問題に対処すれば正当化できます。例えば、このライブラリーが提供するAPIと統合する必要がある場合は – Dici
正確に編集してください。そのライブラリはすでに 'InputStream'を公開しています。これを使って。 – EJP