大家看一下,我学习JAVA中使用ZIP压缩文件时,如是文件中含有文字,将来无论打开压缩包还是解压缩出来的文件,汉字都不能显示,变为%&×¥%#等等。大家帮我看看,什么问题。
源程序:
import java.io.*;
import java.util.zip.*;
import java.util.*;
class ZipCompress{
public static void main(String[] args) throws IOException{
FileOutputStream f=new FileOutStream("test.zip);
CheckedOutputStream csum=new CheckedOutputStream(f,new Adle32());
BufferedOutputStream out=new BufferedOutputStream(csum);
int c;
for(int i=0;i<args.length;i++){
BufferedReader br=new BufferedReader(new FileReader(args[i]));
out.putNextEntry(new ZipEntry(args[i]));
while((c=br.read())!=-1)
out.write(c);
br.close();
}
out.close();
}
}
源程序:
import java.io.*;
import java.util.zip.*;
import java.util.*;
class ZipCompress{
public static void main(String[] args) throws IOException{
FileOutputStream f=new FileOutStream("test.zip);
CheckedOutputStream csum=new CheckedOutputStream(f,new Adle32());
BufferedOutputStream out=new BufferedOutputStream(csum);
int c;
for(int i=0;i<args.length;i++){
BufferedReader br=new BufferedReader(new FileReader(args[i]));
out.putNextEntry(new ZipEntry(args[i]));
while((c=br.read())!=-1)
out.write(c);
br.close();
}
out.close();
}
}
解决方案 »
- java票据打印得问题
- 这个jsp 和bean 大家帮忙看看 ,该怎么做。谢谢了 关于使用javabean 对数据库进行增加、修改和 删除操作的问题
- 写了个队列类出错,请各位csdn高手进来指点一下,兄弟24在线等!!!!!!!
- hql 关于 oracle 翻页的问题. 急急急!!!!!!!!!!!!!!!!!!!!!!!!
- 送分题来了,在线等,先来先得,见者有份。
- 菜鸟问题 新手上路 请帮忙 急!
- 关于方法的烦恼
- MS的JDBC连接多实例的SQLSERVER2000,连接url应该怎么写?急
- 内部类问题---再线等待
- Java中有不有与VB中Replace函数功能类似的函数?
- SOS!!!JAVA中的一个解压缩问题
- 在JAVA类中如何调用带有输出参数的存储过程。好了绝对给分,立即。
1.FileOutputStream f=new FileOutStream("test.zip);FileOutStream少了put
2.test.zip少了半个引号
3.putNextEntry()这个方法只有ZipOutputStream类才有的,BufferedOutputStream 类没有这个方法.
你的程序,这个是我修改过后正确的
package test;import java.io.*;
import java.util.zip.*;/**
* <p>Title: </p>
* <p>Description: </p>
* <p>Copyright: Copyright (c) 2005</p>
* <p>Company: </p>
* @author not attributable
* @version 1.0
*/public class ZipCompress1 {
public static void main(String[] args) {
FileOutputStream f = null;
try {
f = new FileOutputStream("d:\\temp\\out.zip");
}
catch (FileNotFoundException ex) {
}
CheckedOutputStream csum = new CheckedOutputStream(f, new Adler32());
//BufferedOutputStream out = new BufferedOutputStream(csum);
ZipOutputStream out = new ZipOutputStream(f);
int c;
for (int i = 0; i < args.length; i++) {
BufferedReader br = null;
try {
br = new BufferedReader(new FileReader(args[i]));
out.putNextEntry(new ZipEntry(args[i]));
while ( (c = br.read()) != -1) {
System.out.println("args[i]="+args[i]);
out.write(c);
}
br.close();
out.close();
}
catch (Exception ex1) {
} } }}
不过用这样的方式我创建了一个压缩文件打不开!
以下是我写的一个程序你参考一下:package test;import java.io.IOException;
import java.io.*;
import java.util.zip.*;
import java.util.*;/**
* <p>Title: </p>
* <p>Description: </p>
* <p>Copyright: Copyright (c) 2005</p>
* <p>Company: </p>
* @author not attributable
* @version 1.0
*/public class ZipCompress {
/**
* 测试运行
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
ZipCompress zip = new ZipCompress();
try {
zip.testCreateZip();
}
catch (Exception ex) {
ex.printStackTrace();
}
} /**
* 取得指定目录下的所有文件列表,包括子目录.
* @param baseDir File 指定的目录
* @return 包含java.io.File的List
*/
private List getSubFiles(File baseDir) {
List ret = new ArrayList();
File[] tmp = baseDir.listFiles();
for (int i = 0; i < tmp.length; i++) {
if (tmp[i].isFile()) {
ret.add(tmp[i]);
}
if (tmp[i].isDirectory()) {
ret.addAll(getSubFiles(tmp[i]));
}
}
return ret;
} /**
* zip压缩功能测试.
* 将d:\\temp\\zipout目录下的所有文件连同子目录压缩到d:\\temp\\out.zip.
* @throws Exception
*/
public void testCreateZip() throws Exception {
//压缩baseDir下所有文件,包括子目录
String baseDir = "d:\\temp\\zipout";
List fileList = getSubFiles(new File(baseDir)); //压缩文件名
ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(
"d:\\temp\\out.zip")); ZipEntry ze = null;
byte[] buf = new byte[1024];
int readLen = 0;
for (int i = 0; i < fileList.size(); i++) {
File f = (File) fileList.get(i);
System.out.print("Adding: " + f.getPath() + f.getName()); //创建一个ZipEntry,并设置Name和其它的一些属性
ze = new ZipEntry(getAbsFileName(baseDir, f));
ze.setSize(f.length());
ze.setTime(f.lastModified()); //将ZipEntry加到zos中,再写入实际的文件内容
zos.putNextEntry(ze);
InputStream is = new BufferedInputStream(new FileInputStream(f));
while ( (readLen = is.read(buf, 0, 1024)) != -1) {
zos.write(buf, 0, readLen);
}
is.close();
System.out.println(" done...");
}
zos.close();
} /**
* 给定根目录,返回另一个文件名的相对路径,用于zip文件中的路径.
* @param baseDir java.lang.String 根目录
* @param realFileName java.io.File 实际的文件名
* @return 相对文件名
*/
private String getAbsFileName(String baseDir, File realFileName) {
File real = realFileName;
File base = new File(baseDir);
String ret = real.getName();
while (true) {
real = real.getParentFile();
if (real == null) {
break;
}
if (real.equals(base)) {
break;
}
else {
ret = real.getName() + "/" + ret;
}
}
return ret;
}}
Jbuild9,JDK1.5.5
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipOutputStream;public class ZipCompress2 {
/**
* 测试运行
*
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
ZipCompress2 zip = new ZipCompress2();
try {
zip.testCreateZip();
} catch (Exception ex) {
ex.printStackTrace();
}
} /**
* 取得指定目录下的所有文件列表,包括子目录.
*
* @param baseDir
* File 指定的目录
* @return 包含java.io.File的List
*/
private List getSubFiles(File baseDir) {
List ret = new ArrayList();
File[] tmp = baseDir.listFiles();
for (int i = 0; i < tmp.length; i++) {
if (tmp[i].isFile()) {
ret.add(tmp[i]);
}
if (tmp[i].isDirectory()) {
ret.addAll(getSubFiles(tmp[i]));
}
}
return ret;
} /**
* zip压缩功能测试. 将d:\\temp\\temp目录下的所有文件连同子目录压缩到d:\\temp\\out.zip.
*
* @throws Exception
*/
public void testCreateZip() throws Exception {
// 压缩baseDir下所有文件,包括子目录
String baseDir = "d:\\temp\\temp";
List fileList = getSubFiles(new File(baseDir));
System.out.println("fileList=" + fileList);
// 压缩文件名
ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(
"d:\\temp\\out.zip")); ZipEntry ze = null;
byte[] buf = new byte[1024];
int readLen = 0;
for (int i = 0; i < fileList.size(); i++) {
File f = (File) fileList.get(i);
// 创建一个ZipEntry,并设置Name和其它的一些属性
ze = new ZipEntry(getAbsFileName(baseDir, f));
ze.setSize(f.length());
ze.setTime(f.lastModified());
System.out.print("Adding: " + f.getPath() + " " + ze); // 将ZipEntry加到zos中,再写入实际的文件内容
zos.putNextEntry(ze);
InputStream is = new BufferedInputStream(new FileInputStream(f));
while ((readLen = is.read(buf, 0, 1024)) != -1) {
zos.write(buf, 0, readLen);
}
is.close();
System.out.println(" done...");
}
zos.close();
} /**
* 给定根目录,返回另一个文件名的相对路径,用于zip文件中的路径.
*
* @param baseDir
* java.lang.String 根目录
* @param realFileName
* java.io.File 实际的文件名
* @return 相对文件名
*/
private String getAbsFileName(String baseDir, File realFileName) {
File real = realFileName;
File base = new File(baseDir);
String ret = real.getName();
while (true) {
real = real.getParentFile();
if (real == null) {
break;
}
if (real.equals(base)) {
break;
} else {
ret = real.getName() + "/" + ret;
}
}
return ret;
}}