gpt4 book ai didi

java - 无论程序是从 jar 还是从 IDE 运行,如何将文件写入正确的目录?

转载 作者:行者123 更新时间:2023-11-30 05:42:59 25 4
gpt4 key购买 nike

当我的程序以两种不同的方式运行时,我在写入文本文件时遇到问题。我可以让它在作为 jar 运行或从 NetBeans 运行时正常工作,但不能同时运行。

我将资源文件夹添加为 Netbeans 中的源包,这导致我的程序在 IDE 中正常工作,但在作为 jar 运行时却无法正常工作。如果我没有将资源文件夹作为源包,而是将其放在项目根文件夹中,那么它可以从 jar 中正确运行,但不能在 IDE 中运行。我正在尝试将我的程序转换为 java web start 应用程序,因此我希望它能够以两种方式运行,但如果没有必要,请告诉我。

我首先要弄清楚我的代码是否是从 jar 中运行的,以便将来可以分离我的逻辑。目前,无论哪种方式都是相同的逻辑。此代码可以在 IDE 中运行,但从 jar 运行时不会保存。 FILEPATH 是两个高分文件之一的路径,它看起来像“data/classichighscores.txt”。这temp 文件是已在同一目录中创建的空文本文件。

  /**
* saves the data to its own text file.
*/
public void save() {
File dataFile = null;
File tempFile = null;

String className = this.getClass().getName().replace('.', '/');
String classJar = this.getClass().getResource("/" + className + ".class").toString();
if (!classJar.startsWith("jar:")) {
dataFile = new File(ClassLoader.getSystemResource(FILEPATH).getFile());
tempFile = new File(ClassLoader.getSystemResource("data/myTempFile.txt").getFile());
} else {
dataFile = new File(ClassLoader.getSystemResource(FILEPATH).getFile());
tempFile = new File(ClassLoader.getSystemResource("data/myTempFile.txt").getFile());
}
try {
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(
new FileOutputStream(tempFile), "UTF-8"));

for (String line : FILEDATA) {
bw.write(line);
bw.newLine();
}

bw.close();
dataFile.delete();
tempFile.renameTo(dataFile);
tempFile.createNewFile();
} catch (IOException ex) {
System.err.println(tempFile.toString());
System.err.pritnln(dataFile.toString());

我过去还更改了我的 xml 文件和 list 文件,这可能与我的问题有关。我将此代码放入其中,以便将我的 jar 文件和资源放在同一个分发文件夹中。

<?xml version="1.0" encoding="UTF-8"?>

<project name="TheLostWand" default="default" basedir=".">
<description>Builds, tests, and runs the project TheLostWand.</description>
<import file="nbproject/build-impl.xml"/>
<!--adding resources to dist folder-->
<target name="-post-jar">
<mkdir dir="${dist.dir}/resources"/>
<copy todir="${dist.dir}/resources">
<fileset dir="${basedir}/resources" />
</copy>
</target>

</project>

我添加了类路径行。

Manifest-Version: 1.0
X-COMMENT: Main-Class will be added automatically by build
Class-Path: resources/

我希望我的文本文件能够以更高的分数进行编辑和保存。从 IDE 运行时它可以正常工作,但从 jar 运行时则不能。我可以从源包中删除我的资源文件夹,它将在 jar 中工作,但不能从 IDE 中工作。

最佳答案

为了保存文本文件,我建议序列化。

//Credit to Jaroslaw Janas
public void save(String filepath, Object obj) {
// get the folder
// if no folder create a new one
File folder = new File("foldername");
if (!folder.exists()){
folder.mkdirs();
}

try {
FileOutputStream file = new FileOutputStream(filepath);
ObjectOutputStream out = new ObjectOutputStream(file);
out.writeObject(obj);
out.close();
file.close();
} catch (IOException ex) {
System.out.println("IOException is caught");
}
}

// this method loades the saved object
// from a location passed in as an argument
public Object load(String filepath) {
Object obj = null;
try {
// reading from the file
FileInputStream file = new FileInputStream(filepath);
ObjectInputStream in = new ObjectInputStream(file);

// deserialization
obj = in.readObject();

in.close();
file.close();

} catch (IOException ex) {
System.out.println("IOException");
} catch (ClassNotFoundException ex) {
System.out.println("ClassNotFoundException");
}
return obj;
}

对于通用目录,%AppData% 可能是一个不错的选择。

关于java - 无论程序是从 jar 还是从 IDE 运行,如何将文件写入正确的目录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55345284/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com