FileUtil.copyMerge不只删除合并文件吗?

时间:2016-03-30 12:14:18

标签: java hadoop

我正在调查hadoop-core库中的FileUtil.copyMerge方法,虽然我不是Java专家但我有一种感觉,它不会删除的文件被复制和合并。我认为它只是删除了特定路径中的所有内容,这意味着如果在复制合并期间添加了文件,它们也会被删除,即使它们可能没有被复制合并。

以下是source code的相关部分:

public static boolean copyMerge(FileSystem srcFS, Path srcDir,
                                FileSystem dstFS, Path dstFile,
                                boolean deleteSource,
                                Configuration conf, String addString) throws IOException {
  dstFile = checkDest(srcDir.getName(), dstFS, dstFile, false);

  if (!srcFS.getFileStatus(srcDir).isDirectory())
    return false;

  OutputStream out = dstFS.create(dstFile);

  try {
    FileStatus contents[] = srcFS.listStatus(srcDir);
    Arrays.sort(contents);
    for (int i = 0; i < contents.length; i++) {
      if (contents[i].isFile()) {
        InputStream in = srcFS.open(contents[i].getPath());
        try {
          IOUtils.copyBytes(in, out, conf, false);
          if (addString!=null)
            out.write(addString.getBytes("UTF-8"));

        } finally {
          in.close();
        }
      }
    }
  } finally {
    out.close();
  }


  if (deleteSource) {
    return srcFS.delete(srcDir, true);
  } else {
    return true;
  }
}

最终的if (deleteSource)语句独立于else if (srcFS.isFile(src))内部发生的事件,对我来说,这表明一旦完成最高位并且deleteSource设置为true,它只是从src中删除所有文件,而不管它们是否在复制后合并时添加。

我的解释是否正确?

1 个答案:

答案 0 :(得分:0)

  

我的解释是否正确?

我不这么认为。如果在复制合并阶段出现任何问题,则copyMerge调用将以异常终止。这是在它进入删除阶段之前发生的。