读取zip或jar文件而不先解压缩

时间:2013-09-28 15:10:54

标签: java jar zip bufferedreader bufferedwriter

我不是在寻找任何涉及在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。‡

你可以看到读者或作者添加到文件中,我无法弄清楚原因。再一次,我不希望任何答案告诉我通过条目打开它,我已经知道如何做到这一点,如果有人知道我的问题的答案,请分享。

3 个答案:

答案 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)

查看ZipInputStreamZipOutputStream

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

另见:Standard concise way to copy a file in Java?既然你要复制整个文件,那么它就像zip文件一样没什么特别的