Больше не используйте 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;
}
}