话不多说先上代码:
/**
* File对象上传到hdfs
*/
public synchronized static void createFile(File localPath, String hdfsPath) throws IOException {
InputStream in = null;
try {
Configuration conf = new Configuration();
FileSystem fileSystem = FileSystem.get(URI.create(hdfsPath), conf);
final float fileSize = localPath.length()/65536;
FSDataOutputStream out = fileSystem.create(new Path(hdfsPath), new Progressable() {
long fileCount = 0;
@Override
public void progress() {
fileCount ++;
System.out.println("总进度:" + (fileCount/fileSize)*100 + " %");
}
});
in = new BufferedInputStream(new FileInputStream(localPath));
IOUtils.copyBytes(in, out, 4096, false);
out.sync();
out.close();
System.out.println("create file in hdfs: " + hdfsPath);
} finally {
IOUtils.closeStream(in);
}
}
重写的 progress 方法在每次上传了64KB字节大小的文件之后会自动调用一次,通过累加之后的结果与整个文件大小来计算总上传文件的进度,这里需要注意的是,因为 progress 方法是卸载一个闭包内的,所以他只能调用闭包内的局部变量或者是闭包外的 final 变量。