今天在使用nashorn脚本压缩文件的时候,压缩文件后再解压后看的的文件大小是正确的,但是在使用md5检查文件的时候发现md5码却不一样,下面是最初的压缩文件代码

load('nashorn:mozilla_compat.js');
importPackage(Packages.java.io);
importPackage(Packages.java.util);
importPackage(Packages.java.util.zip);

function compressFile(sourceFile, targetFile) {
    var fos = new FileOutputStream(targetFile);
    var zipOut = new ZipOutputStream(fos);

    var fileToZip = new File(sourceFile);
    var fis = new FileInputStream(fileToZip);
    var zipEntry = new ZipEntry(fileToZip.getName());
    zipOut.putNextEntry(zipEntry);

    var bytes = [];
    bytes.length = 1024;
    var length = 0;
    while ((length = fis.read(bytes, 0, 1024)) > 0) {
        zipOut.write(bytes, 0, length);
    }

    fis.close();
    zipOut.closeEntry();
    zipOut.finish();
    zipOut.close();
    fos.close();
}

上面的代码最初是从工作正常的java代码翻译过来的,看着似乎没啥问题,执行也没有报错,就是压缩再解压后文件就不对了。

经过仔细检查,发现上面的代码中fis.read()方法是存在问题的,因为在JavaScript中没有方法重载,所以在java中读取的后返回的是读取的字节长度,但是在JavaScript中就不对了,它读取的是一个字节,返回的是读取的字节,知道问题有修改代码如下:

load('nashorn:mozilla_compat.js');
importPackage(Packages.java.io);
importPackage(Packages.java.util);
importPackage(Packages.java.util.zip);

function compressFile(sourceFile, targetFile) {
    var fos = new FileOutputStream(targetFile);
    var zipOut = new ZipOutputStream(fos);

    var fileToZip = new File(sourceFile);
    var fis = new FileInputStream(fileToZip);
    var zipEntry = new ZipEntry(fileToZip.getName());
    zipOut.putNextEntry(zipEntry);

    var bufferSize = 1024;
    var buffer = [];
    var c = 0;
    while ((c = fis.read()) != -1) {
        buffer.push(c);
        if (buffer.length == bufferSize) {
            zipOut.write(buffer, 0, buffer.length);
            zipOut.flush();
            buffer = [];
        }
    }
    zipOut.write(buffer, 0, buffer.length);
    zipOut.flush();

    fis.close();
    zipOut.closeEntry();
    zipOut.finish();
    zipOut.close();
    fos.close();
}
Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐