这是代码
public static void readCharacters() {
try (FileInputStream fi = new FileInputStream("main/characters.dat"); ObjectInputStream os = new ObjectInputStream(fi)) {
characterList = (LinkedList<Character>) os.readObject();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
这是错误
java.io.FileNotFoundException:main \ characters.dat(系统找不到指定的路径)
我想要的是在我的jar中包含characters.dat文件,并且能够在程序运行时读取和写入它。是否有不同的方式来编写路径?或者将.dat文件放在不同的位置。
还有写作方法:
public static void writeCharacters() {
try (FileOutputStream fs = new FileOutputStream("main/characters.dat"); ObjectOutputStream os = new ObjectOutputStream(fs)) {
System.out.println("Writing Characters...");
os.writeObject(characterList);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
答案 0 :(得分:2)
你不能。你可以做其中一个。 JAR文件不是文件系统,它们的条目不是文件。您可以使用输入流来阅读它:
InputStream in = this.getClass().getResourceAsStream("/main/characters.dat");
在继续之前检查它是否为空。
答案 1 :(得分:1)
jar用于只读资源。您可以将它用作初始文件,作为一种模板。
Path path = Paths.get(System.getProperty("user.home") + "/myapp/chars.dat");
Files.mkdirs(path.getParentPath());
if (!Files.exists()) {
try (InputStream in =
Controller.class.getResourceAsStream("/main/characters.dat")) {
Files.copy(in, path);
}
}
上面将jar中的initial.dat资源复制到用户的主页&#34; myapp&#34;目录,这是一种常见的解决方案。
System.getProperty("user.dir")
将是正在运行的目录。人们也可以采取jar的路径:
URL url = Controller.class.getResource("/main/characters.dat");
String s = url.toExternalForm(); // "jar:file:/.... /xxx.jar!/main/characters.dat"
由此您还可以构建jar目录。请注意检查Windows,Linux,空格等。
URL url = Controller.class.getProtectionDomain().getCodeSource().getLocation();
上述解决方案存在NullPointerException风险,并且在IDE内部或独立运行时有点差异。
答案 2 :(得分:0)
重要提示:
使用getResourceAsStream
时,您必须以斜杠/
开始路径,这指定了jar的根,.getResourceAsStream("/file.txt");
在我的情况下,我的文件是函数参数String filename
,我必须这样做:
InputStream in = this.getClass().getResourceAsStream("/" + filename);