Jar无法在FileOutputStream中找到txt文件

时间:2019-12-19 09:21:50

标签: java javafx resources text-files

**我正在尝试从文本文件中保存和获取Player对象,并且在使用我的IDE时可以使用,但是当我创建一个Jar时,找不到文本文件。我尝试过

this.getClas().getResources(path)

但是它仍然找不到我的文本文件的路径。有人可以帮忙吗?

  public void setPlayer() throws FileNotFoundException {
        ArrayList<Player> playerArrayList = new ArrayList<>();
        playerArrayList = getPlayers();

        Player player = new Player();
        player.name = ViewManager.name;
        player.score = Collision.points;
        playerArrayList.add(player);
        try{

            FileOutputStream fileOut = new FileOutputStream("src/resources/highscore.txt");
            ObjectOutputStream out = new ObjectOutputStream(fileOut);
            for(Player player1 : playerArrayList){
                out.writeObject(player1);
            }

            out.close();
            fileOut.close();

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

´´´´

2 个答案:

答案 0 :(得分:3)

资源文件不是物理File,因为它们可以在jar中。它们旨在为只读,并且类加载器可以将其缓存。它们区分大小写,以/作为路径分隔符,并且路径从类路径的根(可能是src / resources)开始。

因此,如果某些物理文件不存在,请使用资源文件作为后备资源进行复制。

Path appDir = Paths.get(System.getProperty("user.home") + ".myapp");
Files.createDirectories(appDir);

Path file = appDir.resolve("highscore.txt");
if (!Files.exists(file)) {
    // Copy resource to file, either:
    URL url = getClass().getResource("/highscore.txt");
    Path templatePath = Paths.get(url.toURI());
    Files.copy(templatePath, file);

    // Or
    InputStream templateIn = getClass().getResourceAsStream("/highscore.txt");
    Files.copy(templateIn, file);
}

try (FileOutputStream out = Files.newOutputStream(file)) {
    ...
}

路径是File的概括。

答案 1 :(得分:-1)

我不知道您使用的是什么IDE,但是您正在将文件写入源子目录。该目录可能不包含在jar中。