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

Jus*_*ong 2 java csv maven

这是我的maven项目的结构:

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

src  
  --main  
    |-- java  
    |-- resources  
           |-- test.csv
test  
Run Code Online (Sandbox Code Playgroud)

目前,我正在尝试使用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);
Run Code Online (Sandbox Code Playgroud)

muc*_*aho 5

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

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

笔记

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

    rootModule   
    ?? childModule1   
    ?  ?? src    
    ?     ?? main    
    ?        ?? resources    
    ?? childModule2 
       ?? ...  
    
    Run Code Online (Sandbox Code Playgroud)

    然后相对路径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. RESOURCE_PATH从Java中的实用程序文件中提取属性
  4. 如果需要,重建项目(例如,如果文件/文件夹结构发生变化)

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>
Run Code Online (Sandbox Code Playgroud)

实用文件(src/main/resources/RESOURCE_PATH)

${RESOURCE_PATH}
Run Code Online (Sandbox Code Playgroud)

Java的

/**
 * 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());
}
Run Code Online (Sandbox Code Playgroud)

我希望有效.也许你需要maven资源:资源插件和做mvn generate-resources process-resources