java - 如何计算Inputstream的MD5
黄舟
黄舟 2017-04-18 09:55:55
0
4
991

问题如下:

我首先通过文件上传取得了一个inputstream,这时如果我直接对这个流进行MD5的话,之后便无法保存文件了,应该是流已经被读取过无法再次读取。

MD5计算用的是apache commons-codec:
String md5 = DigestUtils.md5Hex(inputStream); // 之后无法保存文件
FileUtils.copyInputStreamToFile(inputStream, file); // 无法保存文件

请问有什么办法既能够得到MD5又能够保存文件呢,在只用inputstream的情况下,不要把流读入一个byte数组,我并不知道它多大。

黄舟
黄舟

人生最曼妙的风景,竟是内心的淡定与从容!

모든 응답(4)
黄舟

우선 가장 간단한 방법은 두 줄의 코드를 결합하고 먼저 파일을 저장한 다음 파일 스트림을 읽어 MD5를 계산하는 것입니다.

으아악

물론 이를 위해서는 동일한 스트림을 두 번 읽어야 하는데 이는 저탄소 및 환경 친화적이지 않습니다.

이 시점에서 DigestUtils 소스 코드를 보고 그 출처를 추적하면 다음을 확인할 수 있습니다.

으아악

매우 진보된 기술은 아니며, 전체 입력 스트림을 길이 1024의 바이트 배열과 MD5로 하나씩 분할하는 것입니다.

FileUtils.copyInputStreamToFile 소스 코드의 추적성 구현을 살펴보세요.

으아악

InputStream을 4096바이트 배열로 분할하여 대상 파일에 하나씩 쓰는 방법도 설명합니다.

그러면 두 가지를 결합하면 코드 작성이 더 쉬워집니다.

으아악
大家讲道理

inputstream은 한 번만 읽을 수 있습니다. 먼저 파일을 저장한 다음 이 파일의 스트림을 열어 md5을 가져옵니다.

左手右手慢动作

누군가 SO에서 이 질문을 했습니다:
http://stackoverflow.com/ques...

ByteArrayOutputStream을 사용하여 먼저 입력 스트림의 내용을 byte[] 배열에 넣은 다음 ByteArrayInputStream을 사용하여 읽는 아이디어입니다.

으아악
迷茫

md5 계산 후 inputStream의 포인터가 이미 끝을 가리키고 있습니다
그래서 저장할 때 저장할 데이터가 없습니다

inputStream의 표시 및 재설정을 사용하면 포인터를 끝으로 가리킨 다음 표시 위치로 돌아갈 수 있지만 먼저 inputStream을 BufferedInputStream 유형으로 래핑해야 합니다

최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿