[英]How to get a random file from a random folder
这与“使用Java计算目录中文件的数量”不是重复的,因为这里的主要问题是“如何从随机文件夹中获取随机文件”。 计算文件数只是一个可选的改进问题。
我的项目目录中有一个文件夹“ testfiles”,其中包含许多其他文件夹。 这些文件夹的名称都类似“ alice-g”(名字,然后是姓氏的第一个字母)。 这些文件夹中的每一个都包含一些其他文件夹,但并不总是相同。 在每个最后的文件夹中,我有一堆文件,每个文件都用数字命名(“ 1。”,“ 2。”,“ 3。”,依此类推)。
我要做的是进入这个“ testfiles”目录,随机选择一个文件夹,获取他的名字,然后随机选择其中的另一个文件夹,最后在该文件夹中选择一个随机文件(并获取他的名字)。
我发现这篇文章说我们可以这样从文件夹中选择一个随机文件:
File[] files = dir.listFiles();
Random rand = new Random();
File file = files[rand.nextInt(files.length)];
对我来说,这听起来很简单。 但是,由于我的所有文件都有“简单编号的名称”,我想知道是否有一种方法可以在不列出所有文件的情况下进行操作。 对我来说,获取目录中文件的总数应该足够,因为它们的名称只是带有“。”的数字。
其次,这解决了选择随机文件的问题,而不是选择随机目录的问题(并获得他的名字)。
编辑:我还发现这篇文章 ,其中说“一个好的解决方案”(快速)来计算目录中文件或目录的数量是:
File hugeDir = new File("/tmp/huge-dir");
int numberFiles = hugeDir.list().length;
我完全不知道我们可以用目录创建File对象。 对我来说似乎很奇怪。 但是,我想它可以解决我的两个问题:选择一个随机目录并获取他的名字,我这样做:
//Get a random client name according to directories names:
private static String getRandomClient() {
File testFiles = new File("testfiles"); //directory where all my testfiles are (in other directories)
Random rand = new Random();
String[] dirNames = testFiles.list(); //making a list() seems to be faster than making a listFiles().
File randomNamedDirectory = new File(dirNames[rand.nextInt(dirNames.length)]);
String randomDirName = randomNamedDirectory.getName();
return randomDirName;
}
然后,我想从此客户端目录的随机目录中获取随机文件:
//Get a random File Path from the client Directory:
private static String getRandomFilePath(String clientDirectory) {
File clientDir = new File("testfiles\\"+clientDirectory); //client Directory.
System.out.println(clientDir);
Random rand = new Random();
String[] dirNames = clientDir.list(); //This return null!?
System.out.println(dirNames);
File randomDirectory = new File(dirNames[rand.nextInt(dirNames.length)]);
int numberFiles = randomDirectory.list().length;
String randomFile = rand.nextInt(numberFiles) + "."; //All files are named with their number and a .
String filePath = clientDir + "\\" + randomDirectory +"\\" + randomFile;
return filePath;
}
第一个功能运行良好; 但是,在第二个目录中,目录名称列表为空。 由于它与以前的代码相同,所以我不明白为什么。
因此,经过一番研究,我发现:1.似乎没有比列出文件列表更好的解决方案了。 但是,使用list()而不是listFiles()似乎更快(请参阅问题的EDIT部分中引用的文章)
。
import java.io.File;
public class main {
public static void main(String[] args) throws Exception{
String client = getRandomClient();
String filePath = getRandomFilePath(client);
File file = new File(filePath);
}
//Get a random client name according to directories names:
private static String getRandomClient() {
File testFiles = new File("maildir"); //directory where all my testfiles are (in other directories)
Random rand = new Random();
String[] dirNames = testFiles.list();
File randomNamedDirectory = new File(dirNames[rand.nextInt(dirNames.length)]);
String randomDirName = randomNamedDirectory.getName();
return randomDirName;
}
//Get a random File Path from the client Directory:
private static String getRandomFilePath(String clientDirectory) {
File clientDir = new File("maildir/"+clientDirectory); //client Directory.
System.out.println(clientDir);
Random rand = new Random();
String[] dirNames = clientDir.list();
File randomDirectory = new File(clientDir +"/" + dirNames[rand.nextInt(dirNames.length)]);
int numberFiles = randomDirectory.list().length;
String randomFile = rand.nextInt(numberFiles) + "."; //All files are named with their number and a .
String filePath = randomDirectory + "/" + randomFile;
return filePath;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.