【问题标题】:How to overwrite a file in java [closed]如何在java中覆盖文件[关闭]
【发布时间】:2013-11-20 06:47:22
【问题描述】:

在我的程序中,我尝试读取文件,然后尝试使用 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,我也获得了空文件。有人可以解释一下这种行为吗?

【问题讨论】:

  • 首先读取内容,进行更改并将其存储在一些变量中,关闭文件,现在以写入模式打开文件并将变量的内容粘贴到该文件中。
  • 我很困惑。是要覆盖现有内容,还是要追加到现有内容?

标签: java io java-io


【解决方案1】:

根据您的代码和 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() 来确保将内容刷新到磁盘。

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

      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 不是一个好的编程习惯,除非你打算用它做点什么。

      【讨论】:

      • 是的,我以前也这样做过,但我知道这不是一个好方法
      • 你的问题有点误导。当您说覆盖文件时,通常意味着从文件的开头开始写入,如果已经存在任何文本,则将其删除。为此,您的代码可以正常工作 reference 。现在如果你想追加到现有文件,那么你可以使用 PrintWriter 类的 append() 函数。
      • 那么,既然代码应该可以正常工作,为什么还要麻烦删除文件呢?
      • 这看起来像是对您问题的直接回答。但是 PrintWriter 的 print() 函数确实会覆盖内容。这解释了为什么您的原始内容会被删除。如上一条评论所述,如果您希望保留原始内容,请使用 append()。
      猜你喜欢
      • 2021-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-07
      • 2019-02-20
      • 1970-01-01
      • 2012-11-23
      相关资源
      最近更新 更多