资源目录下的FileUtils.listFiles()

时间:2014-06-26 15:30:34

标签: java resources apache-commons-io

在我的项目中,我有一个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

如何在资源目录中使用Apache FileUtils

2 个答案:

答案 0 :(得分:0)

当文件/目录捆绑在.jar文件中时,它们不再被视为File个对象。可以通过获取像

这样的输入流来读取它们
InputStream input = getClass().getResourceAsStream("my_directory/file");

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

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

答案 1 :(得分: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();
}