Java 文件路径在JAR文件中不起作用

Java 文件路径在JAR文件中不起作用,java,eclipse,swing,Java,Eclipse,Swing,我正在开发一个Java Swing应用程序,我有一个文件(例如key.text),其中包含用于解密的密钥,使用第三方库执行解密,我所做的解密是将key.txt传递给库方法 Eclipse工作区结构 src com.org.controller com.org.beans key.txt 我试着用下面的方法通过垃圾箱路径 String keyFilePath = "bin/key.txt"; aesEncrypt.setSecretKey(keyFilePath); // passi

我正在开发一个Java Swing应用程序,我有一个文件(例如key.text),其中包含用于解密的密钥,使用第三方库执行解密,我所做的解密是将key.txt传递给库方法

Eclipse工作区结构

src
  com.org.controller
  com.org.beans
  key.txt
我试着用下面的方法通过垃圾箱路径

String keyFilePath = "bin/key.txt";
aesEncrypt.setSecretKey(keyFilePath); // passing path to library method
当我在eclipse中运行时,代码片段工作得很顺利,但当我将其打包到jar中时,它就不工作了

我尝试以以下方式使用
getResource()
,但这也不起作用

URL url = this.getClass().getResource("/key.txt");
File file = new File(url.toURI());
String keyFilePath = file.getAbsolutePath();
aesEncrypt.setSecretKey(new File(keyFilePath).getAbsolutePath()); // passing path to library method  

所以我的问题是,如何传递驻留在构建jar中的资源路径?

这可能不是您想要的,但是您可以在与jar相同的文件夹中创建一个名为bin的文件夹。然后将key.txt文件放入其中。

由于您调用的API似乎需要文件名,因此您需要将资源(这是一个zip条目而不是实际文件)复制到实际文件中:

Path file = Files.createTempFile(null, ".txt");
try (InputStream stream = this.getClass().getResourceAsStream("/key.txt")) {
    Files.copy(stream, file, StandardCopyOption.REPLACE_EXISTING);
}

aesEncrypt.setSecretKey(file.toString());

jar文件中不存在bin文件夹通常您应该使用
ClassLoader
(例如
Thread.currentThread().getContextClassLoader()
)来检索此类资源:
loader.getResource(“key.txt”)
。此
getResource
方法返回一个
URL
,因此下一步应该是找出您的库是否提供了一个获取此类URL的方法。aesEncrypt的类型是什么?它是否有接受URL或InputStream而不是文件的方法?jar文件实际上是一个zip文件,其中包含一些特定于Java的条目。key.txt是zip文件中的一个条目,而不是单独的文件,因此您永远不能使用java.io.file来读取它。@VGR它需要字符串路径。zip条目是什么意思?zip文件是作为存档的单个文件。zip存档的每个成员都是一个zip条目。正如我在上面的评论中所说,一个.jar文件实际上是一个具有不同扩展名的zip文件。但是,如果我的文件扩展名不是txt,我是否必须更改createTempFile()中提供的扩展名?您可以使用任何您想要的扩展名。您还可以传递扩展名的
null
,让系统选择一个名称(因为实际名称对于您正在做的事情来说并不重要)。真棒,谢谢你。想知道我们为什么要创建临时文件。