【问题标题】:Writing to a file without overwriting or appending写入文件而不覆盖或附加
【发布时间】:2012-06-18 19:40:52
【问题描述】:

我正在用 Java 编写一个程序,其中的输出被写入 .txt 文件。每次我运行程序时,文件都会被覆盖。我不想使用附加开关并将数据添加到文件中。

我想要它,所以每次运行程序时都会创建一个同名的新文件。比如overflow.txt是文件名,我运行程序3次,就应该生成文件overflow(1).txtoverflow(2).txtoverflow(3).txt

如何做到这一点?

【问题讨论】:

  • overflow(1).txt 和overflow(2).txt 不是同一个文件;他们有不同的名字。

标签: java file append overwrite


【解决方案1】:

检查文件是否存在,如果存在则重命名。使用File.existsFileUtils.moveFile

您需要递归执行此操作,直到没有发现冲突。

【讨论】:

    【解决方案2】:

    先检查文件是否存在。如果是,请修改名称。

    String origName = "overflow";
    String ext = ".txt";
    int num = 1;
    file = new File(origName + ext);
    while (file.exists()) {
     num++;
     file = new File(myOrigFileName +"(" + num + ")" + ext);
    }
    

    根据实际需要修改。问题不是很清楚。

    【讨论】:

      【解决方案3】:

      “具有相同名称的新文件”在大多数文件系统中没有意义。

      在您的示例中,您有三个具有不同名称的文件:

      • 溢出(1).txt
      • 溢出(2).txt
      • 溢出(3).txt

      括号中的位仍然是名称的一部分。如果你想模仿这种行为,你必须:

      • 检测“普通”文件名是否存在(如果您想写入该文件名,如果它不存在)
      • 从 1 开始计数,每次通过删除扩展名、将计数添加到括号中、然后放回扩展名来计算“新”文件名
      • 继续计数,直到找到不存在的文件名

      【讨论】:

      • 我认为他想要一个翻转,第一次创建 overflow.txt 然后在下次运行应用程序时重命名为 overflow(2).txt。听起来像一个 log4j 文件滚动系统。
      • @JonSkeet 我很抱歉,你是对的。我列出的是三个不同的文件。但是是否可以有多个同名但数据不同的文件?
      • @Paul:不。至少,在大多数文件系统中不是。如果不叫名字,你怎么区分它们?
      【解决方案4】:
      String dirPath = "./";
      String fileName = dirPath + "overflow.txt";
      if(new File(dirPath + fileName).exist())
      {
          int counter = 0;
          while(new File(dirPath + "overflow(" + ++counter + ").txt").exist());
          fileName = "overflow(" + counter + ").txt";
      }
      

      【讨论】:

        【解决方案5】:

        当你实例化 File 对象时,验证它是否存在,如果存在,只需通过添加大括号和数字来重命名它,然后再次检查。

        【讨论】:

        • 需要有一个递归方法来确保重命名不会冲突。
        • 是的,这就是为什么我说再次检查xD
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-28
        • 2011-05-08
        • 1970-01-01
        • 1970-01-01
        • 2012-04-15
        • 2015-04-29
        • 1970-01-01
        相关资源
        最近更新 更多