2012-03-23 65 views
2

我有一个文件保存用于加载我的应用程序的textField的默认信息。我在编译时查找了如何将这些内置到我的jar文件中,并且我被告知将它放在源代码包中,它将被带入,所以我已经完成了。文件路径在NetBeans中工作,但不在构建的JAR文件中

文件结构:

Project 
    -Source Packages 
     -src 
      ~Java Classes 
     -defaultFiles 
      ~Defaults.txt 

我想使用的代码是这样的:

BufferedReader in; 
try { 
    URL resourceURL = FuelProperties.class.getResource("/defaultFiles/Defaults.txt"); 
    in = new BufferedReader(new FileReader(resourceURL.getPath())); 
} 

这完美的作品,当我运行它通过NetBeans的,但是当我生成项目,并尝试从jar文件运行它不抓取文件。

我已验证默认文件正在构建并存在于上述相同的文件结构中。

如果你能帮助我解决这个问题,我将非常感激,因为我不知道是什么让它不能工作。谢谢。

+0

我猜测/ src/defaultFiles实际上在你的jar中? – gorjusborg 2012-03-23 15:28:41

+0

这就是我所相信的,正如在我的dist文件夹中(这是程序构建的地方),只有jar文件和lib文件夹。 lib文件夹只包含库罐。 – Alex 2012-03-23 15:30:34

+1

那么,没有理由不检查jar来查看文件是否确实在那里:)只需使用jar xvf .jar将其全部转存。但是正如Dennis R.所说的那样,你不能通过这种方式在jar文件中加载文件。您需要使用包含jar的类加载器的getResource方法之一。 – gorjusborg 2012-03-23 15:36:11

回答

1

我在搜索几十个问题后找到答案。事实证明,你只能得到你的JAR文件中的数据的InputStream而不是像我试图做的那样的File对象。 (如果你想File对象,你只需要提取程序从JAR文件,然后您可以访问它。)

这样得到了我的问题的工作代码被简单地更换这样的:

URL resourceURL = FuelProperties.class.getResource("/defaultFiles/Defaults.txt"); 
in = new BufferedReader(new FileReader(resourceURL.getPath())); 

有了这个:

in = new BufferedReader(new InputStreamReader(this.getClass().getResourceAsStream("/defaultFiles/Defaults.txt"))); 

而现在,它正在内外NetBeans和在建的JAR文件。

+0

好吧,我认为你的问题发生在getResource返回null ... – 2012-03-27 06:50:14

+0

我认为它是有道理的,要试试这个,即时通讯使用文件和在罐子里我接受NPE,所以我会改变它getResourceAsStream,谢谢。 – 2017-08-07 15:24:11

4

您必须在类路径中查找,而不是在磁盘上查找。 使用的API是:

URL resourceURL : this.getClass().getResource("relative path in the classpath"); 

一旦你有,你可以打开一个流的URL等

编辑:在main方法,你当然需要更换

this.getClass() 

作者:

ClassName.class 
+1

getResourceAsStream(String path)也可以非常方便,因为它直接返回输入流。 – gorjusborg 2012-03-23 15:37:21

+0

事实上,这是一次性的:可以根据是否需要多次读取资源来完成选择。 – 2012-03-23 16:21:29

+0

@DenisR。我尝试过使用你的方法,并且我再一次在NetBeans中工作,但是当我构建并运行jar时,它仍然没有加载文件。我使用了Pleepleus的建议,并检查了jar以确保文件在那里,所以我不确定这里没有什么工作。 :/ – Alex 2012-03-26 12:44:41

相关问题