为了账号安全,请及时绑定邮箱和手机立即绑定

从Java中的第二个文件开始的文件夹中读取所有文件

从Java中的第二个文件开始的文件夹中读取所有文件

慕的地10843 2021-11-11 14:24:02
我在一个文件夹中有几个文件,我想读取第一个文件并执行一些操作,在第一次迭代之后,我想从病房的第二个文件中读取文件以执行不同的操作集。我怎样才能做到这一点?    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
查看完整描述

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 的注释


无法保证结果数组中的名称字符串会以任何特定顺序出现;特别是,它们不能保证按字母顺序出现。


查看完整回答
反对 回复 2021-11-11
?
斯蒂芬大帝

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块中


查看完整回答
反对 回复 2021-11-11
?
慕田峪4524236

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;

    }

}


查看完整回答
反对 回复 2021-11-11
  • 3 回答
  • 0 关注
  • 182 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信