我认为不能以读字符串的方式来读ZIP文件,因为ZIP文件是二进制形式的,猜测FileReader读文件内容时碰到不符合字符编码的内容时会抛弃此部份内容,导致错误。
为什么不以字节流的形式读文件?JAVA里面提供了对ZIP文件的直接支持,可以查一下 java.util.zip.ZipInputStream 等类

解决方案 »

  1.   

    请问字节流读取是什么意思,怎么来做?
    zipinputstream是可以,而且,我也用到了,我现在所做的东西是从别的地方传给我的一个经过压缩后的文件,到我这里就被处理成了一个压缩后的字符串了,我要用java.util.zip包来对这个字符串进行解压缩
      

  2.   

    你所说的是指读成bytes[]类型吗
      

  3.   

    你应该用java.util.zip.ZipInputStream和java.util.zip.ZipOutputStream
      

  4.   

    我所写的解压缩的接口接收的是字符串,现在我要测试,所以我得通过读取一个zip文件,把它转化为字符串来模拟进行测试
      

  5.   

    我写的解压缩的方法如下:
    public HashMap DecomByZip(String StrCompress)
      {
        ByteArrayInputStream bais=new ByteArrayInputStream(StrCompress.getBytes());
        BufferedInputStream bis=new BufferedInputStream(bais,BUFFER);
        ZipInputStream zip=new ZipInputStream(bis);
        ZipEntry entry=null;
        HashMap HashFile=new HashMap();
        try
        {
          while ( (entry = zip.getNextEntry()) != null)
          {
              String name=entry.getName().toUpperCase();
              System.out.println(name);
              String strResult=null;
              byte data[] = new byte[BUFFER];
              int count;
              while ((count = zip.read(data, 0, BUFFER))!= -1)
               {
                  strResult+=new String(data,0,count);
               }
               HashFile.put(name,strResult);
          }
          zip.close();    }catch(Exception e)
        {
          System.out.println("Extract error!");
          e.printStackTrace();
        }
        return HashFile;
      }
      

  6.   

    我认为直接将ZIP文件读成字符串会造成数据丢失,因为ZIP是文件内容二进制编码,里面有很多数据无法找到对应UNICODE编码值的字符来表示它,所以会有数据损失。这只是个人观点,未经证实。真要转成字符串可以先读成byte[]然后再转成String了,你试试看会不会有数据损失,只要把String里面内容写入一个文件,然后用UltraEdit或其他工具比对一下看与源文件有没有差异就知道了。
      

  7.   

    我也知道zip是二进制编码,我开始就是读的byte,不行,好象还不如char,反正是都有错误,哪个都不重要了
      

  8.   

    import java.util.zip.*;
    import java.io.*;public class test
    {
        public static void main(String[] arg)
        {
            try
            {
                FileInputStream myReader = new FileInputStream("d:\\data.zip");
                byte[] content = new byte[myReader.available()];
                myReader.read(content);
                FileOutputStream myWriter = new FileOutputStream("d:\\data_2.zip");
                myWriter.write(content);
            }
            catch(Exception e) {}
        }
    }我测试过了,以字节流读出再写入不会有任何问题,两个文件完全一样。
    你现在只是写测试程序,可以先把读byte[]参数的转换函数做好,如果非要用字符串做参数可以再想办法了。
      

  9.   

    import java.util.zip.*;
    import java.io.*;public class test2
    {
        public static void main(String[] arg)
        {
            try
            {
                FileReader myReader = new FileReader("d:\\data.zip");
                int c;
                String content = "";
                while (-1 != (c = myReader.read())){
                 content += (char)c;
                }
                            
                FileOutputStream myWriter = new FileOutputStream("d:\\data_2.zip");
                myWriter.write(content.getBytes());
            }
            catch(Exception e) {}
        }
    }以字符串方式读出文件内容,结果目的文件与源文件内容不符,证明以Reader及其子类去读二进制文件会导致数据丢失。
      

  10.   

    谢谢,我发现开始我为什么用byte不可以了,但这个问题我觉得也好奇怪,我开始用的压缩文件是将两个txt文件进行压缩,里边随便敲了些数字,但都是至少两个以上,刚才我发现,我把那两个txt文件的内容都变成一个数字,结果原来用byte读取然后解压缩就成功了;可是我只要把txt文件的内容加多了,或者改为字母,就会出错,报错为:java.util.zip.ZipException: missing entry name,提示的错误行: while ( (entry = zip.getNextEntry())!= null);不知道你对这方面有经验吗
      

  11.   

    我没使用过ZIP库,等回去看过之后再回答你,下星期再说了,周末休息。