我正在使用java.io.FileWriter
构建一个不断写入同一文件的程序。
在运行期间,每当我需要更新文件时,我都会调用writes "properly"并使用类级别FileWriter的方法。问题从第二次.write
调用开始,当FileWriter将追加启动到文件时,而不是覆盖。
public class Example {
private FileWriter fw = new FileWriter("file's path", false);
public void writeToFile(String output) {
fw.write(output);
fw.flush();
}
}
我怀疑FileWriter" s"内存"保留以前写入的数据,但我不想为每次通话关闭并初始化它,因为它似乎很浪费。
.flush
来电后,我是否还需要.write
来电?.close
?(我尝试查看较旧的问题,但他们似乎都在处理赢得追加或理论FileWriter.flush
解释的文件编写者)
答案 0 :(得分:25)
问题从第二次.write调用开始,当FileWriter开始追加到文件时,而不是覆盖它。
是的,你有一个开放的作家。写入该编写器只会将其他文本写入该文件 - 就像在write
上多次调用OutputStream
将向流写入其他数据而不是覆盖现有数据每次通话。想象一下,如果你的代码有:
fw.write("first");
fw.flush();
fw.write("second");
fw.flush();
您是否希望用“秒”替换文件的整个内容?我不会 - 如果你两次致电writeToFile
,那就是这样。
如果您希望每次调用writeToFile
来完全替换文件的内容,您应该在方法中创建一个新的编写器,然后关闭编写器。
就个人而言,我会避免使用FileWriter
,因为它使用平台默认编码写入,这不是很好。
我会使用Files.write
编写一系列行到文件,或Files.newBufferedWriter
创建一个写入多个写调用。
答案 1 :(得分:2)
由于您为构造函数的第二个参数传递false
,FileWriter
将以“重写”模式启动。但是,只要您继续使用相同的FileWriter
对象,它就会继续附加到同一个文件。
您在班级的初始化程序中创建了FileWriter
,之后再也不会将其替换为另一个FileWriter
。这就是它继续附加到文件的原因。
如果您需要在某个时候替换文件,您有几个选择:
FileWriter
实例 - 您可以关闭旧的FileWriter
,然后重新制作新的Sub testLoopCustom()
Dim i As Long
Dim ii As Long
Dim LastRow As Long
Dim wb As Workbook
Dim wb1 As Worksheet
Dim sht2 As Worksheet
Dim sht3 As Worksheet
Dim sht4 As Worksheet
Dim sht5 As Worksheet
Set wb = ThisWorkbook
Set wb1 = wb.Sheets("source")
Set sht2 = wb.Sheets("sheet2")
Set sht3 = wb.Sheets("Sheet3")
Set sht4 = wb.Sheets("Sheet4")
Set sht5 = wb.Sheets("Sheet5")
'Find the last row (in column A) with data.
LastRow = wb1.Range("B:B").Find("*", searchdirection:=xlPrevious).Row
i = 2
'This is the beginning of the loop
For i = 2 To LastRow
'First sheet
sht2.Range("A2") = wb1.Range("B" & i).Value
sht2.Range("B2") = wb1.Range("C" & i).Value
sht2.Range("C2") = wb1.Range("D" & i).Value
sht2.Range("D2") = wb1.Range("E" & i).Value
i = i + 1
'Second sheet
sht3.Range("A2") = wb1.Range("B" & i).Value
sht3.Range("B2") = wb1.Range("C" & i).Value
sht3.Range("C2") = wb1.Range("D" & i).Value
sht3.Range("D2") = wb1.Range("E" & i).Value
i = i + 1
'Third sheet
sht4.Range("A2") = wb1.Range("B" & i).Value
sht4.Range("B2") = wb1.Range("C" & i).Value
sht4.Range("C2") = wb1.Range("D" & i).Value
sht4.Range("D2") = wb1.Range("E" & i).Value
i = i + 1
'Second sheet
sht5.Range("A2") = wb1.Range("B" & i).Value
sht5.Range("B2") = wb1.Range("C" & i).Value
sht5.Range("C2") = wb1.Range("D" & i).Value
sht5.Range("D2") = wb1.Range("E" & i).Value
i = i + 1
Next i
End Sub
。新编写器将覆盖现有文件,或RandomAccessFile
- 此类可让您“快退”到文件的开头。答案 2 :(得分:1)
Writer
(其中FileWriter
是子类)是documented在面向流的模型中工作,而不是例如随机访问模型。通过相同Writer
实例的连续写入总是会附加。要覆盖现有文件,您需要每次构建一个新的FileWriter
实例。无论如何,它实际上是一个相当便宜的操作。