java.io.FileWriter是否仅为一次性使用而设计?

时间:2018-01-11 15:10:28

标签: java filewriter

我正在使用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"内存"保留以前写入的数据,但我不想为每次通话关闭并初始化它,因为它似乎很浪费。

  1. 每次.flush来电后,我是否还需要.write来电?
  2. 我是否有其他选择,但在每次通话时初始化FileWriter和.close
  3. (我尝试查看较旧的问题,但他们似乎都在处理赢得追加或理论FileWriter.flush解释的文件编写者)

3 个答案:

答案 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)

由于您为构造函数的第二个参数传递falseFileWriter将以“重写”模式启动。但是,只要您继续使用相同的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实例。无论如何,它实际上是一个相当便宜的操作。