读取和写入要在Windows和Mac上的项目中打包的文件

时间:2012-11-09 09:08:41

标签: java windows macos file persistence

如果之前已经发布过,我很抱歉。

我要做的是写一个简单的字符串到位于我项目中某个软件包中的文件。内部源包我有一个名为“resources”的包。在这里,我想阅读一个名为myfile.txt的文件,用它做一些事情并再次保存为newmyfile.txt。只需简单地读取和存储CSV数据。

我创建了一个阅读器,如下所示:

public BufferedReader getFileReader(String fileNameWithExtension, String sourcePackage) {
        try {
            String file = "/" + sourcePackage + "/" + fileNameWithExtension;
            BufferedReader br = new BufferedReader(new InputStreamReader(getClass().getResourceAsStream(file)));
            return br;
        } catch (Exception e) {
            System.err.println("Error: " + e.getMessage());
            return null;
        }
    }

这在我的Mac上运行正常。阅读本文,我发现我必须使用File.separator才能使其在所有操作系统上运行。所以我改变了这一点,但它仍然没有用。在某处,据说相对路径始终以/开头,与使用相对路径和其他位置../时的操作系统无关。作为Java上文件存储的全新手,我很困惑。

还有很多方法可以读取和写入文件,我不知道选择什么方法,以及为什么。

对于我来说,阅读和创建文件的最佳方法是什么,我想要做的就是保存一个长字符串或字符串数​​组?

2 个答案:

答案 0 :(得分:1)

我忙于其他事情,但现在,在你的帮助下,找到了适用于mac和windows的解决方案。

出于某种奇怪的原因,String file = "/" + sourcePackage + "/" + fileNameWithExtension;是唯一可以在我的Mac上阅读的东西。突然(没有完成代码更改)它也开始在Windows上运行。我不知道为什么。因此,现在可以通过以下方式获取读者的工作代码:

public BufferedReader getFileReader(String fileNameWithExtension, String sourcePackage) {
        try {
            String file = "/" + sourcePackage + "/" + fileNameWithExtension;
            BufferedReader br = new BufferedReader(new InputStreamReader(getClass().getResourceAsStream(file)));
            return br;
        } catch (Exception e) {
            System.err.println("Error: " + e.getMessage());
            return null;
        }
    }

为了写入resourses文件夹中的文件,我使用了:

public BufferedWriter getFileWriter(String fileNameWithExtension, String sourcePackage) {
        Writer output = null;
        File file = new File("src" + File.separator + sourcePackage + File.separator + fileNameWithExtension);
        try {
            output = new BufferedWriter(new FileWriter(file));            
            return (BufferedWriter) output;
        } catch (IOException ex) {
            Logger.getLogger(FileHelper.class.getName()).log(Level.SEVERE, null, ex);
            return null;
        }
    }

可悲的是,与将Reader作为Writer的方式不同,但它确实有效。

答案 1 :(得分:0)

关键是绝对路径始终以'/'开头。 相对路径不得以'/'开头。这至少是造成问题的原因之一。

对于其他人,你说“它不起作用”。但什么不起作用?