将txt文件添加到可运行的JAR文件

时间:2015-05-01 09:20:13

标签: java jar

我正在尝试创建一个可运行的jar文件,但我的.txt文件出现问题。

我的程序也有图像,但幸运的是我已经找到了如何管理它们。我正在使用类似这样的东西,它在Eclipse和jar中运行得很好:

logoLabel.setIcon(new ImageIcon(getClass().getResource("/logo.png")));

我的问题是,当我在其中一个课程中遇到这样的事情时:

try {
    employeeList =  (TreeSet<Employee>) ListManager.readFile("list/employeeList.txt");
} catch (ClassNotFoundException i) {
    i.printStackTrace();
} catch (IOException i) {
    i.printStackTrace();
}

这是我在类ListManager中用来读取.txt文件中序列化的列表:

public static Object readFile(String file) throws IOException, ClassNotFoundException {
    ObjectInputStream is = new ObjectInputStream(new FileInputStream(file));
    Object o = is.readObject();
    is.close();
    return o;
}

我也有类似的方法来写入文件。

我尝试了几种我在这里找到的组合:

How to include text files with Executable Jar

Creating Runnable Jar with external files included

Including a text file inside a jar file and reading it

我也尝试使用斜杠,没有斜杠,使用openStream,不使用openStream ...但是我得到一个NullPointerException或者根本就没有编译...

也许是愚蠢的事情,或者可能是一个概念错误,我对URL类的工作原理,我是编程新手......

非常感谢您的建议!

修改

又是我了...... Raniz给出的答案正是我所需要的,而且工作得很完美,但现在我的问题在于我用来写文件的方法......

public static void writeFile(Object o, String file) throws IOException {
    ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream(file));
    os.writeObject(o);
    os.close();
}

try {
   ListManager.writeFile(employeeList.getEmployeeList(), "lists/employeeList.txt");
} catch (IOException i) {
   i.printStackTrace();
}
你能帮帮我吗?我不知道应该用什么来替换FileOutputStream,因为我觉得再次出现问题,我是对的吗?

非常感谢!

2 个答案:

答案 0 :(得分:1)

是的,如果您想从jar文件中读取资源,则不应使用FileInputStream。也许您应该添加readResource方法:

public static Object readResource(Class clazz, String resource)
    throws IOException, ClassNotFoundException {
  try (ObjectInputStream is =
           new ObjectInputStream(clazz.getResourceAsStream(resource))) {
     return is.readObject();
  }
}

(我还建议更新您的readFile方法以使用try-with-resources块 - 目前如果有异常,您将不会关闭流...)

请注意,当您说“我也有类似的方法来写入文件”时,您将无法轻松写入jar文件中的资源。

答案 1 :(得分:1)

问题在于您尝试将JAR存档内的文件作为文件系统中的文件进行访问(因为那是FileInputStream所针对的)并且赢得了&#39工作。

您可以将readFile转换为使用网址,让URL处理为您打开流:

public static Object readFile(URL url) throws IOException, ClassNotFoundException {
    ObjectInputStream is = new ObjectInputStream(url.openStream());
    Object o = is.readObject();
    is.close();
    return o;
}

您还应该将代码放在try语句中,因为如果发生IOException,它当前不会关闭流:

public static Object readFile(URL url) throws IOException, ClassNotFoundException {
    try(ObjectInputStream is = new ObjectInputStream(url.openStream())) {
        Object o = is.readObject();
        return o;
    }
}

try {
    employeeList =  (TreeSet<Employee>) ListManager.readFile(getClass().getResource("/list/employeeList.txt"));
} catch (ClassNotFoundException i) {
    i.printStackTrace();
} catch (IOException i) {
    i.printStackTrace();
}
  

我也有类似的方法来写入文件。

如果文件在JAR内部,那将无法工作,所以您应该考虑将文件放在JAR之外。