0

我不是在寻找任何涉及在 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 文件中的一行,我对此进行了测试,该文件已损坏:

nèñà?G¾Þ§ V¨ö—‚?‰9³'?ÀM·p›a0„èwåÕüaEܵp‡aæOùR‰(JºJ´êgžè*?”6ftöãÝÈ—ê@qïc3âi,áž...¹¿Êð)V¢cã>Ê”G˜ (†®9öCçM?€ÔÙÆC†ÑÝ×ok?ý—¥úûFs.‡</p>

对比原版:

nèñàG¾Þ§ V¨ö—‚‰9³'ÀM·p›a0„èwåÕüaEܵp‡aæOùR‰(JºJ´êgžè*?”6ftöãÝÈ—ê@qïc3âi,áž...¹¿Êð)V¢cã>Ê”G˜(†®9öCçM €ÔÙÆC†ÑÝ×oký—¥úûFs.‡</p>

正如您所看到的,读者或作者都将?添加到文件中,我不知道为什么。同样,我不希望任何答案告诉我逐个打开它,我已经知道该怎么做,如果有人知道我的问题的答案,请分享。

4

3 回答 3

2

为什么要将二进制数据转换为字符?我认为使用字节数组输入流/输出流会好得多。有关示例,请参见http://www.javapractices.com/topic/TopicAction.do?Id=245

于 2013-09-28T15:29:20.603 回答
1

bw.write(ch)将写入整个数组。Read 只会填写其中的一部分,并返回一个告诉您多少的数字。这与 zip 文件无关,仅与 IO 的工作方式有关。

你需要改变你的代码看起来更像:

 int charsRead = br.read(buffer);
 if (charsRead >= 0) {
       bw.write(buffer, 0, charsRead);
 } else {
       // whatever I do at the end.
 }

但是,这只是您问题的 1/2。您还将字节转换为字符并再次转换回来,这将以其他方式破坏数据。坚持流。

于 2013-09-28T15:13:07.580 回答
0

查看ZipInputStreamZipOutputStream

编辑:使用普通的 FileInputStream 和 FileOutputStream。我怀疑当读者将字节解释为字符时可能会出现一些问题。

另请参阅:用 Java 复制文件的标准简洁方法?由于您要复制整个文件,因此它是一个 zip 文件并没有什么特别之处

于 2013-09-28T15:17:18.453 回答