我从HDFS客户端获得了一个大文件(大约2GB)的DataInputStream,我需要将其作为文件存储在主机上。

我正在考虑使用apache通用IOUtils并执行类似的操作...

File temp = getTempFile(localPath);
DataInputStream dis = HDFSClient.open(filepath); // around 2GB file (zipped)
in = new BufferedInputStream(dis);
out = new FileOutputStream(temp);
IOUtils.copy(in, out);


我一直在寻找其他解决方案,这些解决方案比这种方法更有效。为此,主要要考虑的是在输入和IOUtils.copy中都使用缓冲。

最佳答案

对于大于2GB的文件,建议使用IOUtils.copyLarge()(如果我们谈论的是相同的IOUtils:org.apache.commons.io.IOUtils)

IOUtils中的副本使用默认的缓冲区大小4Kb(尽管您可以将另一个缓冲区大小指定为参数)。

copy()copyLarge()之间的区别是返回结果。

对于copy(),如果流大于2GB,则复制成功,但结果为-1。

对于copyLarge(),结果恰好是您复制的字节数。

在此处查看更多文档:
http://commons.apache.org/proper/commons-io/apidocs/org/apache/commons/io/IOUtils.html#copyLarge(java.io.InputStream,%20java.io.OutputStream)

关于java - 从HDFS下载大文件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31824598/

10-09 18:28