5

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

例如:如果我有一个文件: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 命令可以避免覆盖现有文件。

4

5 回答 5

4

不在 java 中,如@Greg Kopff. 但是你可以解决这样的问题:

  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));
    }
  }
于 2012-04-24T09:30:44.400 回答
2

我想知道是否有任何本机 java 命令可以停止覆盖 [并将数字附加到文件名]

不在核心 Java 库中,不。

于 2012-04-24T09:21:39.220 回答
2

看一下方法File.createTempFile()

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

于 2012-04-24T09:26:56.710 回答
1

虽然类似于 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);
} 
于 2015-07-30T05:19:59.813 回答
0

对于科特林

以下是使用 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请记住,当您第一次调用它时,只需在param中传递空字符串。像这样 :createFile(nameTest.txt, addedEx: "")

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

名称测试.txt

名称Test_(1).txt

名称Test_(2).txt

名称Test_(3).txt

名称Test_(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 ""
}
于 2021-07-13T08:26:42.020 回答