作者:456456 | 来源:互联网 | 2023-05-18 15:04
我的问题是我在src下创建了一个文件夹(名称为IconResources),在IconResources中有很多图片。目录是这样的:
项目名
src
包装1
包装2
IconResources(这是目标文件夹)
我想列出所有图片文件的名称,并对这些图片进行处理。而且我发现File.list()仅在IDE中有效,如果我将项目导出到jar中以使其独立,则它将无法正常工作。因此,我搜索发现我应该使用inputstream和outputstream。现在,我发现I / O流可以很好地用于单个文件。但是我想使用inputstream和outputstream读取文件夹(IconResource),然后列出该文件夹中的文件。
所以我的问题是如何使用I / O放置流加载文件夹并迭代该文件夹以列出该文件夹中的文件名。这些东西不仅应该在IDE下工作,而且应该在导出的jar下工作。我的代码如下:
private void initalizeIconFiles(File projectDirectory){
URL a = editor.getClass().getResource("/IconResources/");// Get Folder URL
List icOnFileNames=new ArrayList();//Create a list to store file names from IconResource Folder
File icOnFolder= new File(a.getFile());
Path path=Paths.get(iconFolder.getPath());
DirectoryStream stream = Files.newDirectoryStream(path) ;
for (Path entry : stream) {
if (!Files.isDirectory(entry)) {
System.out.println(entry.getFileName().toString());
iconFileNames.add(entry.getFileName().toString());// add file name in to name list
}
}
}
上面的代码只能在IDE下运行,但在导出的jar中会崩溃。
1> Boris the Sp..:
这实际上是一个非常困难的问题,因为ClassLoader
必须考虑到在运行时您可能在类路径上调用了另一个文件夹这一事实IconResources
。
因此,没有“正式”方式从类路径中列出整个文件夹。我在下面提供的解决方案是一种hack,目前可用于的实现URLClassLoader
。这可能会发生变化。
如果要采用可靠的方法,则需要使用类路径扫描器。其中有许多以库的形式存在,我个人最喜欢的是Reflections,但是Spring内置了其中一个,还有许多其他选择。
进入hack。
通常,如果您getResourceAsStream
在上,URLClassLoader
那么它将返回该文件夹中的资源流,每行一个。URLClassLoader
JRE使用的是默认值,因此,如果您不更改此行为,则此方法应立即可用。
假设我有一个具有以下类路径结构的项目:
/
text/
one.txt
two.txt
然后运行以下代码:
final ClassLoader loader = Thread.currentThread().getContextClassLoader();
try(
final InputStream is = loader.getResourceAsStream("text");
final InputStreamReader isr = new InputStreamReader(is, StandardCharsets.UTF_8);
final BufferedReader br = new BufferedReader(isr)) {
br.lines().forEach(System.out::println);
}
将打印:
one.txt
two.txt
因此,为了获取List
该位置的资源,可以使用以下方法:
public static List getResources(final String path) throws IOException {
final ClassLoader loader = Thread.currentThread().getContextClassLoader();
try (
final InputStream is = loader.getResourceAsStream(path);
final InputStreamReader isr = new InputStreamReader(is, StandardCharsets.UTF_8);
final BufferedReader br = new BufferedReader(isr)) {
return br.lines()
.map(l -> path + "/" + l)
.map(r -> loader.getResource(r))
.collect(toList());
}
}
现在记住,这些URL
位置是不透明的。它们不能被视为文件,因为它们可能位于.jar
或位于Internet位置。因此,为了读取资源的内容,请在以下位置使用适当的方法URL
:
final URL resource = ...
try(final InputStream is = resource.openStream()) {
//do stuff
}