您的位置:首页 > 大数据 > Hadoop

hdfs有多级目录 合并文件下载到本地(递归下载)

2016-09-13 13:46 771 查看
package com.hdfs;

import java.io.FileOutputStream;

import java.io.OutputStream;

import org.apache.hadoop.fs.FSDataInputStream;

import org.apache.hadoop.fs.FileStatus;

import org.apache.hadoop.fs.FileSystem;

import org.apache.hadoop.fs.LocalFileSystem;

import org.apache.hadoop.fs.Path;

import org.apache.hadoop.io.IOUtils;

import com.beicai.utils.MyUtils;

/**

 * 

 * @described hdfs有多级目录 合并下载到本地

 *

 */

public class HdfsWork2 {
public static void main(String[] args) throws Exception {
myMerge();
}

public static void myWrite(Path path,FileSystem fs,OutputStream fsdos) throws Exception{
FileStatus[] fst = fs.listStatus(path);
FSDataInputStream fsdis = null;
for(int i=0;i<fst.length;i++){
if(fst[i].isDirectory()){
myWrite(fst[i].getPath(),fs,fsdos);
} else {
fsdis = fs.open(fst[i].getPath());
int read = 0;
byte[] buffer = new byte[255];
while((read=fsdis.read(buffer))>0){
fsdos.write(buffer, 0, read);
}
IOUtils.closeStream(fsdis);
}
}
}

public static void myMerge() throws Exception{
FileSystem fs = MyUtils.getFileSystem();
LocalFileSystem lfs = MyUtils.getLocalFileSystem();
Path localPath = new Path("D:/data/file0913.txt");
Path hdfsPath = new Path("/data2");

//FSDataOutputStream fsdos = lfs.create(localPath); 
//用上面的,报空指针异常,是因为系统原因,改成普通的文件输出流就好了
FileOutputStream fsdos = new FileOutputStream(localPath.toString());
myWrite(hdfsPath,fs,fsdos);
IOUtils.closeStream(fsdos);
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐