问题如下:
我首先通过文件上传取得了一个inputstream,这时如果我直接对这个流进行MD5的话,之后便无法保存文件了,应该是流已经被读取过无法再次读取。
MD5计算用的是apache commons-codec:
String md5 = DigestUtils.md5Hex(inputStream); // 之后无法保存文件
FileUtils.copyInputStreamToFile(inputStream, file); // 无法保存文件
请问有什么办法既能够得到MD5又能够保存文件呢,在只用inputstream的情况下,不要把流读入一个byte数组,我并不知道它多大。
まず、最も簡単な方法は、2 行のコードを結合し、最初にファイルを保存してから、ファイル ストリームを読み取って MD5 を計算することです。
リーリーもちろん、これには同じストリームを 2 回読み取る必要がありますが、これは低炭素で環境に優しいものではありません。
この時点で、DigestUtils のソース コードを見てその起源をたどると、次のことがわかります。
リーリーこれはそれほど高度なテクノロジーではありません。InputStream 全体を長さ 1024 のバイト配列に分割し、それらを 1 つずつ MD5 します。
FileUtils.copyInputStreamToFile ソース コードのトレーサビリティ実装を見てください:
リーリーInputStream を 4096 バイトの配列に分割し、ターゲット ファイルに 1 つずつ書き込む方法についても説明します。
次に、この 2 つを組み合わせるとコードが書きやすくなります。
リーリーinputstream
は 1 回だけ読み取ることができます。まずファイルを保存してから、このファイルのストリームを開いてmd5
を取得します。誰かが SO でこの質問をしました:
http://stackoverflow.com/ques...
このアイデアは、
リーリーByteArrayOutputStream
を使用してまず inputstream の内容を byte[] 配列に入れ、次にByteArrayInputStream
を使用してそれを読み取ることです。md5 計算後の inputStream ポインタが終端を指しているため
保存時に保存するデータがありません
inputStream のマークとリセットを使用すると、ポインタを末尾にポイントしてからマークの位置に戻ることができますが、最初に inputStream を BufferedInputStream 型にラップする必要があります