我必须在HDFS中的给定位置读取文件并进行进一步的操作。我正在使用FileSystem API来监视位置:

FileSystem.listStatus(workingDir)

我的问题是文件越来越大,例如200GB的文件被拖放到该位置。上面的代码返回文件名/路径,但文件仍未完全复制。有没有办法找出文件是否使用Java API完全复制?我读过this和其他一些博客/问题,但没有找到我一直在寻找的东西。

最佳答案

现在,这就是我正在做的并且有效。长度也可以使用,但是在我的测试中并不可靠。

FileSystem fileSystem = FileSystem.newInstance(workingDir.toUri(), fsConfig);
FileStatus[] fileStatuses = FileSystem.listStatus(workingDir);
  for(FileStatus fileStatus : fileStatuses){
    if(fileStatus.isFile()){
       final Path filePath = fileStatus.getPath();
       long modificationTime = fileStatus.getModificationTime();
       Thread.sleep(4000);
       long modTimeAfterSleep = fileStatus.getModificationTime();
     if(modTimeAfterSleep - modificationTime  == 0){
         System.out.println("File fully copied");
     } else {
       System.out.println("Keep fishing..");
     }
}

10-01 13:43