FileWriter - 没有 try-with-resource 数据没有完全写入文件
FileWriter - without try-with-resource data is not fully written to file
我想将 100 万行写入文本文件。
当我使用没有try-with-resource
风格(不释放资源)的FileWriter时,我发现它停在998976左右。
...
998968
998969
998970
998971
998972
998973
998974
998975
998976
9
@Test
void writeTooLargeFileThisIsBad() throws IOException {
File newFile = new File("src/test/resources/targets/large.csv");
if (!newFile.exists()) newFile.createNewFile();
FileWriter writer = new FileWriter("src/test/resources/targets/large.csv", StandardCharsets.UTF_8);
for (int i = 1; i < 1000000; i++) {
writer.write(String.valueOf(i));
writer.write(System.lineSeparator());
}
}
但是当我尝试使用资源时,它正常完成。 (达到999999)
都很快。
为什么?
@Test
void writeTooLargeFileThisIsGood() throws IOException {
File newFile = new File("src/test/resources/targets/large.csv");
if (!newFile.exists()) newFile.createNewFile();
try (FileWriter writer = new FileWriter("src/test/resources/targets/large.csv", StandardCharsets.UTF_8)) {
for (int i = 1; i < 1000000; i++) {
writer.write(String.valueOf(i));
writer.write(System.lineSeparator());
}
} catch (Exception e) {
e.printStackTrace();
}
}
那是因为您没有在 writer
实例上调用 close()
方法 - 编写器定义了一些缓冲区,能够存储大量未写入的数据
当您使用 try-with-resource
方法时,close()
会被自动调用,因此每个数据都会被正确刷新
在此处阅读更多内容:
- BufferedWriter not writing everything to its output file
我想将 100 万行写入文本文件。
当我使用没有try-with-resource
风格(不释放资源)的FileWriter时,我发现它停在998976左右。
...
998968
998969
998970
998971
998972
998973
998974
998975
998976
9
@Test
void writeTooLargeFileThisIsBad() throws IOException {
File newFile = new File("src/test/resources/targets/large.csv");
if (!newFile.exists()) newFile.createNewFile();
FileWriter writer = new FileWriter("src/test/resources/targets/large.csv", StandardCharsets.UTF_8);
for (int i = 1; i < 1000000; i++) {
writer.write(String.valueOf(i));
writer.write(System.lineSeparator());
}
}
但是当我尝试使用资源时,它正常完成。 (达到999999)
都很快。
为什么?
@Test
void writeTooLargeFileThisIsGood() throws IOException {
File newFile = new File("src/test/resources/targets/large.csv");
if (!newFile.exists()) newFile.createNewFile();
try (FileWriter writer = new FileWriter("src/test/resources/targets/large.csv", StandardCharsets.UTF_8)) {
for (int i = 1; i < 1000000; i++) {
writer.write(String.valueOf(i));
writer.write(System.lineSeparator());
}
} catch (Exception e) {
e.printStackTrace();
}
}
那是因为您没有在 writer
实例上调用 close()
方法 - 编写器定义了一些缓冲区,能够存储大量未写入的数据
当您使用 try-with-resource
方法时,close()
会被自动调用,因此每个数据都会被正确刷新
在此处阅读更多内容:
- BufferedWriter not writing everything to its output file