今天在使用nashorn腳本壓縮文件的時(shí)候,壓縮文件后再解壓后看的的文件大小是正確的宦芦,但是在使用md5檢查文件的時(shí)候發(fā)現(xiàn)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代碼翻譯過(guò)來(lái)的,看著似乎沒(méi)啥問(wèn)題睛廊,執(zhí)行也沒(méi)有報(bào)錯(cuò)形真,就是壓縮再解壓后文件就不對(duì)了。
經(jīng)過(guò)仔細(xì)檢查喉前,發(fā)現(xiàn)上面的代碼中fis.read()方法是存在問(wèn)題的没酣,因?yàn)樵贘avaScript中沒(méi)有方法重載,所以在java中讀取的后返回的是讀取的字節(jié)長(zhǎng)度卵迂,但是在JavaScript中就不對(duì)了裕便,它讀取的是一個(gè)字節(jié),返回的是讀取的字節(jié)见咒,知道問(wèn)題有修改代碼如下:
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();
}