【问题标题】:Read and Write files to package in project on Windows and Mac in Java在 Windows 和 Mac 上用 Java 读写文件以打包到项目中
【发布时间】:2012-11-09 09:08:41
【问题描述】:

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

我要做的是将一个简单的字符串写入和读取到位于我项目中的一个包中的文件。在源代码包中,我有一个名为“资源”的包。在这里,我想读取一个名为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 文件存储的新手,我很困惑。

读写文件的方法也有很多,不知道该选择什么方法,为什么。

对我来说,读取和创建文件的最佳方式是保存一个长字符串或一组字符串?

【问题讨论】:

  • 在 Java 的窗口上使用正斜杠可以正常工作。当您还需要驱动器号之类的东西时,事情会变得更加复杂......
  • "写入并将一个简单的字符串读取到位于我项目中的一个包中的文件中。" 包通常部署在 Jars 中。那时,没有现实的选择可以回信给他们。请参阅this answer 了解替代策略。
  • 如果您使用 Eclipse 或其他 IDE。您的文件位置有问题。
  • “我发现我必须使用 File.separator” 不!使用getResource(String) 时不会。它总是向前斜线。
  • 你的意思是他不能使用 File.separator,因为它可以与 getResource(String) 一起使用,但不能与 getResourceAsStream(String) 一起使用。我对吗?如果我错了,请纠正我。跨度>

标签: java windows macos file persistence


【解决方案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;
        }
    }

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

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;
        }
    }

可悲的是,获得ReaderWriter 的方式不同,但它确实有效。

【讨论】:

    【解决方案2】:

    关键是绝对路径总是以'/'开头。 相对路径不得以“/”开头。这至少是给您带来问题的部分原因。

    对于其余的,你说“它不起作用”。但是什么不起作用?

    【讨论】:

    • 你会在:'c:/Path/Textfile.txt' 前面加一个'/'吗?我正在使用“字符串文件 =”/”+sourcePackage+“/”+fileNameWithExtension;”在我的代码中,这是一个相对路径,但我前面有'/'并且它有效。这是歧义,还是通过解析以某种方式消除?
    • 如果这适用于 Mac,我会感到惊讶。它当然应该在没有“/”的情况下工作,而且更便携。
    猜你喜欢
    • 2012-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-07
    • 2021-09-10
    • 1970-01-01
    • 1970-01-01
    • 2021-07-04
    相关资源
    最近更新 更多