使用Java创建具有相似名称的文件,而不覆盖现有文件

时间:2012-04-24 09:20:12

标签: java

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

例如: 如果我有一个文件: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 if with a flag变量将number作为前缀添加到文件名中。

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

5 个答案:

答案 0 :(得分:3)

不在@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));
    }
  }

答案 1 :(得分:2)

  

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

不在核心Java库中,没有。

答案 2 :(得分:2)

查看方法File.createTempFile()

  

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

答案 3 :(得分: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);
} 

答案 4 :(得分:0)

对于 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 ""
}