我不是在寻找任何涉及在zip输入或输出流中打开zip文件的答案。我的问题是,java中是否可以像任何其他文件一样简单地打开一个jar文件(使用缓冲的读取器/写入器),读取它的内容,然后将它们写在其他地方?例如:
import java.io.*;
public class zipReader {
public static void main(String[] args){
BufferedReader br = new BufferedReader(new FileReader((System.getProperty("user.home").replaceAll("\\\\", "/") + "/Desktop/foo.zip")));
BufferedWriter bw = new BufferedWriter(new FileWriter((System.getProperty("user.home").replaceAll("\\\\", "/") + "/Desktop/baf.zip")));
char[] ch = new char[180000];
while(br.read(ch) > 0){
bw.write(ch);
bw.flush();
}
br.close();
bw.close();
}
}
这适用于一些小的zip / jar文件,但大多数时候只会破坏它们,因此无法解压缩或执行它们。我发现将char []的大小设置为1不会破坏文件,只会破坏文件中的所有内容,这意味着我可以在归档程序中打开该文件,但所有条目都将被破坏且无法使用。有谁知道如何编写上面的代码,所以它不会破坏文件?另外这里是一个jar文件中的一行我测试了它就被破坏了:
NENAG¾Þ§
V
-O - ????,‰9³“AM·P> A0„ èwåÕüaEÜμp‡aæOùR‰(?JºJ'êgžè*”6ftöãÝÈ-E @qïc3âi,AZ ...¹¿Êð) v键¢CA>有。E” G~(†®9öCçM€ÔÙÆC†NY×OK Y-¥úûFs‡
vs the original:
nèñàG¾Þ§
V
-O - ,‰9³'ÀM·P> A0„ èwåÕüaEÜμp‡aæOùR‰(JºJ'êgžè*?”6ftöãÝÈ-E @qïc3âi,AZ ...¹¿Êð)V¢CA> E” G~(†®9öCçM€ÔÙÆC†NY×oký-¥úûFs。‡
你可以看到读者或作者添加到文件中,我无法弄清楚原因。再一次,我不希望任何答案告诉我通过条目打开它,我已经知道如何做到这一点,如果有人知道我的问题的答案,请分享。
答案 0 :(得分:2)
为什么要将二进制数据转换为字符?我认为使用字节数组的InputStream / OutputStream要好得多。见http://www.javapractices.com/topic/TopicAction.do?Id=245 例如。
答案 1 :(得分:1)
bw.write(ch)
将写入整个数组。阅读只会填写一些,并返回一个数字告诉你多少。这与zip文件无关,只与IO的工作方式有关。
您需要将代码更改为:
int charsRead = br.read(buffer);
if (charsRead >= 0) {
bw.write(buffer, 0, charsRead);
} else {
// whatever I do at the end.
}
但是,这只是你问题的1/2。您还将字节转换为字符并再次返回,这将以其他方式破坏数据。坚持溪流。
答案 2 :(得分:0)
查看ZipInputStream和ZipOutputStream类
编辑:使用普通的FileInputStream和FileOutputStream。我怀疑当读者将字节解释为字符时可能会出现一些问题。
另见:Standard concise way to copy a file in Java?既然你要复制整个文件,那么它就像zip文件一样没什么特别的