我在编写一个从文件夹中读取文件的程序,将它们存储在一个数组中,对其元素进行洗牌然后重命名它们时遇到了问题。这个想法是随机播放带有照片的文件夹,所以每次我想查看它们他们将处于一个完全不同的秩序。
下面是我使用util.Random随机化文件数组索引的方法。
public static File[] RandomizeArray(File[] array){
Random rgen = new Random(); // Random number generator
for (int i=0; i<array.length; i++) {
int randomPosition = rgen.nextInt(array.length);
File temp = array[i];
array[i] = array[randomPosition];
array[randomPosition] = temp;
}
return array;
}
这是我的主要内容:
public static void main(String[] argv) throws IOException {
String absolutePath = "C:\\Users\\test";
File dir = new File(absolutePath);
File[] filesInDir = dir.listFiles();
RandomizeArray(filesInDir);
for(int j = 0 ; j < filesInDir.length ; j++) {
String name = filesInDir[j].getName();
int p = name.indexOf('.');
String extension = name.substring(p + 1);
String newName = Integer.toString(j)+"."+extension;
String newPath = absolutePath + "\\" + newName;
filesInDir[j].renameTo(new File(newPath));
System.out.println(name + " changed to " + newName);
}
}
}
问题是,当我第一次在文件夹“test”上运行它时,一切顺利,我得到一个文件夹,其中包含0.jpg,1.mpeg,2.png等文件,但第二次有一些具有相同名称和实例的文件,例如,从12.jpg到14.jpg并跳过13。
我确定它的一些简单但我无法弄清楚是什么。
答案 0 :(得分:0)
我的猜测是它不仅会跳过一些数字,而且实际上会删除一些文件! 重命名文件时,最终可能会覆盖一些现有文件。举个例子:你有3个文件:0.jpg,1.jpg,2.jpg。它们应该重命名如下(改组的可能结果):
0.jpg -> 1.jpg
1.jpg -> 2.jpg
2.jpg -> 0.jpg
如果同时重命名所有文件,这将有效。但如果将它们重新命名,则第一次重命名(0.jpg -> 1.jpg
)将覆盖&#34; old&#34; 1.JPG。当&#34; old&#34;应该重命名1.jpg
,实际上新的1.jpg
(=旧0.jpg
)被重命名为2.jpg
,覆盖旧的&#34;} 2.jpg
。然后,该文件再次重命名为0.jpg
。
因此,您最终只会使用0.jpg
(在这种情况下实际上与原始0.jpg
相同),但您已被覆盖,从而丢失了其他人。
根据您的改组,您可能最终只会覆盖部分文件,因此会跳过一些数字。
如何解决? 2变种:
1)将文件移动到新目录,然后最后删除旧目录(它现在应该为空,因为所有文件都已移动)并将新目录重命名为原始目录的名称。 2)首先重命名文件以包括一些前缀,例如"tmp_" + j + "." + extension
,并且在重命名所有文件后,再次重命名文件以删除前缀。
两种变体都确保没有意外覆盖文件。