私は中間記憶装置なしで圧縮された(GZIP)ストリームを読み書きする必要があります。現在、私は執筆のためにSpring RestTemplate
を使用していますが、Apache HTTPクライアントは読み込みを行います(大きなストリームの読み込みにRestTemplate
を使用できない理由については、私の答えhereを参照してください)。実装はかなり簡単です。ここでを応答InputStream
で叩いて移動します。Flux <DataBuffer>を解凍するにはどうすればいいですか?
今、私はSpring 5 WebClient(現状のファンではないから)を使用するように変更したいと思います。しかしながら、WebClient
は性質上反応性であり、Flux<Stuff>
を扱う。私はFlux<DataBuffer>
を得ることができると信じています。ここでDataBufferはByteBuffer
を超える抽象です。質問は、フルストリームをメモリに保存することなく、即座に解凍する方法です(OutOfMemoryError
、私はあなたを見ています)、またはローカルディスクに書き込むことですか?フードの下でWebClient
がNettyを使用することに言及する価値があります。
- リアクタネーティブissue-251も参照してください。
- Springインテグレーションissue-2300に関連すると、
私は自分の研究をしましたが、オンラインで入手できる資料は特に役に立ちませんでした。
compression on java nio direct buffers
Reading a GZIP file from a FileChannel (Java NIO)
(de)compressing files using NIO
Iterable gzip deflate/inflate in Java
データバッファ上で 'asInputStream()'メソッドを使って、 'GZIPInputStream'に入れないだけですか? – vandale
@vandale私はそれに従わない、各 'DataBuffer'は部分だけです、そうですか? 'GZIPInputStream'は完全な' InputStream'で動作するはずです。 'DataBuffer.asInputStream'と' SequenceInputStream'を使って 'InputStream'を再構築する方法がありますが、それは反応的なNIOを使う目的を破るでしょう。 –