大家好,下面是一段30来行的程序,这段程序运行时会压缩G:/aaa目录下的文件,做成.zip文件输出到JAVA的默认目录,现在的问题是紧可以压缩名字为英文的文件,假如要压缩的文件名为中文就出错,提示找不到文件,请大家帮解答一下。非常感谢
//Zip.java
import java.io.*;
import java.util.zip.*;
public class Zip {
static final int BUFFER = 2048;
public static void main (String argv[]) {
try {
BufferedInputStream origin = null;
FileOutputStream dest = new FileOutputStream("myfigs.zip");
ZipOutputStream out = new ZipOutputStream(new BufferedOutputStream(dest));
//out.setMethod(ZipOutputStream.DEFLATED);
byte data[] = new byte[BUFFER];
// get a list of files from current directory
File f = new File("G:/aaa");
String files[] = f.list();
for (int i=0; i < files.length; i++) {
System.out.println("Adding: "+files[i]);
FileInputStream fi = new FileInputStream((files[i]));
origin = new BufferedInputStream(fi, BUFFER);
ZipEntry entry = new ZipEntry(files[i]);
out.putNextEntry(entry);//void putNextEntry(ZipEntry e)
//开始写入新的 ZIP 文件条目并将流定位到条目数据的开始处。
//如果仍处于活动状态,则关闭当前条目。如果没有为条目指定压缩方法,
//则使用默认的压缩方法;如果没有为条目设置修改时间,则使用当前时间。
int count;
while((count = origin.read(data, 0, BUFFER)) != -1) {
out.write(data, 0, count);
}
origin.close();
}
out.close();
} catch(Exception e) {
e.printStackTrace();
}
}}
//Zip.java
import java.io.*;
import java.util.zip.*;
public class Zip {
static final int BUFFER = 2048;
public static void main (String argv[]) {
try {
BufferedInputStream origin = null;
FileOutputStream dest = new FileOutputStream("myfigs.zip");
ZipOutputStream out = new ZipOutputStream(new BufferedOutputStream(dest));
//out.setMethod(ZipOutputStream.DEFLATED);
byte data[] = new byte[BUFFER];
// get a list of files from current directory
File f = new File("G:/aaa");
String files[] = f.list();
for (int i=0; i < files.length; i++) {
System.out.println("Adding: "+files[i]);
FileInputStream fi = new FileInputStream((files[i]));
origin = new BufferedInputStream(fi, BUFFER);
ZipEntry entry = new ZipEntry(files[i]);
out.putNextEntry(entry);//void putNextEntry(ZipEntry e)
//开始写入新的 ZIP 文件条目并将流定位到条目数据的开始处。
//如果仍处于活动状态,则关闭当前条目。如果没有为条目指定压缩方法,
//则使用默认的压缩方法;如果没有为条目设置修改时间,则使用当前时间。
int count;
while((count = origin.read(data, 0, BUFFER)) != -1) {
out.write(data, 0, count);
}
origin.close();
}
out.close();
} catch(Exception e) {
e.printStackTrace();
}
}}
这行下面加下面几行:
String filestmp[] = new String[files.length];
for(int bb=0;bb<files.length;bb++){
filestmp[bb] = new String(files[bb].getBytes("iso-8859-1"),"gbk");
}
files = filestmp;
手写,看到哪里写错了改一下,但意思是这样就对了
String files[] = f.list();
这行下面加下面几行:
String filestmp[] = new String[files.length];
for(int bb=0;bb<files.length;bb++){
filestmp[bb] = new String(files[bb].getBytes("iso-8859-1"),"gbk");
// filestmp[bb] = new String(files[bb].getBytes("gbk"),"iso-8859-1");
// filestmp[bb] = new String(files[bb].getBytes("utf-8"),"gbk");
// filestmp[bb] = new String(files[bb].getBytes("gbk"),"utf-8");
// filestmp[bb] = new String(files[bb].getBytes("utf-8"),"iso-8859-1");
// filestmp[bb] = new String(files[bb].getBytes("iso-8859-1"),"utf-8");
}
files = filestmp;
把注释一行一行换过,试试
FileInputStream fi = new FileInputStream((files[i]));
这个数组里仅仅是文件名而不是文件的full path
当然找不到文件接分
你的数组只有filename
new FileInputStream("文件名")并不是读取g:\aaa
而是读取应用程序目录下面的文件
---------------------------------------------------
File f = new File("G:/aaa");
////////////这一行修改/////////////
File[] files = f.listFiles();
for (int i=0; i < files.length; i++) {
////////////这一行修改/////////////
System.out.println("Adding: "+files[i].getName());
FileInputStream fi = new FileInputStream((files[i]));
origin = new BufferedInputStream(fi, BUFFER);
////////////这一行修改/////////////
ZipEntry entry = new ZipEntry(files[i].getName());
out.putNextEntry(entry);//void putNextEntry(ZipEntry e)
int count;
while((count = origin.read(data, 0, BUFFER)) != -1) {
out.write(data, 0, count);
}
origin.close();
}
-------------------------------------------
用File而不是通过文件名获取文件,
如果有必要还可用 isFile 确定不是目录才压缩。一般处理文件不要自己拼路径,
很多琐碎的东西。