Прочитать все файлы из папки, начиная со второго файла в Java - PullRequest
0 голосов
/ 11 октября 2018

У меня есть несколько файлов в папке, и я хочу прочитать первый файл и выполнить некоторые операции, а после первой итерации я хочу прочитать файлы из 2-го отделения, чтобы выполнить другой набор операций.

Как я могу это сделать?

    File folder=new File(Folder);            
    File[] listOfFiles=folder.listFiles();          

        for(File file:listOfFiles)
        {
            //Do something
        }
        //Here I want to read from the 2nd file to do different set of operations

Ответы [ 3 ]

0 голосов
/ 11 октября 2018

Согласно вашему комментарию, вам не нужно сортировать список файлов в определенном порядке, прежде чем обрабатывать их.В этом случае

File folder=new File(Folder);            
File[] listOfFiles=folder.listFiles();          

//use a normal for loop to keep track of the index
for(int i=0; i<listOfFiles.length; i++){
   //the file in the current index of iteration
   File currentFile = listOfFiles[i];
   if(i==0){
      //Do something with first file
   }
   else{
      //Here I want to read from the 2nd file to do different set of operations
   }
}

В приведенном выше коде код операции для первого файла в блоке if и код для остальных файлов в else блок

0 голосов
/ 11 октября 2018

Больше не используйте java.io.File, используйте java.nio - это уже пару лет!Помимо более простого использования - включая потоки Java 8, одно преимущество заключается в том, что вы не ограничены файловой системой системы по умолчанию.Вы можете даже использовать файловую систему в памяти, такую ​​как Google JimFS .Как отмечают другие, нет никакой гарантии на порядок файлов.Вы можете однако ввести собственную сортировку:

FileSystem fs = FileSystems.getDefault(); // use a file system of your choice here!
Path folder = fs.getPath(...);

Files.newDirectoryStream(folder)
     .sorted((a, b) -> { ... })
     // this realizes the skipping of the first element you initially requested:
     .skip(1)
     .forEach(f -> { ... });

Если вы хотите выполнить действие A с первым элементом и действие B со вторым, это может оказаться немного сложнее: вы можетеопределите логическое значение firstFileHasBeenProcessed как внешнюю зависимость, которое будет установлено на true после обработки первого файла, но я не уверен, будут ли потребители всех файлов работать строго последовательно - или еслиобработка первого файла может быть прервана, чтобы начать обработку seond, прежде чем этот флаг может быть установлен.

Вы всегда можете отобразить поток в массив ...

final Path[] allFiles = Files.newDirectoryStream(folder)
                      .sorted((a, b) -> { ... })
                      .toArray(Path[]::new);

..или список, чтобы получить больше контроля.

final List<Path> allFiles = Files.newDirectoryStream(folder)
                          .sorted((a, b) -> { ... })
                          .collect(Collectors.toList());

boolean firstHasBeenProcessed = false;
for (final Path currentFile: allFiles) {
    if (firstHasBeenProcessed) {
        processAsFollowUpFile(currentFile);
    } else {
        processAsFirstFile(currentFile);
        firstHasBeenProcessed = true;
    }
}
0 голосов
/ 11 октября 2018

Получите первый файл как listOfFiles[0] и выполните над ним операцию 1.

Затем используйте простой (обычный) цикл для , начиная с индекса 1.

for (int i = 1; i < listOfFiles.length; i++) {
   File currentFile = listOfFiles[i];
   //do Operation 2 with currentFile
}

Примечание от javadoc Files.listFiles

Нет гарантии, что строки имени в результирующем массиве появятся в каком-либо конкретномпорядок;в частности, они не гарантированы в алфавитном порядке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...