如何将文本输出到资源文件夹Maven中的文件

这是我的maven项目的结构:

main和test文件夹在src文件夹下,java和resources文件夹在main文件夹下,在resources文件夹中,有一个csv文件可供读取。

src --main |-- java |-- resources |-- test.csv test 

目前,我正在尝试使用supercsv库覆盖test.csv文件。

我知道public CsvMapWriter(Writer writer, CsvPreference preference)方法对此有所帮助。

所以,我正在尝试使用OutputStreamWriter,但是如何访问该文件就像使用:

  InputStreamReader reader = new InputStreamReader(getClass().getClassLoader().getResourceAsStream("acacia_implexa.csv")); mapReader = new CsvMapReader(reader, CsvPreference.STANDARD_PREFERENCE); 

可以将文本输出到resources文件夹中的文件,但该过程有点单调乏味。

  1. 告诉Maven将resources文件夹的位置写入文件
  2. 在Java中读取resources文件夹的位置
  3. 使用该位置将文件写入

笔记

  • 为什么还要指定resources文件夹文件的位置? 不是src/main/resources总是吗? 好吧,不,如果你有一个嵌套的模块结构

     rootModule ├─ childModule1 │ └─ src │ └─ main │ └─ resources └─ childModule2 └─ ... 

    然后相对路径src/main/resources解析为不存在的parentModule/src/main/resources

  • 将文件写入resources文件夹后,将无法通过Class.getResource()访问该文件。 Class.getResource()为您提供对类路径中文件的读访问权。 在“编译”期间,位于resources文件夹中的文件将“复制”到二进制输出文件夹(读取类路径)。 为了在Class.getResource()的帮助下访问新创建的资源文件,您必须重新编译并重新启动应用程序。 但是,您仍然可以通过用于编写文件的位置访问它。

指南

  1. RESOURCE_PATH属性添加到Maven pom,并告诉Maven编译资源文件中的属性
  2. 添加一个实用程序文件src/main/resources/RESOURCE_PATH ,它只包含RESOURCE_PATH属性
  3. 从Java中的实用程序文件中提取RESOURCE_PATH属性
  4. 如果需要,重建项目(例如,如果文件/文件夹结构发生变化)

POM

  ...  ${project.basedir}/src/main/resources  ...  ...   ${RESOURCE_PATH} true   ....  ...  

实用程序文件( src/main/resources/RESOURCE_PATH

 ${RESOURCE_PATH} 

Java的

 /** * Reads the relative path to the resource directory from the RESOURCE_PATH file located in * src/main/resources * @return the relative path to the resources in the file system, or * null if there was an error */ private static String getResourcePath() { try { URI resourcePathFile = System.class.getResource("/RESOURCE_PATH").toURI(); String resourcePath = Files.readAllLines(Paths.get(resourcePathFile)).get(0); URI rootURI = new File("").toURI(); URI resourceURI = new File(resourcePath).toURI(); URI relativeResourceURI = rootURI.relativize(resourceURI); return relativeResourceURI.getPath(); } catch (Exception e) { return null; } } public static void main(String[] args) throws URISyntaxException, IOException { File file = new File(getResourcePath() + "/abc.txt"); // write something to file here System.out.println(file.lastModified()); } 

我希望有效。 也许您需要maven资源:资源插件并执行mvn generate-resources process-resources

您可以覆盖该文件,但这只能在IDE中运行,如果它将作为jar的一部分执行,它将失败,因为它不再是文件(其文件在文件中)

最好外部化文件并从该位置读取/覆盖

如果您仍想阅读此文件并覆盖它,那么您可以执行类似的操作

Thread.getclassloader()。get resource(“/”);

这将为您提供目标/类目录的路径,您可以使用双点从这里导航到资源