如何在java中覆盖文件

时间:2013-11-20 06:47:22

标签: java io java-io

在我的程序中,我正在尝试读取该文件,然后尝试使用txtFile方法覆盖该文件。 f是我正在阅读并对其内容进行操作的文件,现在想用新字符串s替换其内容。

                    String s = obj1.method(string);
                    toFile(s, f);

我的txtFile方法如下:

public static void txtFile(String cnvrt, File file)                 
{   
    try
    {
        PrintWriter printWriter = new PrintWriter (file);
        printWriter.print(cnvrt);
        printWriter.close ();           
    }
    catch(Exception exception)
    {
        exception.printStackTrace();
    }
}

执行此操作时,我的原始内容将被删除,文件将变空。请建议我如何使用printWriter类覆盖同一个文件?即使我使用FileWriterBufferedReader,我也获得了空文件。有人能解释一下这种行为吗?

3 个答案:

答案 0 :(得分:0)

根据您的代码和API,它应该有效(OP想要替换内容)。

请参阅http://docs.oracle.com/javase/7/docs/api/java/io/PrintWriter.html#PrintWriter(java.io.File)

file - 要用作此writer的目标的文件。如果该文件存在,那么它将被截断为零大小;否则,将创建一个新文件。输出将被写入文件并被缓冲。

<强>更新

在调用PrintWriter printWriter = new PrintWriter (file);之前,您应该先关闭文件,以确保文件没有锁定。

此外,与PrintStream类不同,如果启用了自动刷新,则只有在调用println,printf或format方法之一时才会执行,而不是每当输出换行符时都会执行。

因此请使用printWriter.flush()确保将内容刷新到磁盘。

当然,您应该检查以确保您写入的内容有效且不为空。

答案 1 :(得分:0)

如果你想用文件中的更改/更改/更新信息覆盖文件,我可以想到两种方法

1)使用StringBuilder附加每条所需/更改的行,然后将StringBuilder#toString()打印到文件中。这将使用更新的信息覆盖文件

2)将每个所需/更改的行写入临时文件,然后将临时文件重命名为旧文件名。见Answer

答案 2 :(得分:-1)

为什么不简单地删除并创建新的?

public static void txtFile(String cnvrt, File file)
{
    PrintWriter printWriter = null;
    String filepath = file.getAbsolutePath();
    try {
        if(file.exists()){
            file.delete();
        }
        printWriter = new PrintWriter(new File(filepath));
        printWriter.print(cnvrt);
        printWriter.close ();
    } catch (FileNotFoundException e) {
        e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
    }
}

注意:捕获RuntimeException并不是一个好的编程习惯,除非你打算用它做什么。