如何将文本输出到资源文件夹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
文件夹中的文件,但该过程有点单调乏味。
- 告诉Maven将
resources
文件夹的位置写入文件 - 在Java中读取
resources
文件夹的位置 - 使用该位置将文件写入
笔记
-
为什么还要指定
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()
的帮助下访问新创建的资源文件,您必须重新编译并重新启动应用程序。 但是,您仍然可以通过用于编写文件的位置访问它。
指南
- 将
RESOURCE_PATH
属性添加到Maven pom,并告诉Maven编译资源文件中的属性 - 添加一个实用程序文件
src/main/resources/RESOURCE_PATH
,它只包含RESOURCE_PATH
属性 - 从Java中的实用程序文件中提取
RESOURCE_PATH
属性 - 如果需要,重建项目(例如,如果文件/文件夹结构发生变化)
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 theresources
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(“/”);
这将为您提供目标/类目录的路径,您可以使用双点从这里导航到资源