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

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

丢了幸福的猪 发布于 2021-12-01 字数 1471 浏览 725 回复 7

/**

* 压缩多个文件

*
@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; 

这样有什么办法没?

如果你对这篇文章有疑问,欢迎到本站 社区 发帖提问或使用手Q扫描下方二维码加群参与讨论,获取更多帮助。

扫码加入群聊

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(7

韬韬不绝 2021-12-01 7 楼

引用来自“甘薯”的评论

以下代码已测试通过无误

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();
    		}


    		}

孤独患者 2021-12-01 6 楼

中文乱码 jdk自带的那个不能指定编码方式修改源代码太麻烦 jdk自带的是使用utf-8编码  你可以尝试使用 apache compress

终遇你 2021-12-01 5 楼

c 这里只是个长度吧。 然后底层会把这个转为2进制的,byte。这里应该文件都小了很多吧

半世蒼涼 2021-12-01 4 楼

一个txt文件,我压缩它之后,在压缩包里打开看,文件内容就成乱码了

谢绝鈎搭 2021-12-01 3 楼

没看懂楼主的意思, 乱码是什么文件, 解压缩出来的成了乱码?还是zip文件本身是乱码?

浮生未歇 2021-12-01 2 楼

打开文件流时,指定和文件系统、或者文件内容编码相对应的字符集,特别是在使用Reader的场合。压缩的方式应该是二进制的,这样的场合下,不要使用Reader的子类,应使用BufferedInputStream,或者直接使用InputStream

飘然心甜 2021-12-01 1 楼

以下代码已测试通过无误

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();
    		}


    		}