utf-8的编码写zip文件

时间:2023-01-05 10:15:04
是这样的 
我现在有个下载地址 
我通过这个地址去获取连接 以便获取文件流 下载下来是一个压缩文件 (zip)但是 对方可能是gbk的格式写入的
而我们现在要求已utf格式将内容写入

有如下几个疑问
1,我要在获取流写入文件的时候以 utf-8的编码写入么?
2,然后我要再读取文件的时候以utf-8的编码读取么?
3,再通过connect获得getOutputStream的时候  然后通过 ZipOutputStream 最后通过BufferedWriter写入文件
   最后在读取文件的时候 用 ZipIntputStream 报错 说 只有需要一个文件实例
向大家请教了

13 个解决方案

#1


人家是GBK的你当然要用GBK的读。

#2


引用 1 楼 magong 的回复:
人家是GBK的你当然要用GBK的读。


那么到utf-8的呢

#3


要统一一下吧,怎么一个用gbk,一个用utf-8,不然转一下吧
不管是什么格式,先转成iso-8859-1,再拼成utf-8.
new String(gbk.getByte("iso-8859-1"),"utf-8");

#4


引用 2 楼 cheniqit1 的回复:
那么到utf-8的呢

写的时候,用UTF-8就行了,如

ZipOutputStream zos = new ZipOutputStream(new FileOutputStream("utf8.zip"));
OutputStreamWriter osw = new OutputStreamWriter(zos, "UTF-8");
ZipEntry outEntry = new ZipEntry("utf8.txt"); 
zos.putNextEntry(outEntry);
osw.write("中文");
osw.flush();
zos.closeEntry();
zos.close();

#5


反馈下吧  3楼 你的回答肯定是有问题的 这样的一转 肯定转出乱码来

#6


引用 5 楼 cheniqit1 的回复:
反馈下吧  3楼 你的回答肯定是有问题的 这样的一转 肯定转出乱码来


没验证过的代码我是不会贴出来的。
LZ问题如果仍未解决,不妨贴点代码我来看看。

#7


String encoding = "UTF-8";
     ZipInputStream zipIn = new ZipInputStream(new FileInputStream(new File("c:/20112414092458.rar")));
     BufferedReader br = new BufferedReader(new InputStreamReader(zipIn));
     ZipOutputStream zipout = new ZipOutputStream(new FileOutputStream("c:/zip.rar"));
     OutputStreamWriter bos =
     new OutputStreamWriter(zipout, encoding);
     ZipEntry outEntry = zipIn.getNextEntry();
     String line = null;
     while(outEntry != null){
       while((line = br.readLine()) != null){
       bos.write(line);
       System.out.println(line);
       }
       zipout.putNextEntry(outEntry);
       outEntry = zipIn.getNextEntry();
     }
     bos.flush();
     zipIn.close();
     br.close();
     bos.close();



zipout.putNextEntry(outEntry);这行报错 什么原因?

Exception in thread "main" java.util.zip.ZipException: invalid entry size (expected 331 but got 0 bytes)

#8


Zip流是根本不存在UTF-8或者GBK的编码的,这里的编码只可能是里面的文本文件才会有


有如下几个疑问
1,我要在获取流写入文件的时候以 utf-8的编码写入么?
不应该使用任何的Reader,只能使用InputStream,所以根本不存在编码格式

2,然后我要再读取文件的时候以utf-8的编码读取么?
通过ZipInputStream,再读取里面的文件时,可以使用new InputStreamReader(zip, "UTF-8")来读取Zip文件中的文本文件(但是注意不要关闭这个Reader,只能通过zip.closeEntry()关闭


3,再通过connect获得getOutputStream的时候 然后通过 ZipOutputStream 最后通过BufferedWriter写入文件
  最后在读取文件的时候 用 ZipIntputStream 报错 说 只有需要一个文件实例

如果别人提供一个下载链接,正常来说你只应调用里面的getInputStream。
总的来说,我看不明白你这个问题 ^_^,但是如果是解析别人提供的下载流,可以是
new ZipInputStream(conn.getInputStream);


然后你写入本地硬盘时就new ZipOutputStream(new FileOutputStream(...)),如果你是一个Servlet返回到浏览器,则new ZipOutputStream(response.getOutputStream());

#9


没写过压缩包··纯属顶贴··

#10


引用 7 楼 cheniqit1 的回复:
Java code
String encoding = "UTF-8";
        ZipInputStream zipIn = new ZipInputStream(new FileInputStream(new File("c:/20112414092458.rar")));
        BufferedReader br = new BufferedReader(new Inp……


这个错误我已经找到 
zipout.putNextEntry(outEntry); 把这句写到 第一个while 后面就可以了
但是我写是写成功了 但是为什么写到一个文件中去了呢? 其他的就为空文件了

#11


bos.flush();这个必须放在while循环中,在 zipout.putNextEntry(outEntry);之前

#12


引用 9 楼 cenhuineng 的回复:
没写过压缩包··纯属顶贴··

+1

#13


bos.flush();这个必须放在while循环中,在 zipout.putNextEntry(outEntry);之前 

#1


人家是GBK的你当然要用GBK的读。

#2


引用 1 楼 magong 的回复:
人家是GBK的你当然要用GBK的读。


那么到utf-8的呢

#3


要统一一下吧,怎么一个用gbk,一个用utf-8,不然转一下吧
不管是什么格式,先转成iso-8859-1,再拼成utf-8.
new String(gbk.getByte("iso-8859-1"),"utf-8");

#4


引用 2 楼 cheniqit1 的回复:
那么到utf-8的呢

写的时候,用UTF-8就行了,如

ZipOutputStream zos = new ZipOutputStream(new FileOutputStream("utf8.zip"));
OutputStreamWriter osw = new OutputStreamWriter(zos, "UTF-8");
ZipEntry outEntry = new ZipEntry("utf8.txt"); 
zos.putNextEntry(outEntry);
osw.write("中文");
osw.flush();
zos.closeEntry();
zos.close();

#5


反馈下吧  3楼 你的回答肯定是有问题的 这样的一转 肯定转出乱码来

#6


引用 5 楼 cheniqit1 的回复:
反馈下吧  3楼 你的回答肯定是有问题的 这样的一转 肯定转出乱码来


没验证过的代码我是不会贴出来的。
LZ问题如果仍未解决,不妨贴点代码我来看看。

#7


String encoding = "UTF-8";
     ZipInputStream zipIn = new ZipInputStream(new FileInputStream(new File("c:/20112414092458.rar")));
     BufferedReader br = new BufferedReader(new InputStreamReader(zipIn));
     ZipOutputStream zipout = new ZipOutputStream(new FileOutputStream("c:/zip.rar"));
     OutputStreamWriter bos =
     new OutputStreamWriter(zipout, encoding);
     ZipEntry outEntry = zipIn.getNextEntry();
     String line = null;
     while(outEntry != null){
       while((line = br.readLine()) != null){
       bos.write(line);
       System.out.println(line);
       }
       zipout.putNextEntry(outEntry);
       outEntry = zipIn.getNextEntry();
     }
     bos.flush();
     zipIn.close();
     br.close();
     bos.close();



zipout.putNextEntry(outEntry);这行报错 什么原因?

Exception in thread "main" java.util.zip.ZipException: invalid entry size (expected 331 but got 0 bytes)

#8


Zip流是根本不存在UTF-8或者GBK的编码的,这里的编码只可能是里面的文本文件才会有


有如下几个疑问
1,我要在获取流写入文件的时候以 utf-8的编码写入么?
不应该使用任何的Reader,只能使用InputStream,所以根本不存在编码格式

2,然后我要再读取文件的时候以utf-8的编码读取么?
通过ZipInputStream,再读取里面的文件时,可以使用new InputStreamReader(zip, "UTF-8")来读取Zip文件中的文本文件(但是注意不要关闭这个Reader,只能通过zip.closeEntry()关闭


3,再通过connect获得getOutputStream的时候 然后通过 ZipOutputStream 最后通过BufferedWriter写入文件
  最后在读取文件的时候 用 ZipIntputStream 报错 说 只有需要一个文件实例

如果别人提供一个下载链接,正常来说你只应调用里面的getInputStream。
总的来说,我看不明白你这个问题 ^_^,但是如果是解析别人提供的下载流,可以是
new ZipInputStream(conn.getInputStream);


然后你写入本地硬盘时就new ZipOutputStream(new FileOutputStream(...)),如果你是一个Servlet返回到浏览器,则new ZipOutputStream(response.getOutputStream());

#9


没写过压缩包··纯属顶贴··

#10


引用 7 楼 cheniqit1 的回复:
Java code
String encoding = "UTF-8";
        ZipInputStream zipIn = new ZipInputStream(new FileInputStream(new File("c:/20112414092458.rar")));
        BufferedReader br = new BufferedReader(new Inp……


这个错误我已经找到 
zipout.putNextEntry(outEntry); 把这句写到 第一个while 后面就可以了
但是我写是写成功了 但是为什么写到一个文件中去了呢? 其他的就为空文件了

#11


bos.flush();这个必须放在while循环中,在 zipout.putNextEntry(outEntry);之前

#12


引用 9 楼 cenhuineng 的回复:
没写过压缩包··纯属顶贴··

+1

#13


bos.flush();这个必须放在while循环中,在 zipout.putNextEntry(outEntry);之前