将 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,而后者又将关闭底层的输出流。)
基本上我的程序在启动时从内存文件中的 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,而后者又将关闭底层的输出流。)