0

私は Java ライブラリについてよく知っているので、一見単純に見えることをストリームで実行する簡単な方法がないことに気付いたときは驚きました。マルチパート フォーム データを含む HTTP リクエストを読み込もうとしています (大きな複数行のトークンは、たとえば のような区切り記号で区切られています------WebKitFormBoundary5GlahTkFmhDfanAn--)、特定の名前を持つリクエストの一部に遭遇するまで読みたいと思っています。その部分の InputStream を返します。

ストリームをメモリに読み込んで を返すだけで問題ありByteArrayInputStreamません。送信されるファイルは 1MB を超えてはならないからです。ただし、ファイルが 1MB を超える場合に読み取りメソッドが例外をスローすることを確認して、大きすぎるファイルが JVM のメモリをいっぱいにしてサーバーをクラッシュさせないようにしたいと考えています。ファイル データはバイナリである可能性があるため、除外されますBufferedReader.readLine()(改行が削除されます。改行は\r、 、\n、またはのいずれかであり、\r\nデータが失われます)。

などの明らかなトークン化ソリューションはすべて、トークンをストリームではなく sScannerとして読み取ります。これにより、大きなファイルの s が発生する可能性があります。まさに私が回避しようとしているものです。私が知る限り、各トークンをメモリに読み込まずにとして返すのと同等のものはありません。私が欠けているものはありますか、それとも、ストリームを一度に 1 文字ずつ読み取る必要のない標準の Java ライブラリ ( Apache Commons などはありません)だけを使用して、自分でそのようなものを作成する方法はありますか?トークンをスキャンするコードをすべて自分で作成しますか?StringOutOfMemoryErrorScannerInputStream


補遺:これを投稿する少し前に、元の問題に対する明らかな解決策は、リクエストの本文全体をメモリに読み込み、大きすぎる場合は失敗するだけであることに気付きましByteArrayInputStreamScanner。これは非効率的ですが、機能します。InputStreamただし、サブストリームをメモリに読み込まず、余分なライブラリを使用せず、文字ごとの処理に頼らずにサブストリームにトークン化する方法があるかどうかを知りたいと思っています。

4

1 に答える 1

0

それらをメモリにロードするか(望ましくないソリューション)、ディスクに保存しないと(I / Oが重くなります)、それは不可能です。ストリームをメモリにロードせずに個別のストリームにトークン化することは、ストリームを読み取って (トークン化するために) 後で再度読み取ることができることを意味します。要するに、ストリームがシーク可能でない限り、あなたが望むことは不可能ですが、これらは一般に、非常に特定のアプリケーションや特殊な I/O オブジェクトに特化したストリームですRandomAccessFile

于 2013-07-10T02:03:50.137 に答える