Как получить случайный файл из случайной папки - PullRequest
0 голосов
/ 31 августа 2018

Это не дубликат «Подсчета количества файлов в каталоге с использованием 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;
}

Первая функция работает хорошо; однако, во втором списке имен каталогов нет. Так как это тот же код, что и раньше, я не понимаю, почему.

1 Ответ

0 голосов
/ 31 августа 2018

Итак, после некоторых исследований я обнаружил, что: 1. Кажется, что на самом деле нет лучшего решения, чем составление списка файлов. Однако использование list () вместо listFiles () выглядит немного быстрее (см. Сообщение, процитированное в части вопроса EDIT)

  1. «Частичное решение», которое я даю в своем вопросе, содержит в себе несколько глупых ошибок (например, использование \ вместо /). Вот «минимальное и полное» решение:

.

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;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...