【问题标题】:Create files with similar names using Java without overwriting existing file使用 Java 创建具有相似名称的文件而不覆盖现有文件
【发布时间】:2021-07-13 16:26:42
【问题描述】:

我想知道是否可以创建多个具有相似名称的文件,而不会覆盖当前文件。

例如: 如果我有一个文件:xyz.txt 下次我创建它时应该是:xyz(1).txt

try {
  File makefile = new File("output.txt");
  FileWriter fwrite = new FileWriter(makefile);
  fwrite.write("example file");
  fwrite.flush();
  fwrite.close();
} catch (IOException e) {
  e.printStackTrace();
}

所以如果我重新运行这个程序,我的当前文件不应该被覆盖。我已经尝试过使用标志变量将数字作为前缀添加到文件名的 if 条件。

我想知道是否有任何 Java 命令可以避免覆盖现有文件。

【问题讨论】:

    标签: java


    【解决方案1】:

    @Greg Kopff 已经指出,不在 java 中。 但是你可以解决这样的问题:

      int count = 0;
    
      public void createFile(String name) throws IOException
      {
        File f;
        f = new File(name);
        if (!f.exists())
        {
          f.createNewFile();
        }
        else
        {
          count++;
          createFile(name + (count));
        }
      }
    

    【讨论】:

    • 已经这样做了。在我的帖子中提到过,但感谢您的回复:)
    • 如果是这种情况,那么你就在正确的轨道上 - 你需要告诉 java 不要替换现有文件 - 否则 java 默认会将文件截断为空并将其替换为当前值提交给它。
    • 这个解决方案不是线程安全的,我们应该依赖 createNewFile() 的返回标志,因为 createNewFile() 会自动创建文件,如果文件已经存在则返回 false。
    【解决方案2】:

    我想知道是否有任何本机 java 命令来停止覆盖[并在文件名后附加一个数字]

    不在核心 Java 库中,不。

    【讨论】:

    • 哈哈猜我会用同样的然后:)
    【解决方案3】:

    看看方法File.createTempFile()

    要创建新文件,可以先调整前缀和后缀以适应底层平台的限制。如果前缀太长,那么它将被截断,但它的前三个字符将始终保留。如果后缀太长,它也会被截断,但如果它以句点字符 ('.') 开头,则句点和其后的前三个字符将始终保留。完成这些调整后,新文件的名称将通过连接前缀、五个或更多内部生成的字符和后缀生成。

    【讨论】:

    • @Greg Kopff - 有一个重载方法将目录作为参数之一,允许您在指定目录中创建文件,而不是始终默认为 temp。
    • +1:这是最合适的方式。如果您将目录传递给该方法,它将存储您告诉它的位置。只要不使用deleteOnExit() 方法,文件就不会被删除。另外,你写的是createTimeFile() 而不是createTempFile() :)
    • @Deco - 感谢您发现错字
    【解决方案4】:

    虽然类似于 Bitmap 的响应,但我想出了这个 java 代码(似乎可以工作)。我不知道这是否最有效,但是...

    对于我的示例,我假设该文件将是一个 .txt 文件

    String fileName = "output.txt"; 
    File aFile = new File(fileName);
    
    int fileNo = 0;
    while(aFile.exists() && !aFile.isDirectory()) { 
        fileNo++; 
        String newName = fileName.replaceAll(".txt", "(" + fileNo + ").txt");   
        aFile = new File(newName);
    } 
    

    【讨论】:

      【解决方案5】:

      对于 kotlin

      这是使用 Kotlin 创建具有相似名称的文件而不覆盖现有文件的代码:

      var fileNo = 0
      
      @Throws(IOException::class)
      fun createFile(name: String, addedEx: String): File {
          val originalName = name.replace(addedEx,"")
          val f = File(name)
          return if (!f.exists()) {
              f
          } else {
              fileNo++
              val file = createFile("${name.substring( 0, originalName.indexOf("."))}_($fileNo).${getExtension(originalName)}","_($fileNo)")
              fileNo = 0
              file
          }
      }
      

      请记住,当您第一次调用它时,只需在 addedEx 参数中传递空字符串。像这样:createFile(nameTest.txt, addedEx: "")

      如果保存此文件 5 次, 输出将是:

      nameTest.txt

      nameTest_(1).txt

      nameTest_(2).txt

      nameTest_(3).txt

      nameTest_(4).txt

      如果你想要扩展获取功能:

      fun getExtension(name: String?): String? {
          val fileNameFromURL = Uri.parse(name).lastPathSegment
          if(fileNameFromURL != null && fileNameFromURL.lastIndexOf('.') >= 0)
          {
              return fileNameFromURL.substring(fileNameFromURL.lastIndexOf('.')+1)
          }
          return ""
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-07-25
        • 2019-10-10
        • 1970-01-01
        • 2023-04-05
        • 1970-01-01
        • 2016-06-28
        • 2018-08-22
        相关资源
        最近更新 更多