【问题标题】:Absolute path to file outside of project folder with getResourceAsStream()使用 getResourceAsStream() 指向项目文件夹外文件的绝对路径
【发布时间】:2014-09-11 03:40:59
【问题描述】:

我想创建一个 jar,它将读取 txt fom jar,然后将 txt 文件保存到 user.home 文件夹。再次运行时,会从 user.home 读取文件。

我是这样读取文件的:

if(getClass().getResourceAsStream("/"+System.getProperty("user.home")+"/"+file_name) == null){
            configStream = getClass().getResourceAsStream(file_name);
        } else {
            configStream = getClass().getResourceAsStream(System.getProperty("user.home")+ "/"+file_name);
        }
        BufferedReader br = new BufferedReader(new InputStreamReader(configStream));

然后我像这样写入文件:

try {
        BufferedWriter out = new BufferedWriter(new FileWriter(System.getProperty("user.home")+ "/" + file_name));
        for (int j = 0; j < y; j++) {
            for (int i = 0; i < x; i++) {
                if (((Block) (listArray.get(i).get(j))).getState() == blockState.blank) {
                    out.write("0");
                } else if (((Block) (listArray.get(i).get(j))).getState() == blockState.solid) {
                    out.write("1");
                } else if (((Block) (listArray.get(i).get(j))).getState() == blockState.player) {
                    out.write("I");
                } else if (((Block) (listArray.get(i).get(j))).getState() == blockState.spikes) {
                    out.write("^");
                } else if (((Block) (listArray.get(i).get(j))).getState() == blockState.water) {
                    out.write("~");
                } else if (((Block) (listArray.get(i).get(j))).getState() == blockState.transparent) {
                    out.write("T");
                }
            }
            out.write("\n");
        }
        out.close();
    } catch (IOException e) {
        e.printStackTrace();
    }

我不知道为什么,但是程序从不从 user.home 读取文件,它总是从项目文件夹中读取一个。我在哪里犯错了?谢谢

【问题讨论】:

  • 如何将 txt 保存到 user.home ?您的代码不包含保存部分。
  • 你确定循环真的被执行了吗?尝试在循环之外写一些东西。
  • 为什么要从文件系统中读取文件作为资源?

标签: java file-io getresource


【解决方案1】:

您不能在不在 JVM 类路径中的位置上使用 getResourceAsStream。以下 sn-p 有效,因为在您的 JVM 类路径中的某处存在 file_name

getClass().getResourceAsStream(file_name);

你在下一个 sn-p 中尝试做的是使用当前类的类加载器来加载一个文件,该文件可能是也可能不是 JVM 类路径的一部分。

configStream = getClass().getResourceAsStream(System.getProperty("user.home")+ "/"+file_name);

此路径将从其遍历的相对根节点也不能是控制器。使用FileInputStream 并从/usr/local/file_name 等绝对路径加载文件。

【讨论】:

  • 谢谢!我还没有意识到解决方案这么简单。由于从 jar 运行程序后发生异常,我从 FileInputStream 切换到 getResourceAsStream。
猜你喜欢
  • 2011-03-13
  • 2023-01-26
  • 2013-12-20
  • 1970-01-01
  • 2016-05-08
  • 2023-03-20
  • 1970-01-01
  • 2012-01-27
  • 1970-01-01
相关资源
最近更新 更多