Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何为jar放置文件并使用FileInputStream读取它_Java - Fatal编程技术网

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一起运行,为了使它能够在每次移动时不需要额外配置就可以运行?对于一个带有数据的移动应用程序,我添加了一些方式,但仍然需要注意。