Java如何在jar环境中而不是IDE中读取该文件夹中的文件夹和列表文件
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Java如何在jar环境中而不是IDE中读取该文件夹中的文件夹和列表文件,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2971字,纯文字阅读大概需要5分钟。
内容图文
我的问题是我在src下创建了一个文件夹(名称是IconResources),在IconResources中有很多图片.目录是这样的:
> ProjectName
> src
>包1
>包2
> IconResources(这是目标文件夹)
我想列出所有图片文件的名称,并对这些图片做一些事情.我发现File.list()只能在IDE中运行,如果我将项目导出到一个jar来制作一个独立的,它就无法工作.所以我搜索并发现我应该使用inputstream和outputstream.现在我发现i / o流可以很好地用于单个文件.但我想使用inputstream和outputstream来读取文件夹(IconResource),然后列出该文件夹中的文件.
所以我的问题是如何使用i / o put stream加载文件夹并迭代文件夹以列出该文件夹中的文件名.这些东西不仅应该在IDE下工作,还应该在导出的jar下工作.
我的代码如下:
private void initalizeIconFiles(File projectDirectory){
URL a = editor.getClass().getResource("/IconResources/");// Get Folder URL
List<String> iconFileNames=new ArrayList<String>();//Create a list to store file names from IconResource Folder
File iconFolder = new File(a.getFile());
Path path=Paths.get(iconFolder.getPath());
DirectoryStream<Path> 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中分解.
解决方法:
这实际上是一个非常困难的问题,因为ClassLoader必须考虑到在运行时可能在类路径上有另一个名为IconResources的文件夹这一事实.
因此,没有“官方”方式列出类路径中的整个文件夹.我在下面给出的解决方案是一个hack,目前可以使用URLClassLoader的实现.这可能会有所变化.
如果您想要强大的方法,则需要使用类路径扫描程序.图书馆形式有很多,我个人最喜欢的是Reflections,但Spring有一个内置,还有很多其他选择.
在黑客上.
通常,如果您在URLClassLoader上使用getResourceAsStream,那么它将返回该文件夹中的资源流,每行一个. 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< URL>在该位置的资源,您可以使用如下方法:
public static List<URL> 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
}
内容总结
以上是互联网集市为您收集整理的Java如何在jar环境中而不是IDE中读取该文件夹中的文件夹和列表文件全部内容,希望文章能够帮你解决Java如何在jar环境中而不是IDE中读取该文件夹中的文件夹和列表文件所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。