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

时间:2014-02-05 02:25:40

标签: java maven csv

以下是我的maven项目的结构:

main和test文件夹在src文件夹下,java和resources文件夹在main文件夹下, 在资源文件夹中,有一个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);

2 个答案:

答案 0 :(得分:5)

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

  1. Tell Mavenresources文件夹的位置写入文件
  2. 阅读Java中resources文件夹的位置
  3. 使用该位置将文件写入
  4. 备注

    • 为什么要指定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
    4. 中的实用程序文件中提取RESOURCE_PATH属性
    5. 根据需要重建项目(例如,如果文件/文件夹结构发生变化)
    6. POM

      <project>
          ...
          <properties>
              <RESOURCE_PATH>${project.basedir}/src/main/resources</RESOURCE_PATH>
          </properties>
          ...
          <build>
              ...
              <resources>
                  <resource>
                      <directory>${RESOURCE_PATH}</directory>
                      <filtering>true</filtering>
                  </resource>
              </resources>
              ....
          </build>
          ...
      </project>
      

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

      ${RESOURCE_PATH}
      

      爪哇

      /**
       * Reads the relative path to the resource directory from the <code>RESOURCE_PATH</code> file located in
       * <code>src/main/resources</code>
       * @return the relative path to the <code>resources</code> in the file system, or
       *         <code>null</code> 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 resources:resources plugin并执行mvn generate-resources process-resources

答案 1 :(得分:0)

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

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

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

的操作

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

这将为您提供目标/类目录的路径,您可以使用双点

从此处导航到资源