在我的项目中,我有一个resources
目录,里面有my_directory
。my_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
collection包含所有.txt
文件。
如果我在调试器中运行这个项目,它会很好地工作。然而,如果我构建项目jar
文件,它给出了一个错误:
java.lang.IllegalArgumentException: Parameter 'directory' is not a directory
directory
文件路径为:
/home/hsz/.../lib/my_project.jar!/my_directory
如何在资源目录上使用Apache的FileUtils
?
当文件/目录被捆绑在.jar文件中时,它们不再被视为File
对象。可以通过获取输入流(如
InputStream input = getClass().getResourceAsStream("my_directory/file");
我建议您保留文件系统中包含文件的文件夹,并进行您想要执行的操作。有没有什么原因,你想在这些操作之前将它们捆绑到一个jar中?
根据下面问题的答案,在Java 7中,您可以从JAR (zip)文件创建一个文件系统,然后使用NIO的目录遍历和过滤机制对其进行搜索。这将使编写处理jar和"分解"目录的代码变得更容易。你可以试试!
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();
}