通过资源读写Java文件

25

我想读写文件,但我希望通过Resource访问该文件。

这是我的做法

File f = new File(ClassLoader.getSystemResource("/blah/blah/Properties.prop").toURI());
BufferedReader br = new BufferedReader(new FileReader(f));
String line = br.readLine();

PrintWriter p = new PrintWriter(new File(ClassLoader.getSystemResource("/blah/blah/Properties.prop").toURI()));

但是似乎都不正确。那么做这件事的正确方式是什么?

3个回答

27

尝试以下输入:

     InputStreamReader isReader = 
                      new InputStreamReader(
                          this.getClass().getResourceAsStream(templateName));
      BufferedReader br = new BufferedReader(isReader);     
或者
     InputStreamReader isReader = 
                      new InputStreamReader(
                          <youclassName>.class.getResourceAsStream(templateName));
      BufferedReader br = new BufferedReader(isReader);   

尝试以下输出:

      PrintWriter writer = 
               new PrintWriter(
                     new File(this.getClass().getResource(templateName).getPath()));

应该以相同的方式工作,但不要同时读写同一个文件。 - Yogendra Singh
你能给我展示一下代码吗?我似乎无法让PrintWriter工作。 - CodeGuy
抱歉我错过了。getResourceAsStream 总是输入流。已为PrintWriter更新答案,请尝试。顺便问一下,读取器正常工作吗? - Yogendra Singh
1
应该提到,可能没有可写入的文件。如果资源是.jar文件的一部分,则写入将失败。(即使您可以修改jar文件,它也可能已签名或仅未位于运行jvm的计算机上...) - fabian

3
所有上述解决方案都展示了如何访问您在build文件夹中的资源。这意味着资源已经与.class文件一起移动到build目录中。
如果您需要将某些文件写入资源以便在终止程序后保存它们,那么您将需要描述从根项目开始的路径:

./src/main/resources/foo.ext

通常不建议采用这种解决方法,但在其他情况下可能是必要的。


我在自问,如果指向目标文件夹后是否有一种方法可以切换到原始资源路径。 - Salvatore Pannozzo Capodiferro

1
更简单地说,
 try (BufferedReader bufferedReader = Files.newBufferedReader(Paths.get(Resources.getResource("path").toURI()))) {
        //bufferedReader...
    }
    try (BufferedWriter bufferedWriter = Files.newBufferedWriter(Paths.get(Resources.getResource("path").toURI()))) {
        //bufferedWriter...
    }

注意路径是相对于资源文件夹的。

1
此解决方案似乎无法在资源嵌入到JAR文件中时起作用。 在我的情况下,资源的URI评估为"jar:file:/C:/PCProxAPI/PCProxAPI.jar!/com/agilysys/rguest/buy/peripherals/PCProxPlusConfig.cfg"Paths.get(...) 抛出java.nio.file.FileSystemNotFoundException - HairOfTheDog
6
对于其他想知道的人,Resources类实际上是com.google.common.io.Resources - HairOfTheDog
@HairOfTheDog,“Paths”实用程序只“知道”文件系统。一旦文件被打包在JAR中,它就不再是文件系统范例了。 - chaiyachaiya
@HairOfTheDog:我们可以考虑这样的方法: Files.streamToString(Resources.getResource("foo/bar.txt").openStream()); 即使文件被打包,它也能正常工作(Paths.get方法会抛出异常)。 - chaiyachaiya
我尝试过这个,但它并没有在资源文件夹中创建outputstream,而是在目标文件夹中创建了。 - dardy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接