3

在我的项目中,我有resources一个内部目录my_directorymy_directory包含文本文件。

我想循环这个目录:

URL resource = Resources.class.getResource("/my_directory");
File directory = new File(resource.getPath());
Collection<File> files = FileUtils.listFiles(directory, new String[]{"txt"}, true);

files集合包含所有.txt文件。

如果我在调试器中运行这个项目,效果很好。但是,如果我将项目构建到jar文件中,则会出现错误:

java.lang.IllegalArgumentException: Parameter 'directory' is not a directory

directory文件路径为:

/home/hsz/.../lib/my_project.jar!/my_directory

如何FileUtils在资源目录上使用 Apache?

4

2 回答 2

0

当文件/目录捆绑在 .jar 文件中时,它们不再被视为File对象。可以通过获取它们的输入流来读取它们,例如

InputStream input = getClass().getResourceAsStream("my_directory/file");

我建议您将包含文件的文件夹保留在文件系统中并进行您想要执行的操作。有什么理由,您想在这些操作之前将它们捆绑到一个罐子中。

根据以下问题的答案,在 Java 7 中,您可以从 JAR (zip) 文件创建一个 FileSystem,然后使用 NIO 的目录遍历和过滤机制来搜索它。这将使编写处理 JAR 和“爆炸”目录的代码变得更容易。你可以试试!

于 2014-06-26T15:38:04.260 回答
0
URL url = Resources.class.getResource("/my_directory");
URI uri = url.toURI();
if (uri.getScheme().equals("jar")) {
    // parse JAR file name
    String jarPath = uri.toString().replaceFirst("jar:file:", "").replaceFirst("!.*$", "");
    JarFile jar = new JarFile(URLDecoder.decode(jarPath, "UTF-8"));

    // loop through the entries in the JAR looking for ones in the proper directory
    Enumeration<JarEntry> entries = jar.entries();
    while(entries.hasMoreElements()) {
        String name = entries.nextElement().getName();
        if (name.startsWith(rootDirResource.substring(1))) // or a more complex check for *.txt files
            System.out.println("found: " + name);
    }

    jar.close();
}
于 2016-08-10T17:35:20.500 回答