我想知道是否可以创建具有相似名称的多个文件,而不会覆盖当前文件。
例如: 如果我有一个文件: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命令可以避免覆盖现有文件。
答案 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)
要创建新文件,可以首先调整前缀和后缀以适应底层平台的限制。如果前缀太长,那么它将被截断,但它的前三个字符将始终保留。如果后缀太长,那么它也会被截断,但如果它以句点字符('。')开头,则句点和后面的前三个字符将始终保留。完成这些调整后,将通过连接前缀 五个或更多内部生成的字符 和后缀来生成新文件的名称。
答案 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 ""
}