在我的项目中,我有一个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
集合包含所有.txt
个文件。
如果我在调试器中运行此项目,它的效果很好。但是,如果我将项目构建到jar
文件,则会出错:
java.lang.IllegalArgumentException: Parameter 'directory' is not a directory
directory
文件路径为:
/home/hsz/.../lib/my_project.jar!/my_directory
如何在资源目录中使用Apache FileUtils
?
答案 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();
}