java压缩文件内后是乱码,怎么办

ooooooooosc 发布于 2015/06/08 17:39
阅读 557
收藏 0
/**
* 压缩多个文件
* @param filePath[] 文件路径数组
* @param targetFilePath 压缩后文件路径
*/
public static void createZipMoreFile(String filePath[],
String targetFilePath) {
try {
FileOutputStream fos = new FileOutputStream(targetFilePath);
CheckedOutputStream cos = new CheckedOutputStream(fos, new CRC32());
ZipOutputStream zos = new ZipOutputStream(new BufferedOutputStream(
cos));

for (int i = 0; i < filePath.length; i++) {
// 逐个将文件写入到br,然后再逐个从br读到压缩文件中。
BufferedReader br = new BufferedReader(new FileReader(
filePath[i]));
filePath[i] = filePath[i].replaceAll("\\\\", "/");
zos.putNextEntry(new ZipEntry(filePath[i].substring(filePath[i]
.lastIndexOf("/") + 1)));
int c;
while ((c = br.read()) != -1)
zos.write(c);
br.close();
}
zos.close();


} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}


}





代码贴出来了,另外我引用的jar包是import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream; 


这样有什么办法没?


加载中
0
甘薯
甘薯

以下代码已测试通过无误

try {
    		FileOutputStream fos = new FileOutputStream(targetFilePath);
    		CheckedOutputStream cos = new CheckedOutputStream(fos, new CRC32());
    		ZipOutputStream zos = new ZipOutputStream(new BufferedOutputStream(
    		cos));

    		for (int i = 0; i < filePath.length; i++) {
	    		// 逐个将文件写入到br,然后再逐个从br读到压缩文件中。
	//    		BufferedReader br = new BufferedReader(new FileReader(
	//    		filePath[i]));
	    		FileInputStream br = new FileInputStream(new File(
	    		"c:\\test\\" + filePath[i]));
	    		
	    		filePath[i] = filePath[i].replaceAll("\\\\", "/");
	    		zos.putNextEntry(new ZipEntry(filePath[i].substring(filePath[i]
	    		.lastIndexOf("/") + 1)));
	//    		int c;
	    		byte[] b = new byte[1024];
	    		int len = 0;
	    		while ((len = br.read(b)) != -1)  {
	    				
	    			//.re.read()) != -1)
	    			byte [] c = b;
	    			
	    			if (len != b.length) {
	    				c = Arrays.copyOf(b, len);
	    			}
	
	    			zos.write(c);
	    		}
    			br.close();
    		}
	    	zos.close();
    		

    		} catch (Exception e) {
    		// TODO Auto-generated catch block
    		e.printStackTrace();
    		}


    		}



0
仪山湖
仪山湖
打开文件流时,指定和文件系统、或者文件内容编码相对应的字符集,特别是在使用Reader的场合。压缩的方式应该是二进制的,这样的场合下,不要使用Reader的子类,应使用BufferedInputStream,或者直接使用InputStream
0
甘薯
甘薯
没看懂楼主的意思, 乱码是什么文件, 解压缩出来的成了乱码?还是zip文件本身是乱码?
ooooooooosc
ooooooooosc
一个txt文件,我压缩它之后,在压缩包里打开看,文件内容就成乱码了
0
hibegin
hibegin
c 这里只是个长度吧。 然后底层会把这个转为2进制的,byte。这里应该文件都小了很多吧
0
骑乌龟捉鱼
骑乌龟捉鱼
中文乱码 jdk自带的那个不能指定编码方式修改源代码太麻烦 jdk自带的是使用utf-8编码  你可以尝试使用 apache compress
0
ooooooooosc
ooooooooosc

引用来自“甘薯”的评论

以下代码已测试通过无误

try {
    		FileOutputStream fos = new FileOutputStream(targetFilePath);
    		CheckedOutputStream cos = new CheckedOutputStream(fos, new CRC32());
    		ZipOutputStream zos = new ZipOutputStream(new BufferedOutputStream(
    		cos));

    		for (int i = 0; i < filePath.length; i++) {
	    		// 逐个将文件写入到br,然后再逐个从br读到压缩文件中。
	//    		BufferedReader br = new BufferedReader(new FileReader(
	//    		filePath[i]));
	    		FileInputStream br = new FileInputStream(new File(
	    		"c:\\test\\" + filePath[i]));
	    		
	    		filePath[i] = filePath[i].replaceAll("\\\\", "/");
	    		zos.putNextEntry(new ZipEntry(filePath[i].substring(filePath[i]
	    		.lastIndexOf("/") + 1)));
	//    		int c;
	    		byte[] b = new byte[1024];
	    		int len = 0;
	    		while ((len = br.read(b)) != -1)  {
	    				
	    			//.re.read()) != -1)
	    			byte [] c = b;
	    			
	    			if (len != b.length) {
	    				c = Arrays.copyOf(b, len);
	    			}
	
	    			zos.write(c);
	    		}
    			br.close();
    		}
	    	zos.close();
    		

    		} catch (Exception e) {
    		// TODO Auto-generated catch block
    		e.printStackTrace();
    		}


    		}



还是用FileInputStream吧
返回顶部
顶部