2

Javaネットワーク入力ストリームでは、なぜこれを行うことが推奨されないのですか?

 PdfReader localPdfReader = new PdfReader(item.getinputStream());

アイテムがFileItemクライアントからアップロードされた場所。代わりに、これをお勧めします。

ByteArrayOutputStream output = new ByteArrayOutputStream();
IOUtils.copy(item.getInputStream(), output);

2つの違いは何ですか?
編集
ここのinputstreamはネットワークストリームだからだとわかりました。したがって、バイトが読み取られると、それ以上読み取ることはできません。したがって、使用する前にメモリ(IOUtils)にコピーする必要があります。私の質問は、メモリにコピーしている間、ストリームをバイトごとに読み取る必要があるということです。では、なぜ入力ストリームがそこで閉じられないのでしょうか。

4

3 に答える 3

1

Java のストリームはデコレータ パターンを使用します。ストリームをラップする (装飾する) ことにより、ストリームに機能を追加するために使用されます。私のお気に入りは、圧縮を追加するために , のGZipStream周りを使用することです。FileStream

于 2012-05-09T06:34:53.157 に答える
1

違いはReader と Inputstreamだと思います。あなたの例では、PDFドキュメントはバイナリデータであり、文字ごとではなくバイトごとに転送する必要があります。Reader と InputStream の詳細については、同じフォーラムのこのリンクを確認してください。リーダーによるストリームのラッピングについて言及されていましたが、バイナリ データについて前述したように、これはお勧めできません。

編集:1

Reader と InputStream の read メソッドの動作を確認してみましょう

Reader.read() 0 から 65535 の範囲の整数 (単一の 16 ビット Unicode 文字) を返します

InputStream.read() データのバイト (8 ビットの符号付き 2 の補数整数) を返します

ここで、Reader を使用してバイナリ データ (8 ビット整数のシーケンス) を読み取ると、1 バイト (8*2) が文字であると仮定して読み取る代わりに、2 バイト (8*2) を読み取ることになると想像してください。

のコードを見たことが PdfReaderないので、 を使用しているかどうかはわかりませんjava.io.Reader。この説明は完全に のためのものjava.io.Reader/InputStreamです。PdfReaderあなたが言及した方法で使用された場合、良くないという リンクまたは投稿を共有していただければ幸いです。

編集:2

覚えて:

  1. ネットワークから、ストリーム バイトを一度だけ読み取ることができます。
  2. 複数のタスクでこれらのバイトが必要な場合は、それらのバイトを配列に格納し、同じ配列を複数回使用することをお勧めします

使用する場合

PdfReader localPdfReader = new PdfReader(item.getinputStream());

次に、PdfReader はストリームからバイトを内部的に読み取り、それを使用して検証します。今後の使用のために保存することはありません。

使用する場合

IOUtils

バイトをネットワークからバイト配列にコピーし、後でそれPdfReaderを JDBC 呼び出しで使用して DB に格納します。

于 2012-05-09T06:35:54.907 に答える
1

代わりにこれをお勧めします

誰のおすすめ?なんで?1997 年以降、Oracle や Sun のドキュメントでそのような記述を見たことはありません。

データを複数回読み取る必要がある場合など、特定の状況で推奨される場合があります。このような状況は非常にまれです。

于 2012-05-12T00:20:52.367 に答える