【问题标题】:How to output text to a file in resource folder Maven如何将文本输出到资源文件夹Maven中的文件
【发布时间】:2014-02-05 02:25:39
【问题描述】:

这是我的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);

【问题讨论】:

  • 您不能用 Java 覆盖类路径中的文件。这与 Maven 无关。
  • 资源(通常)与您的类一起压缩到 JAR 文件中,并从文件系统文件中抽象出来。这是您只能使用 ClassLoader 将它们作为 InputStreams 读取的另一个原因。即使可以,这也是不好的做法。建议您从资源中读取初始 CSV,然后将更新后的版本保存到用户目录或其他逻辑位置。

标签: java maven csv


【解决方案1】:

可以将文本输出到resources 文件夹中的文件,但过程有点繁琐。

  1. Tell Mavenresources 文件夹的位置写入文件
  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. 在 Maven pom 中添加 RESOURCE_PATH 属性,并告诉 Maven 编译资源文件中的属性
  2. 添加一个实用文件src/main/resources/RESOURCE_PATH,它只包含RESOURCE_PATH属性
  3. 从 Java 实用程序文件中提取 RESOURCE_PATH 属性
  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>

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

${RESOURCE_PATH}

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

我希望这有效。也许你需要maven resources:resources plugin 并做mvn generate-resources process-resources

【讨论】:

  • 我知道这个答案已经 4 岁了,但也许你仍然可以帮助我。当我调用 System.class.getResource("/RESOURCE_PATH") 它返回 null @mucaho
【解决方案2】:

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

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

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

Thread.getclassloader().get resource("/");

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

【讨论】:

  • 社区管理器 - 没有简单的方法来格式化回答 frkm android 应用
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-18
  • 1970-01-01
相关资源
最近更新 更多