我想从我的jar中读取一个资源,如下所示:

File file;
file = new File(getClass().getResource("/file.txt").到URI());
BufferedReader reader = new BufferedReader(new FileReader(file));

//Read the file

在Eclipse中运行它时,它可以正常工作,但是如果我将它导出到一个jar中,然后运行它,就会出现一个IllegalArgumentException:

Exception in thread "Thread-2"
java.lang.IllegalArgumentException: URI is not hierarchical

我真的不知道为什么,但通过一些测试,我发现如果我改变了

file = new File(getClass().getResource("/file.txt").到URI());

file = new File(getClass().getResource("/folder/file.txt").到URI());

然后它的工作原理正好相反(它在jar中工作,但在eclipse中不工作).

我正在使用Eclipse,文件所在的文件夹位于类文件夹中.

推荐答案

与其试图将资源称为File,不如让ClassLoader通过getResourceAsStream返回InputStream:

try (InputStream in = getClass().getResourceAsStream("/file.txt");
    BufferedReader reader = new BufferedReader(new InputStreamReader(in))) {
    // Use resource
}

只要file.txt资源在类路径上可用,那么无论file.txt资源是在classes/目录中还是在jar目录中,此方法都将以相同的方式工作.

出现URI is not hierarchical是因为JAR文件中资源的URI将类似于:file:/example.jar!/file.txt.您不能读取jar(zip文件)中的条目,就像它是普通的File一样.

对以下问题的回答很好地解释了这一点:

Java相关问答推荐

无法在Java中使用Curve secp 256 k1验证JWT

Java 8 RDX-如何设置单个选项卡标题文本的 colored颜色

获取拦截器内部的IP地址

Java 21虚拟线程会解决转向react 式单线程框架的主要原因吗?

空手道比赛条件

Listview—在Android Java中正确链接项目时出错

Spring boot:Bean和动态扩展器

Spring Batch 5-不要让它在数据库中自动创建表

使用动态ID从json获取详细信息的Jolt规范

Java .类参数不通过构造函数传递

为什么我的ArrayList索引的索引总是返回-1?

这是什么Java构造`(InputStream Is)->;()->;{}`

Chunk(Int)已弃用并标记为要删除

将java.util.Date转换为OffsetDateTime

Instancio未在日志(log)中显示测试失败消息

从Spring6中的JPMS模块读取类时出现问题

try 使用预准备语句占位符获取信息时出现Try-With-Resources错误

如何将RESTAssured';S的Http标题转换为<;字符串、字符串和>的映射?

Java返回生成器的实现

如何正确使用java.time类?