基于Java的源文件数据测试研究

2017-03-11 01:41赵景惠
网络安全技术与应用 2017年5期
关键词:乱码文件名源代码

◆赵景惠

(北京交通大学经济管理学院 北京 100044)

基于Java的源文件数据测试研究

◆赵景惠

(北京交通大学经济管理学院 北京 100044)

本文在讨论实现zip数据压缩常用类后,针对JDK提供的ZIP包在压缩中文文件时出现的乱码问题,提出了修改ZIP包源代码和利用Ant包两个解决乱码问题的方法,最后利用Ant包实现了一个压缩中文文件夹的类,其压缩时间和压缩比介于winrar和winzip之间,该压缩方法有一定的实用价值。

Java;Ant;winrar;winzip;ZIP算法;文件压缩

0 引言

Java在文件压缩和解压方面 Java提供了两种最常用的压缩算法GZIP和ZIP。GZIP算法相对简单且没有ZIP算法使用范围广,下面主要讨论ZIP算法。

1 zip数据压缩常用类

Java 1.7实现了I/O数据流与网络数据流的单一接口,因此数据的压缩、网络传输和解压缩的实现比较容易。一个zip文件由多个entry组成,每个entry有一个唯一的名称,entry的数据项存储压缩数据。实现 zip数据压缩两个主要 Java类是 ZipEntry和ZipOutputStream。

(1)类ZipEntry:

public ZipEntry(String name); name为指定的数据项名。(2)类ZipOutputStream:

ZipOutputStream实现了zip压缩文件的写输出流,支持压缩和非压缩 entry。对于要加入压缩档的每一个文件,都必须调用putNextEntry(),并将其传递给一个ZipEntry对象。ZipEntry对象包含了一个功能全面的接口,使用它可以获得和设置Zip文件内那个特定的 Entry(入口)上能够接受的所有数据:名字、压缩后和压缩前的长度、日期、CRC校验和、额外字段的数据、注释、压缩方法,以及它是否为一个目录入口等[1]。

2 压缩中文名称的文件

在Java应用程序中,对文字的编码是以unicode为基础的,压缩的文件名,也是以unicode来编码的,然而,在现今市面上的大部分压缩软件,比如winzip、winrar等,不支持unicode的编码方式,因而用Java软件压缩后的中文文件名显示出来是乱码。要解决在压缩中文文件时出现的乱码问题,可通过以下两种方式解决。

2.1 修改ZIP包源代码

对文件的压缩是通过ZipOutputStream类来完成,通过修改这两个类的编码方式,可以对中文文件名进行处理[2]。

从JDK的src.zip取得ZipOutputStream.java源代码(通常在JDK的安装目录下),另存为CNZipOutputStream.java。修改源代码如下。

public CNZipOutputStream(OutputStream out,String encoding){

super(out,new Deflater(Deflater.DEFAULT_COMPRESSION,true));

usesDefaultDeflater=true;

this.encoding=encoding;

}

byte[] nameBytes=null;

try{

if(this.encoding.toUpperCase().equals(“UTF-8”))

nameBytes=getUTF8Bytes(e.name);

else

nameBytes= e.name.getBytes(this.encoding);

}

catch(Exception byteE){

nameBytes=getUTF8Bytes(e.name);

}

2.2 利用ant包实现myzip类

也可以利用开源的Apache项目提供的ant包来压缩中文名称的文件,下载URL地址为http://ant.apache.org/,下载ant源文件apache-ant-1.7.0-src.zip,解压后在Ant的org包里有实现zip算法的全部java源文件,利用import org.apache.tools.zip.*命令导入这些类文件即可。Ant包提供的ZIP压缩类解决了压缩中文名称文件时的乱码问题。以下为用ant包实现的类myzip的过程,利用myzip类的类方法zipFile即可实现中文文件夹的压缩[3]。

import org.apache.tools.zip.*;

import java.io.*;

public class myzip {

public static void zipFile(String inputFileName , String zipFileName) throws Exception {

File zipFileSrc=new File(inputFileName);

ZipOutputStream out = new ZipOutputStream(new FileOutputStream(zipFileName));

zip(out, zipFileSrc, "");

}

private void zip(ZipOutputStream out, File f, String base) throws Exception {

if (f.isDirectory()) {

File[] fl = f.listFiles();

for (int i = 0; i 〈 fl.length; i++) {zip(out, fl[i], base + fl[i].getName());}

}else {

out.putNextEntry(new ZipEntry(base));

FileInputStream fin = new FileInputStream(f);

while ((num=fin.read(buf))!=-1){out.write(buf,0,num);}

fin.close();

} } }

3 测试和结论

通过在微机上文件压缩测试,得出本文利用Java编写的压缩程序myzip同winzip和winrar在压缩时间和压缩后尺寸的数据,通过比较发现myzip和winzip、winrar的压缩比基本接近,但myzip的时间消耗多于winzip和winrar。综合来看,myzip的性能接近winrar和winzip,在winrar和winzip程序代码未开源的情况下它还是有一定的实用价值。

[1]汪晓平,俞俊,李功.精通Java网络编程[M].北京:清华大学出版社,2010.

[2]袁海燕,王文涛.Java实用程序设计100例[M].北京:人民邮电出版社,2015.

[3]张军丽.Java中文件压缩的实现[J].池州师专学报,2005.

猜你喜欢
乱码文件名源代码
基于TXL的源代码插桩技术研究
对症下药解决多种乱码难题
这些真的不是乱码,是汉字
右键调用多重更名更方便
Excel轻松提取文件名
把我的秘密藏起来
软件源代码非公知性司法鉴定方法探析
基于语法和语义结合的源代码精确搜索方法
揭秘龙湖产品“源代码”
炫迈:用神奇乱码勾引你视线