我正在尝试将数据动态写入Java中的资源文件,但似乎无法成功。有可能吗?我尝试了几种方法,但是都没有用。
我有一个主要方法代表:
public static void main(String[] args) throws Exception {
ClassLoader loader = ClassLoader.getSystemClassLoader();
File file = new File(loader.getResource("authors/authors.log").getFile());
FileWriter writer = new FileWriter(file);
System.out.println(file.getAbsolutePath());
writer.write("Test test \n");
writer.flush();
System.out.println(file.getAbsolutePath());
writer.write("Test 2");
writer.flush();
writer.close();
}
执行main方法后,不会引发异常,但是authors.log文件似乎没有更改,也没有写入任何数据。
文件为:
src / main / java / main / Main.java
src / main / resource / authors / authors.log
target / classes / authors / authors.log
但是,目标目录包含一个authors.log
文件,所有数据都写入那里。
我在某个地方错了吗,或者只是Java不允许写入资源文件?
如果是这样,最好是在哪里存储由程序更改的文件(例如日志文件)
答案 0 :(得分:3)
但是目标目录包含一个authors.log文件和所有 数据写在那里。
由于它是您打开和修改的文件,因此非常值得期待。
以下语句使用类加载器来检索文件而不是文件系统:
File file = new File(loader.getResource("authors/authors.log").getFile());
因此它将检索位于target/classes
的文件,而不是位于src/main/resources
的文件。
通过指定当前工作目录的相对路径来使用文件系统,以能够更改src/main/resources
的内容:
例如:
File file = new File("src/main/resources/authors/authors.log");
或者使用java.nio
API更好:
Path file = Paths.get("src/main/resources/authors/authors.log");
如果是这样,最好的地方是存储由 程序(例如日志文件)
除了技术问题之外,您应该想知道为什么您的应用程序需要修改源代码。仅在非常特殊的情况下才可以这样做。
例如,日志文件不必位于源代码中,它们必须位于源代码项目之外,因为它们不属于应用程序源代码,并且也不是构建应用程序的工具。