Прочитать все файлы из папки, начиная со 2-го файла в Java

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

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

    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

Поймите, что нет никакой гарантии в порядке файлов, двойной запуск кода может привести к двум разным результатам.

MadProgrammer 11.10.2018 07:00

Какой первый файл по вашему требованию? Это первый файл, отсортированный по алфавиту?

Aniket Paul 11.10.2018 07:07

Нет. Это всего лишь несколько XML-файлов, из которых я должен читать каждый XML-файл из папки для создания отчета. В основном мне нужно сравнить результаты каждого XML в двух разных средах. Итак, когда я читаю первый файл, он должен открывать обе среды в одном окне. Итак, теперь у него открыты 2 вкладки, а из второго файла на палатах я должен просто продолжить выполнение, не открывая новое окно, вход в систему и прочее.

Java User 11.10.2018 07:16

используйте переменную для сохранения среда (например, окна) и начните с null. В цикле, если это null, создайте и назначьте среда. После первого раза переменная не будет null, поэтому эта операция выполняется только один раз (и это совершенно ясно для любого, кто читает код). В конце концов вы можете / должны использовать только логический флаг вместо среда ...

user85421 11.10.2018 07:35
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
4
70
3

Ответы 3

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

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

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

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

There is no guarantee that the name strings in the resulting array will appear in any specific order; they are not, in particular, guaranteed to appear in alphabetical order.

Но я использую имя файла для нескольких целей. В таком случае, как я могу извлечь имя файла? Если я использую для (File file: listOfFiles), я могу получить имя файла «файл».

Java User 11.10.2018 06:57

Я не понимаю вашего вопроса. listOfFiles [i] даст вам Файл

user7 11.10.2018 06:59

Да, я знаю, как использовать массивы

Java User 11.10.2018 07:01

@JavaUser Внутри цикла используйте file.getName (), чтобы получить имя файла

Aniket Paul 11.10.2018 07:02

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

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
   }
}

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

Не используйте больше 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 после обработки первого файла, но я am нет уверен, что потребители для всех файлов будут работать строго последовательно - или если обработка первого файла может быть прервана, чтобы начать обработку сеонда, до того, как этот флаг может быть установлен.

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

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;
    }
}

Другие вопросы по теме