如何为jar放置文件并使用FileInputStream读取它

时间:2017-04-03 22:14:27

标签: java

这是代码

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();
    }
}

这是结构: enter image description here

这是错误

  

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();
    }

}

3 个答案:

答案 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);