3 回答
TA贡献1821条经验 获得超6个赞
获取第一个文件 aslistOfFiles[0]并对其执行操作 1。
然后,使用从索引 1 开始的简单(常规)for循环。
for (int i = 1; i < listOfFiles.length; i++) {
File currentFile = listOfFiles[i];
//do Operation 2 with currentFile
}
来自Files.listFiles的javadoc 的注释
无法保证结果数组中的名称字符串会以任何特定顺序出现;特别是,它们不能保证按字母顺序出现。
TA贡献1827条经验 获得超8个赞
根据您的评论,在处理文件之前,您似乎不需要按特定顺序对文件列表进行排序。在这种情况下,
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块中
TA贡献1875条经验 获得超5个赞
别再用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一旦你处理了第一个文件,它就会被设置,但我不是确定所有文件的使用者是否严格按顺序运行——或者在设置该标志之前,第一个文件的处理是否可能被中断以开始处理第二个文件。
您始终可以将流渲染到数组...
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;
}
}
添加回答
举报