创建包含文本文件的{zip}文件

时间:2015-07-13 19:02:15

标签: java zip

我一直试图解决这个问题一两天,似乎无法弄清楚如何将文本文件添加到zip文件,我能够弄清楚如何将这些文本文件添加到一个7zip文件非常容易,但是由于某些原因,zip文件在我看来要复杂得多。我想根据用户原因返回一个zip文件btw。

这就是我现在所拥有的: (我知道目前代码不是太干净,我计划在完成裸功能之后解决这个问题)。

private ZipOutputStream addThreadDumpsToZipFile(File file, List<Datapoint<ThreadDump>> allThreadDumps, List<Datapoint<String>> allThreadDumpTextFiles) {
  ZipOutputStream threadDumpsZipFile = null;

  try {
      //creat new zip file which accepts input stream
      //TODO missing step: create text files containing each thread dump then add to zip
      threadDumpsZipFile = new ZipFile(new FileOutputStream(file));
      FileInputStream fileInputStream = null;
      try {
          //add data to each thread dump entry
          for(int i=0; i<allThreadDumpTextFiles.size();i++) {
              //create file for each thread dump
             File threadDumpFile = new File("thread_dump_"+i+".txt");
             FileUtils.writeStringToFile(threadDumpFile,allThreadDumpTextFiles.get(i).toString());

              //add entry/file to zip file (creates block to add input to)
              ZipEntry threadDumpEntry = new ZipEntry("thread_dump_"+i); //might need to add extension here?
              threadDumpsZipFile.putNextEntry(threadDumpEntry);

              //add the content to this entry
              fileInputStream = new FileInputStream(threadDumpFile);
              byte[] byteBuffer = new byte[(int) threadDumpFile.length()]; //see if this sufficiently returns length of data
              int bytesRead = -1;
              while ((bytesRead = fileInputStream.read(byteBuffer)) != -1) {
                  threadDumpsZipFile.write(byteBuffer, 0, bytesRead);
              }
          }
          threadDumpsZipFile.flush();
      } catch (FileNotFoundException e) {
          e.printStackTrace();
      } catch (IOException e) {
          e.printStackTrace();
      } finally {
          try {
              fileInputStream.close();
          } catch(Exception e) {

          }
      }
  } catch (FileNotFoundException e) {
      e.printStackTrace();
  } catch (IOException e) {
      e.printStackTrace();
  }
  return threadDumpsZipFile;

}

您可以猜测,我有一组线程转储,我想添加到我的zip文件并返回给用户。

如果您需要更多信息,请告诉我们! PS:在这个问题中可能存在一些错误,我刚刚通过一些断点意识到threadDumpFile.length()不会真正起作用。

期待您的回复! 谢谢, 阿尔萨

1 个答案:

答案 0 :(得分:0)

这是一个裂缝。我认为您在制作ZipEntry对象时希望保留文件扩展名。看看你是否可以实现以下createTextFiles()功能;剩下的工作 - 我用这个方法来回复单个&#34; test.txt&#34;文件包含一些虚拟数据以进行验证。

void zip()  
{ 
   try {
        FileOutputStream fos = new FileOutputStream("yourZipFile.zip");
        ZipOutputStream zos = new ZipOutputStream(fos);

        File[] textFiles = createTextFiles(); // should be an easy step

        for (int i = 0; i < files.length; i++) {
            addToZipFile(file[i].getName(), zos);
        }
        zos.close();
        fos.close();

    } catch (Exception e) {
        e.printStackTrace();
    } 
}

void addToZipFile(String fileName, ZipOutputStream zos) throws Exception {  
        File file = new File(fileName);
        FileInputStream fis = new FileInputStream(file);
        ZipEntry zipEntry = new ZipEntry(fileName);
        zos.putNextEntry(zipEntry);

        byte[] bytes = new byte[1024];
        int length;
        while ((length = fis.read(bytes)) >= 0) {
            zos.write(bytes, 0, length);
        }
        zos.closeEntry();
        fis.close();
    }