皮皮网

皮皮网

【购物海报源码下载】【netty线程池源码解析】【鸿蒙源码编译错误】ioutils源码

时间:2024-11-19 02:38:59 分类:综合

1.如何计算Inputstream的MD5
2.ioutils.tostring会close吗
3.java.lang.UnsupportedClassVersionError: URLCat:Unsupported major.minor version 51.0

ioutils源码

如何计算Inputstream的MD5

       é¦–先,最简单的方式就是把你的两行代码结合起来,先保存文件,再读取文件流计算MD5:

       public static String copyInputStreamToFileAndGetMd5Hex(InputStream inputStream,购物海报源码下载 File file) throws IOException {

        FileUtils.copyInputStreamToFile(inputStream, file);

        return DigestUtils.md5Hex(new FileInputStream(file));

       }

       å½“然这样做要对同一个流读取两次,显得不够低碳环保。

       æ­¤æ—¶å¯ä»¥çœ‹ä¸‹DigestUtils源码,追其根溯其源可以看到:

        public static MessageDigest updateDigest(final MessageDigest digest, final InputStream data) throws IOException {

        final byte[] buffer = new byte[STREAM_BUFFER_LENGTH];

        int read = data.read(buffer, 0, STREAM_BUFFER_LENGTH);

        while (read > -1) {

        digest.update(buffer, 0, read);

        read = data.read(buffer, 0, STREAM_BUFFER_LENGTH);

        }

        return digest;

        }

       ä¹Ÿä¸æ˜¯å¤šé«˜çº§çš„技术,就是把整个InputStream拆成长度的字节数组逐个MD5。

       å†çœ‹çœ‹FileUtils.copyInputStreamToFile源码的追根溯源实现:

       public static long copyLarge(InputStream input, OutputStream output, byte[] buffer) throws IOException {

        long count;

        int n;

        for(count = 0L; -1 != (n = input.read(buffer)); count += (long)n) {

        output.write(buffer, 0, n);

        }

        return count;

        }

       åŒæ ·ä¹Ÿæ˜¯è®²InputStream拆成的字节数组,逐个写到目标文件中。

       é‚£ä¹ˆï¼Œä¸¤è€…结合起来代码也就好写了:

        public static String copyInputStreamToFileAndGetMd5Hex(InputStream inputStream, File file) throws IOException {

        MessageDigest digest = DigestUtils.getMd5Digest();

        FileOutputStream outputStream = null;

        try {

        outputStream = new FileOutputStream(file);

        byte[] buffer = new byte[];

        int read = inputStream.read(buffer);

        while (read > -1) {

        // 计算MD5,顺便写到文件

        digest.update(buffer, 0, read);

        outputStream.write(buffer, 0, read);

        read = inputStream.read(buffer);

        }

        } finally {

        IOUtils.closeQuietly(outputStream);

        }

        return Hex.encodeHexString(digest.digest());

        }

ioutils.tostring会close吗

       æºä»£ç æ²¡æœ‰ä½“现出来,但是实际调用完ioutils.tostring,后流是关闭了,再次调用的时候会报错

java.lang.UnsupportedClassVersionError: URLCat:Unsupported major.minor version .0

       å®ƒçš„意思是说,程序编译的时候用了一个较高版本的JDK,但是在程序运行的时候却用了一个较低版本的jdk。我在eclipse里面先用jdk1.7将程序跑了一遍,然后用jdk1.6跑程序就会出现上述的错误,原因就是在用jdk1.7跑了程序没有问题,这时候在工程的bin目录下面就产生了相应于jdk1.7的class文件,下次再用jdk1.6跑这个工程,由于class文件是有jdk1.7产生的,所以程序跑不通也不足为奇! 解决的方法就是在第一次跑这个工程的时候用用较低版本的jdk,然后再用较高版本的jdk跑或者是一直用较高版本的jdk跑。也就是JDK较高版本兼容较低版本、但是较低版本却是无法完成较高版本的功能。这也是符合逻辑的。