Это не дубликат «Подсчета количества файлов в каталоге с использованием Java», поскольку главный вопрос здесь - «Как получить случайный файл из случайной папки». Подсчет количества файлов был просто необязательным вопросом для улучшения.
У меня есть папка "testfiles" в каталоге моего проекта, которая содержит много других папок. Эти папки имеют имена, такие как «alice-g» (имя, а затем первая буква из фамилии). Каждая из этих папок содержит некоторые другие папки, не всегда одинаковые номера. И в каждой из этих последних папок я получил несколько файлов, названных по номерам («1.», «2.», «3.» и т. Д.).
То, что я хочу сделать, - это зайти в этот каталог «testfiles», случайно выбрать папку, получить его имя, затем случайным образом выбрать другую папку в ней и, наконец, выбрать случайный файл в этой папке (и получить его имя).
Я нашел это сообщение , в котором говорится, что мы можем выбрать случайный файл из папки следующим образом:
File[] files = dir.listFiles();
Random rand = new Random();
File file = files[rand.nextInt(files.length)];
Это звучит ясно и легко для меня. Однако, так как все мои файлы имеют «легко пронумерованные имена», мне интересно, есть ли способ сделать это без составления списка всех файлов. Получение общего количества файлов в каталоге должно быть достаточно для меня, так как их имена просто числа с "."
Во-вторых, это решает проблему выбора случайного файла, а не выбора случайного каталога (и получения его имени).
EDIT:
Я также нашел этот пост , в котором говорится, что «хорошее решение» (быстрое) для подсчета количества файлов ИЛИ каталогов в каталоге:
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;
}
Первая функция работает хорошо; однако, во втором списке имен каталогов нет. Так как это тот же код, что и раньше, я не понимаю, почему.