我的文件夹中文件很少,我想读取第一个文件并执行一些操作,并且在第一次迭代之后,我想从第二个分区读取文件以执行不同的操作。
我该怎么做?
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
答案 0 :(得分:2)
获取第一个文件为listOfFiles[0]
并对其进行操作。
然后,使用从索引1开始的简单(常规) for 循环。
for (int i = 1; i < listOfFiles.length; i++) {
File currentFile = listOfFiles[i];
//do Operation 2 with currentFile
}
的注释
不能保证结果数组中的名称字符串会以任何特定顺序出现;尤其不能保证它们按字母顺序显示。
答案 1 :(得分:1)
根据您的评论,似乎您不需要在处理文件之前按特定顺序对文件列表进行排序。在这种情况下,
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 块
答案 2 :(得分:0)
不再使用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
定义为外部依赖项,将其设置为{{1 }}处理完第一个文件后,但我不不确定所有文件的使用者是否将严格按顺序运行,或者是否可以中断第一个文件的处理以开始处理第二个文件,可以设置该标志。
您始终可以将流呈现为数组...
true
...或列表,以获得更多控制权。
final Path[] allFiles = Files.newDirectoryStream(folder)
.sorted((a, b) -> { ... })
.toArray(Path[]::new);