java - 了解在 Java 中创建新文件的具体工作原理
问题描述
我有一段代码大部分都可以工作,但我不明白为什么。这是说明问题的代码的简化版本:
String thisdir = System.getProperty("user.dir");
String newdir = thisdir + "\\src\\test\\resources\\Test.txt";
File input = new File(newdir);
FileWriter writer = new FileWriter(input);
for (int i = 0; i < 1; i++) {
writer.write("completed");
}
for (int i = 0; i < 2; i++) {
writer.write(System.getProperty( "line.separator" ));
writer.write("completing");
}
String path = Paths.get(this.getClass().getResource("/Test.txt").toURI()).toFile().getPath();
代码在 \src\test\resources 目录中创建“Test.txt”。然后它在第一行写入“完成”,然后在接下来的两行中写入“完成”x2。最后,它将“路径”定义为文件的路径。
我的问题是:
- 假设在 \src\test\resources 目录中,我创建了一个 Test.txt 文件并在其中添加了一些随机文本。然后,在我运行此代码后,随机文本消失并被“完成”和“完成”x2 取代。为什么?我没有使用任何方法,例如
trim
删除文本。我的第一个猜测是Java只是覆盖了文本(而不是删除所有内容并从空白文件开始),但是当我测试它不起作用时——如果这个假设是真的,那么如果我用i < 1
in重新运行代码写“完成”的for
循环,文件应该仍然包含两行“完成”,但它没有。 - 相反,如果我在 \src\test\resources 目录中没有文件开始,则定义的行将
path
返回 NullPointerException。为什么?较早的代码应该在该文件夹中创建了“Test.txt”(当然在我运行代码之后它就在那里),并且应该检测到该文件。如果我从目录中的 Test.txt 文件开始,那么代码也可以正常工作并path
返回预期的输出。
我看到的教程似乎表明如果文件已经存在,Java 将不会创建新文件。但是,它并不能解释我的任何一个问题。
解决方案
对于打开文件进行写入时的第一个问题(就像创建FileWriter时一样),它被清除,长度设置为 0。如果要追加,则需要打开文件进行追加。有一个带有布尔附加标志的构造函数,您可以使用它。
第二个问题getClass().getResource("/Test.txt")
是指通常在目标/类或 bin 中找到的编译资源。如果您从 src/resources 中删除该文件,它将不会被构建,并且目标目录中没有文件。运行程序时在 src 中创建文件无济于事;到那时为时已晚。找不到资源,您会得到一个NullPointerException
.
推荐阅读
- reactjs - Reactstrap 不适用于 Razzle 服务器端渲染
- c - 为什么在 C 中执行期间不保存文件?
- c# - 如何查找属于特定日期范围的日期时间列表
- flutter - Flutter Future 和 StatefulWidget 的生命周期如何处理
- javascript - Xcode 13 mac m1 芯片谷歌登录构建为 iOS 模拟器提供构建,但链接到为 iOS 构建的目标文件
- node.js - Angular框架中nativescript中的源代码运行问题
- azure - Azure 数据工厂中的动态日期
- ios - Firebase 和 iOS 15 - 无法联系 Recaptcha。检查您的连接并重试
- elasticsearch - 类型错误:__init__() 缺少 1 个必需的位置参数:“内容”
- c - 如何提高生成 32 位随机素数的速度?