У меня есть несколько файлов в папке, и я хочу прочитать первый файл и выполнить некоторые операции, а после первой итерации я хочу прочитать файлы из второго файла для выполнения другого набора операций.
Как я могу это сделать?
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
Какой первый файл по вашему требованию? Это первый файл, отсортированный по алфавиту?
Нет. Это всего лишь несколько XML-файлов, из которых я должен читать каждый XML-файл из папки для создания отчета. В основном мне нужно сравнить результаты каждого XML в двух разных средах. Итак, когда я читаю первый файл, он должен открывать обе среды в одном окне. Итак, теперь у него открыты 2 вкладки, а из второго файла на палатах я должен просто продолжить выполнение, не открывая новое окно, вход в систему и прочее.
используйте переменную для сохранения среда (например, окна) и начните с null. В цикле, если это null, создайте и назначьте среда. После первого раза переменная не будет null, поэтому эта операция выполняется только один раз (и это совершенно ясно для любого, кто читает код). В конце концов вы можете / должны использовать только логический флаг вместо среда ...




Получите первый файл как 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), я могу получить имя файла «файл».
Я не понимаю вашего вопроса. listOfFiles [i] даст вам Файл
Да, я знаю, как использовать массивы
@JavaUser Внутри цикла используйте file.getName (), чтобы получить имя файла
Согласно вашему комментарию, похоже, что вам не нужно сортировать список файлов в определенном порядке перед их обработкой. В этом случае,
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;
}
}
Поймите, что нет никакой гарантии в порядке файлов, двойной запуск кода может привести к двум разным результатам.