Java 如何为jar放置文件并使用FileInputStream读取它
这是密码Java 如何为jar放置文件并使用FileInputStream读取它,java,Java,这是密码 public static void readCharacters() { try (FileInputStream fi = new FileInputStream("main/characters.dat"); ObjectInputStream os = new ObjectInputStream(fi)) { characterList = (LinkedList<Character>) os.readObject(); } c
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();
}
}
你不能。你可以做一个或另一个。JAR文件不是文件系统,它们的条目也不是文件。您可以使用输入流读取它:
在继续之前检查它是否为空。您不能。你可以做一个或另一个。JAR文件不是文件系统,它们的条目也不是文件。您可以使用输入流读取它:
在继续之前检查它是否为空。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);
}
}
上面将initial.dat资源从jar复制到用户的主“myapp”目录,这是一个常见的解决方案
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内部或独立运行时的工作方式略有不同。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);
}
}
上面将initial.dat资源从jar复制到用户的主“myapp”目录,这是一个常见的解决方案
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内部或独立运行时的工作方式略有不同。重要注意事项:
使用getResourceAsStream
时,必须以斜杠/
开始路径,这将指定jar的根目录.getResourceAsStream(“/file.txt”)代码>
在我的例子中,我的文件是一个函数参数,stringfilename
,我必须这样做:
InputStream in = this.getClass().getResourceAsStream("/" + filename);
重要提示:
使用getResourceAsStream
时,必须以斜杠/
开始路径,这将指定jar的根目录.getResourceAsStream(“/file.txt”)代码>
在我的例子中,我的文件是一个函数参数,stringfilename
,我必须这样做:
InputStream in = this.getClass().getResourceAsStream("/" + filename);
请尝试使用“src/main/characters.dat”
,当我从ide运行它时,它会工作,但当我运行jar时,它不会工作。@moondaisy否。src
目录不在jar文件中,您已经错过了实际问题。尝试使用“src/main/characters.dat”
当我从ide运行它时,它会工作,但当我运行jar时就不是了。@moondaisy否。src
目录不在jar文件中,您错过了实际的问题。您是说我可以做一个还是另一个?您可以使用FileInputStream
或将资源放在jar文件中。有没有替代FileInputStream的方法?我也发了写代码如果有什么变化?我给了你一个选择。你的“编写代码”实际上不起作用。您不能写入JAR文件,原因与上面相同。是的,您的读取方法可以工作,但是如果我理解正确,当文件在JAR中时,我将无法重新写入文件中的更改。我怎样才能绕过这个问题,我怎样才能将文件放在jar之外,但仍然能够使用相对路径?你说我可以做一个或另一个是什么意思?你可以使用FileInputStream
或将资源放在jar文件中。FileInputStream还有其他替代方法吗?我也发了写代码如果有什么变化?我给了你一个选择。你的“编写代码”实际上不起作用。您不能写入JAR文件,原因与上面相同。是的,您的读取方法可以工作,但是如果我理解正确,当文件在JAR中时,我将无法重新写入文件中的更改。我怎么能绕过它,我怎么能让文件在jar之外,但仍然能够使用相对路径?有没有一种方法可以让.dat文件在jar之外,并在不同的计算机上与jar一起使用,对于一个带有数据的移动应用程序,我添加了一些方式,但仍然需要注意。有没有一种方法可以将.dat文件放在jar之外,并在不同的计算机上与jar一起运行,为了使它能够在每次移动时不需要额外配置就可以运行?对于一个带有数据的移动应用程序,我添加了一些方式,但仍然需要注意。