私は Java ライブラリについてよく知っているので、一見単純に見えることをストリームで実行する簡単な方法がないことに気付いたときは驚きました。マルチパート フォーム データを含む HTTP リクエストを読み込もうとしています (大きな複数行のトークンは、たとえば のような区切り記号で区切られています------WebKitFormBoundary5GlahTkFmhDfanAn--
)、特定の名前を持つリクエストの一部に遭遇するまで読みたいと思っています。その部分の InputStream を返します。
ストリームをメモリに読み込んで を返すだけで問題ありByteArrayInputStream
ません。送信されるファイルは 1MB を超えてはならないからです。ただし、ファイルが 1MB を超える場合に読み取りメソッドが例外をスローすることを確認して、大きすぎるファイルが JVM のメモリをいっぱいにしてサーバーをクラッシュさせないようにしたいと考えています。ファイル データはバイナリである可能性があるため、除外されますBufferedReader.readLine()
(改行が削除されます。改行は\r
、 、\n
、またはのいずれかであり、\r\n
データが失われます)。
などの明らかなトークン化ソリューションはすべて、トークンをストリームではなく sScanner
として読み取ります。これにより、大きなファイルの s が発生する可能性があります。まさに私が回避しようとしているものです。私が知る限り、各トークンをメモリに読み込まずにとして返すのと同等のものはありません。私が欠けているものはありますか、それとも、ストリームを一度に 1 文字ずつ読み取る必要のない標準の Java ライブラリ ( Apache Commons などはありません)だけを使用して、自分でそのようなものを作成する方法はありますか?トークンをスキャンするコードをすべて自分で作成しますか?String
OutOfMemoryError
Scanner
InputStream
補遺:これを投稿する少し前に、元の問題に対する明らかな解決策は、リクエストの本文全体をメモリに読み込み、大きすぎる場合は失敗するだけであることに気付きましByteArrayInputStream
たScanner
。これは非効率的ですが、機能します。InputStream
ただし、サブストリームをメモリに読み込まず、余分なライブラリを使用せず、文字ごとの処理に頼らずにサブストリームにトークン化する方法があるかどうかを知りたいと思っています。