将 class 个对象从 运行 jar 文件写入另一个目录中的文件

Write class objects from a running jar file to a file in another directory

基本上我的程序在启动时从内存文件中的 class 对象读取参数,如果 运行 程序中的参数发生更改,它会覆盖内存文件并再次从中读取以更新参数.

我的应用程序在 IDE 中正常运行。 然后我从我的 IDE 构建了我的第一个 jar,并从批处理文件 运行 构建了它,它可以工作,但不像预期的那样。

如果内存文件存在,它会在程序启动时毫无问题地读取。

但是当我尝试更改程序参数或在没有内存文件的情况下启动程序时,它应该用更新的 class 对象 alt 覆盖内存文件。创建一个新的,它 returns“FileNotFoundException”。

这是我的业余代码,我创建了一个 class 目的是 writing/reading 一个“SaveClass”对象 to/from 一个文本文件:

public class ManageMemory {
    //filepath
    private String MEMORY_DIR = new StringBuffer(System.getProperty("user.home"))
            .append("\Documents\memory.txt").toString();
    private File targetFile = new File (MEMORY_DIR);

    //writes selected object to txt-file" with exceptions included
    public void writeToMemory(SaveClass object) {
        try {
            FileOutputStream f = new FileOutputStream(MEMORY_DIR);
            ObjectOutputStream o = new ObjectOutputStream(f);
            //write object to file
            o.writeObject(object);

            o.close();
            f.close();
        } catch (FileNotFoundException e) {
            System.out.println("File not found while writing");
        } catch (IOException e) {
            System.out.println("Error initializing stream");
        }
    }

    //reads current object in memory directory
    public SaveClass readFromMemory() {
        SaveClass inMemory = new SaveClass();
        if (!targetFile.exists()) {
            writeToMemory(inMemory);
        }
        try {
            FileInputStream f = new FileInputStream(MEMORY_DIR);
            ObjectInputStream o = new ObjectInputStream(f);

            inMemory = (SaveClass) o.readObject();

        } catch (FileNotFoundException e) {
            System.out.println("File not found while reading");
        } catch (IOException e) {
            System.out.println("Error initializing stream");
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return inMemory;
    }
}

我搜索了有关如何解决我的问题的信息,但没有找到我能理解的信息。 我测试了在我的保存文件上打印 canWrite() 而 运行 .jar 程序,它返回了 true。

找出真实情况的最佳方法是执行以下步骤:

  • 将 java.io.File 的所有用法替换为较新的 Path class。
  • 将 FileOutputStream 的所有用法替换为 Files.newOutputStream
  • 确保每个 catch 块都打印堆栈跟踪。

java.io.File是一个很老的class。它有许多设计缺陷,仅仅是因为 API 设计在 1995 年没有得到很好的理解。

但是 java.nio.file 包更现代并且纠正了所有这些问题。它还具有更详细和信息丰富的例外情况。

使用那个包看起来非常相似:

public void writeToMemory(SaveClass object) {
    try (ObjectOutputStream o = new ObjectOutputStream(
        Files.newOutputStream(
            Paths.get(MEMORY_DIR)))) {

        //write object to file
        o.writeObject(object);

    } catch (IOException e) {
        System.out.println("Error initializing stream");
        e.printStackTrace();
    }
}

这将打印一个异常,准确解释无法写入文件的原因。

(请注意,我正在使用 try-with-resources 语句——也就是说,ObjectOutputStream 的创建是在 try 之后的括号内——这将自动关闭 ObjectOutputStream,而后者又将关闭底层的输出流。)