【问题标题】:Access text file in parallel resources folder using relative path使用相对路径访问并行资源文件夹中的文本文件
【发布时间】:2016-12-12 20:08:19
【问题描述】:

您好,感谢您抽出宝贵时间来研究这个问题。

我无法访问与我的 src 文件夹平行的文件夹中的文本文件(结构见下文)。

我找到的最接近解释的是:https://www.cis.upenn.edu/~matuszek/cit597-2006/Pages/finding-files.html 并且我遇到过许多类似的问题,但不幸的是,我无法从中推断出这个问题的答案。

我知道我可以使用绝对路径,但我想确保该软件可以在其他人的计算机上运行,​​所以这是不行的。因此,我试图让它与相对路径一起工作。

作为奖励,这里建议:https://coderanch.com/t/464197/java/java/Reading-files-directory-giving-relative 为了让这段代码在 JAR 文件中工作,我必须使用 getResourceAsStream()。有人可以建议吗?

我正在尝试从RecipeReader.java 中访问Recipes.txt,这是我目前的代码:

        Class thisClass = this.getClass();
        ClassLoader loader = thisClass.getClassLoader();
        URL recipeFileURL = loader.getResource("Recipes.txt");
        String path = recipeFileURL.getPath();
        path.replaceAll("%20",  " ");
        BufferedReader input = new BufferedReader(new FileReader(path));

类似地写入同一个文件:

        Class thisClass = this.getClass();
        ClassLoader loader = thisClass.getClassLoader();
        URL recipeFileURL = loader.getResource("Recipes.txt");
        String path = recipeFileURL.getPath();
        path.replaceAll("%20",  " ");
        BufferedWriter output = new BufferedWriter(new FileWriter(path));

提前感谢您的帮助!

罗宾

【问题讨论】:

    标签: java text-files javafx-8 classloader relative-path


    【解决方案1】:

    如果文件捆绑在您的 jar 文件中,则它们不再是文件:文件系统在运行时不包含这些文件,因为它们嵌入在 jar 文件中。所以你可以使用文件 IO 来读取它们。 new FileReader(path) 没有意义。

    您似乎还想修改那些资源的内容。如果资源嵌入到 jar 文件中,这绝对是不可能的。

    因此,您需要考虑您真正想要做什么,以及如何将应用程序提供给最终用户并进行安装。

    如果文件包含应用程序所需的静态只读资源,则应将它们捆绑在 jar 文件中,并使用 ClassLoader 读取。

    如果文件是数据,必须由应用程序读取和保存,就像文本编辑器所做的那样,那么向应用程序提供它们可能没有意义:只需询问用户在哪里加载/保存文件。

    如果它们是需要由应用程序透明地加载和保存的首选项,那么您可以从/到位于用户主目录中的 .myApp.prefs 文件加载和保存它们。

    【讨论】:

    • 太好了,谢谢分享。鉴于用户只需选择他们想要存储文件的位置,我的原始问题似乎是相当多余的。但是,这可能是一个有点愚蠢的问题,但是当java程序已经编译时,你将如何保存用户输入到java程序中的文件路径?这似乎有点鸡和蛋,因为您必须在读取其他可编辑文件位置的位置有一个可编辑文件!非常感谢您的时间和知识,非常感谢
    • 我不明白你的问题。你能解释一下你想做什么吗?
    【解决方案2】:

    通常你会这样做的方式是将你的资源放在一个与将加载它的类的包名称匹配的文件夹中。

    例如,你会有这样的:

    package com.robhartley.application;
    
    public class ResourceLoader {
        public List<Recipe> loadRecipes() {
             InputStream inputStream = getClass().getResourceAsStream("Recipes.txt");
             // ...
        }
    }
    

    在您的项目中使用以下文件:resources/com/robhartley/application/Recipes.txt

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-08-03
      • 1970-01-01
      • 2020-10-31
      • 1970-01-01
      • 2018-03-06
      • 2020-01-28
      • 2012-07-29
      相关资源
      最近更新 更多