报找不到文件名,所以报了空指针,想到ant构建文件也有这个功能,换了apache的ant.jar居然解决了中文的问题。
备份下。
�0�2import java.io.BufferedReader
import java.io.File
import java.io.IOException
import java.io.InputStreamReader
import java.util.Enumeration
import org.apache.tools.zip.ZipEntry
import org.apache.tools.zip.ZipFile/*** 读取zip压缩文件中文本的内容
* @author fish*/public class ReadZip {
public static void main(String args[]) {try {String fileName = "D:/workspace/java/src/ReadZip.zip"
//构造ZipFile
ZipFile zf = new ZipFile(new File(fileName))
//返回 ZIP file entries的枚举.
Enumeration<? extends ZipEntry entries = zf.getEntries()
while (entries.hasMoreElements()) {
ZipEntry ze = entries.nextElement()
System.out.println("name:"+ze.getName())
long size = ze.getSize()
if (size 0) {
System.out.println("Length is " + size)
BufferedReader br = new BufferedReader(
new InputStreamReader(zf.getInputStream(ze)))
String line
while ((line = br.readLine()) != null) {
apache自带的zip方法有缺陷,没有做中文的判断的,这个是它的一个已知bug。解决办法:用jdk的rt.jar里面的方法实现就可以了。
可以参考下以下工具类:
import java.io.BufferedInputStream
import java.io.BufferedOutputStream
import java.io.Closeable
import java.io.File
import java.io.FileOutputStream
import java.io.IOException
import java.io.InputStream
import java.util.Enumeration
import java.util.zip.ZipEntry
import java.util.zip.ZipFile
/**
*
* @author gdb
*/
public class ZipUtilAll {
public static final int DEFAULT_BUFSIZE = 1024 * 16
/**
* 解压Zip文件
*
* @param srcZipFile
* @param destDir
* @throws IOException
*/
public static void unZip(File srcZipFile, String destDir) throws IOException
{
ZipFile zipFile = new ZipFile(srcZipFile)
unZip(zipFile, destDir)
}
/**
* 解压Zip文件
*
* @param srcZipFile
* @param destDir
* @throws IOException
*/
public static void unZip(String srcZipFile, String destDir) throws IOException
{
ZipFile zipFile = new ZipFile(srcZipFile)
unZip(zipFile, destDir)
}
/**
* 解压Zip文件
*
* @param zipFile
* @param destDir
* @throws IOException
*/
public static void unZip(ZipFile zipFile, String destDir) throws IOException
{
Enumeration<? extends ZipEntry>entryEnum = zipFile.entries()
ZipEntry entry = null
while (entryEnum.hasMoreElements()) {
entry = entryEnum.nextElement()
File destFile = new File(destDir + entry.getName())
if (entry.isDirectory()) {
destFile.mkdirs()
}
else {
destFile.getParentFile().mkdirs()
InputStream eis = zipFile.getInputStream(entry)
System.out.println(eis.read())
write(eis, destFile)
}
}
}
/**
* 将输入流中的数据写到指定文件
*
* @param inputStream
* @param destFile
*/
public static void write(InputStream inputStream, File destFile) throws IOException
{
BufferedInputStream bufIs = null
BufferedOutputStream bufOs = null
try {
bufIs = new BufferedInputStream(inputStream)
bufOs = new BufferedOutputStream(new FileOutputStream(destFile))
byte[] buf = new byte[DEFAULT_BUFSIZE]
int len = 0
while ((len = bufIs.read(buf, 0, buf.length)) >0) {
bufOs.write(buf, 0, len)
}
} catch (IOException ex) {
throw ex
} finally {
close(bufOs, bufIs)
}
}
/**
* 安全关闭多个流
*
* @param streams
*/
public static void close(Closeable... streams)
{
try {
for (Closeable s : streams) {
if (s != null)
s.close()
}
} catch (IOException ioe) {
ioe.printStackTrace(System.err)
}
}
/**
* @param args
* @throws java.lang.Exception
*/
public static void main(String[] args) throws Exception
{
// unZip(new File(ZipDemo.class.getResource("D:/123/HKRT-B2B.zip").toURI()), "D:/123/")
unZip("D:/123/123.zip", "D:/123/")
// new File()
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)