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

Java 将txt文件添加到可运行的JAR文件,java,jar,Java,Jar,我试图创建一个可运行的jar文件,但我的.txt文件有问题 我的程序也有图像,但幸运的是我已经知道了如何管理它们。我在他们身上使用了类似的东西,Eclipse和jar都可以正常工作: logoLabel.setIcon(new ImageIcon(getClass().getResource("/logo.png"))); 我的问题是,当我的一门课上出现了这样的情况: try { employeeList = (TreeSet<Employee>) ListManager

我试图创建一个可运行的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();
}
我也有类似的方法来写入文件

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

我也试过用斜杠,不用斜杠,用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,因为我认为问题又出现了,对吗


多谢各位

是的,如果要从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文件中的资源。

问题是,您试图将jar存档中的文件作为文件系统中的文件进行访问(因为这是
FileInputStream
的目的),而这是行不通的

您可以将
readFile
转换为使用URL,并让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();
}
publicstaticobjectreadfile(URL)抛出IOException,ClassNotFoundException{
try(ObjectInputStream is=newobjectinputstream(url.openStream())){
对象o=is.readObject();
返回o;
}
}
试一试{
employeeList=(TreeSet)ListManager.readFile(getClass().getResource(“/list/employeeList.txt”);
}捕获(ClassNotFoundException i){
i、 printStackTrace();
}捕获(IOI异常){
i、 printStackTrace();
}
我也有类似的方法来写入文件


<> p>如果文件在jar中,那就不起作用了,所以你应该考虑把文件放在你的坛子外面。

我想我知道你为什么要这么做。但这是一种错误的方法,你应该把你的外部文件(例如config,txt,等等)放在一个特定于你的应用程序的文件夹中。e、 g.在userhome/.yourapplicationname中非常感谢!它工作得非常好,并且与JAR中的文件一起工作。但是现在我的问题是我用来写文件的方法。。。我已经编辑了我的问题来展示我在做什么。答案是你不应该在你的JAR中保存你需要更改的文件。如果问题是分发,那么创建一个文件和JAR的ZIP文件,然后分发它。
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();
}