2012-07-16 98 views
0

我正在为某些串行端口通信创建Java应用程序,并且在应用程序的文件夹中有两个资源需要在运行时存在。第一种是用作启动画面的图像,另一种是在程序启动时需要读取的配置文件。在JAR中引用文件

下面是从Linux中的“树”命令输出的一个删节的版本,这两个文件,我需要被引用为“commandSet.config”和“飞溅screen2.png”

. 
├── bin 
│   ├──... 
├── commandSet.config 
├── app-manifest.txt 
├── splash-screen2.png 
└── src 
    ├── events 
    │   └── InterfaceEvents.java 
    ├── models 
    │   ├── Command.java 
    │   └── Phone.java 
    ├── operations 
    │   ├── Application.java 
    │   ├── ... 
    └── views 
     ├── CallDialog.java 
     ├── SplashScreen.java 
     └── Window.java 

我目前引用了下面几行:

BufferedReader in = new BufferedReader(new FileReader("commandSet.config")); 

JLabel image = new JLabel(new ImageIcon("splash-screen2.png")); 

该W当我从Eclipse运行它时运行得很好,但是一旦我导出到可运行JAR文件就不会被移动,因此没有被正确地引用。我试图将它们移动到“src”文件夹中,导致它们被存档在JAR中,但我仍然无法引用它们。

我对导出Java项目的概念很陌生,所以也许我错过了一些明显的东西。如果有人能够告诉我做到这一点的最佳方式以及未来项目文件系统的最佳方法,我将非常感激。干杯!

回答

0

好吧,我一心想要解决这个问题,并认为我会在未来为其他人解答。我基本上遵循“duffymo的”指导方针,这是我做的:

  • 在创造了我的资源JAR
  • 把该JAR在根项目
  • 用Eclipse将JAR添加到构建路径。
  • 使用getResourceAsStream(“/nameOfFile.ext”)来获取我的资源的流。

干杯!

1

无法以与在文件系统中相同的方式访问该文件。

从您的上下文中使用getResourceAsStream()使用类加载器从CLASSPATH中读取它。

+0

好的,应该在哪里存储文件以便以这种方式引用它们? – 2012-07-16 12:13:50

+0

当然,在部署应用程序的JAR或WAR中。由于类加载器在CLASSPATH中查找,因此您需要将它们放在CLASSPATH中。在你的JAR中,这是在清单类路径中。在WAR中,这是WEB-INF/classes文件夹 – duffymo 2012-07-16 12:24:11

+0

好的,仅供参考,我只使用JAR。我不完全确定你的意思,“你需要他们在CLASSPATH”?我有一个清单文件,其中包含以下内容: Main-Class:operations.Application – 2012-07-16 13:39:51

3
InputStream in = this.getClass().getClassLoader().getResourceAsStream("splash-screen2.png"); 
byte[] buffer = new byte[in.available()]; 
in.read(buffer); 
ImageIcon icon = new ImageIcon(buffer); 
+0

这将返回一个inputStream,但对吗? ImageIcon没有构造函数重载,它接受一个inputStream对象作为参数。 – 2012-07-16 12:13:22

+1

您需要将InputStream的内容加载到byte []数组中并使用该构造函数。 – 2012-07-16 12:20:44

+0

答案已更新 – Ilya 2012-07-16 12:22:20