FileUtils.listFilesAndDirs 的替代方案,不将子项列为单独的文件

Alternative to FileUtils.listFilesAndDirs that does not list children as separate files

我想将其他目录的一个目录打包成一个zip文件。这些其他目录分别包含一个文本文件和一个 PNG 文件。但是,FileUtils.listFilesAndDirs() 列出了这些目录及其子目录,并且在将它们打包成 zip 后,它会打包目录及其子目录,同时还会将子目录的副本打包到 zip 的根目录中。

zip 看起来像这样:

Class1
 -Image1
 -Text1
Class2
 -Image2
 -Text2
Class3
 -Image3
 -Text3

Image1
Text1
Image2
Text2
Image3
Text3

空行后面应该没有文件。是否有任何替代函数可以只列出目录及其子目录,而不单独列出子目录?

在我看来,使用 file/directory 过滤器和 ZipOutputStream 时有些误解。像这样的怎么样?

import java.io.*;
import java.util.Collection;
import java.util.zip.*;

import javax.swing.JPanel;

import org.apache.commons.io.*;
import org.apache.commons.io.filefilter.*;

public class Demo extends JPanel {
  private static final long serialVersionUID = 1L;

  public static void main(String s[]) throws Exception {
    Demo demo = new Demo();
    demo.launch();
  }

  private void launch() throws Exception {
    Collection<File> fs = FileUtils.listFilesAndDirs(new File("/tmp/fakerepo"),
        FileFileFilter.FILE, DirectoryFileFilter.DIRECTORY);
    ZipOutputStream zos = null;
    try {
      zos = new ZipOutputStream(new FileOutputStream("/tmp/test.zip"));
      for (File f : fs) {
        System.out.println(f.getAbsolutePath());
        if (!f.isFile())
          continue;
        ZipEntry ze = new ZipEntry(f.getAbsolutePath());
        zos.putNextEntry(ze);
        InputStream is = null;
        try {
          is = new FileInputStream(f);
          IOUtils.copy(is, zos);
        } finally {
          IOUtils.closeQuietly(is);
        }
      }
      zos.flush();
    } finally {
      IOUtils.closeQuietly(zos);
    }
  }

}