使用getResourceAsStream()获取项目文件夹外部文件的绝对路径

时间:2014-07-20 14:30:17

标签: java file-io getresource

我想创建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读取文件,它总是从项目文件夹中读取一个。我哪里弄错了?感谢

1 个答案:

答案 0 :(得分:3)

您不能在不在JVM类路径中的位置使用getResourceAsStream。以下代码段可行,因为JVM类路径中的某个位置存在file_name

getClass().getResourceAsStream(file_name);

您在下一个片段中尝试执行的操作是使用当前类的类加载器来加载可能是也可能不属于JVM类路径的文件。

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

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