三、HADOOP-JAVA操作HDFS

一、公用代码提

    在操作HDFS之前我们可以获取文件系统对象,由于每次操作都需要获取文件对象,并且结束要关闭文件对象,所以我们可以把这一部分提取出来,作为JUNIT的After及Before部分

    1、全局属性定义

//操作hdfs使用的用户名

private static String USER = HdfsTest.class.getName();

//全局文件系统对象

private FileSystem fs = null;

    2、 Before

@Before

public void initFileSystem(){

    //创建配置对象

    Configuration conf = new Configuration();

    try {

        //获取文件系统对象

        fs = FileSystem.get(new URI("hdfs://bigdata111:9000"), conf, USER);

    } catch (Exception e) {

        System.err.println("获取文件系统失败:"+e.getMessage());

    }

}

    3、 After

@After

public void close() {

    try {

        //关闭文件系统

        fs.close();

        System.out.println("文件系统关闭成功");

    } catch (IOException e) {

        System.err.println("文件系统关闭失败:"+e.getMessage());

    }

}

二、 上传文件

    1、 代码

/**

* 上传文件

*/

@Test

public void put(){

    try {

        fs.copyFromLocalFile(new Path("F:\\软件\\密钥.txt"), new Path("/密钥.txt"));

    } catch (IOException e) {

        System.err.println("复制失败:"+e.getMessage());

    }

}

    2、 结果

三、 下载文件

    1、 代码

/**

* 下载

*/

@Test

public void download(){

    // delSrc: 是否删除源文件  src: 源路径  dst: 目标路径  useRawLocalFileSystem: 校验文件

    try {

        fs.copyToLocalFile(true, new Path("/密钥.txt"), new Path("F:\\软件\\密钥2.txt"), false);

    } catch (IOException e) {

        System.err.println("下载失败:"+e.getMessage());

    }

}

    2、 结果

    hdfs中的文件被删除

四、 创建目录

    1、 代码

/**

* 创建目录

*/

@Test

public void mkdir(){

    try {

        fs.mkdirs(new Path("/"+USER+"/test"));

    } catch (IOException e) {

        System.err.println("目录创建失败:"+e.getMessage());

    }

}

    2、 结果

五、 删除文件

    1、 代码

/**

* 删除文件

*/

@Test

public void delFile(){

    try {

        // pathString: 删除路径  b: 递归删除

        fs.delete(new Path("/"+USER+"/test2"),true);

    } catch (IOException e) {

        System.err.println("删除目录创建失败:"+e.getMessage());

    }

}

    2、 结果

            删除前

            删除后

六、 遍历文件

    1、 代码

/**

* 遍历文件,获取详情信息

*/

@Test

public void listFiles(){

    try {

        // pathString: 路径  recursive: 是否遍历

        RemoteIterator<LocatedFileStatus> lfs = fs.listFiles(new Path("/"), true);

        while (lfs.hasNext()){

            LocatedFileStatus lf = lfs.next();

            System.out.println("路径: "+lf.getPath());

            System.out.println("大小: "+formatSize(lf.getLen()));

            System.out.println("权限: "+lf.getPermission());

            System.out.println("访问时间: "+lf.getAccessTime());

            System.out.println("备份数: "+lf.getReplication());

            System.out.println("是文件: "+(lf.isFile()?"是":"否"));

            System.out.println("是目录: "+(lf.isDirectory()?"是":"否"));

            BlockLocation[] bls = lf.getBlockLocations();

            int i = 1;

            for (BlockLocation bl: bls) {

                String name = "\t块"+i;

                System.out.println(name+"的信息: ");

                System.out.println("\t\t偏移量: "+bl.getOffset());

                System.out.println("\t\t主机:");

                String[] hosts = bl.getHosts();

                for(String host : hosts){

                    System.out.println("\t\t\t"+host);

                }

                i++;

            }

            System.out.println("===========黄金分割线===========");

        }

    } catch (IOException e) {

        System.err.println("遍历失败:"+e.getMessage());

    }

}

/**

* 将byte数值格式化成方便看的数

* @param byteSize

* @return

*/

private String formatSize(long byteSize){

    String[] units = new String[]{"B","BK","MB","GB","TB"};

    //保留两位小数

    DecimalFormat df = new DecimalFormat("#.00");

    int unitIndex = 0;

    double res= byteSize;

    while (res > 1024){

        res = res / 1024.0;

        unitIndex++;

    }

    return df.format(res) + units[unitIndex];

}

    2、 结果

七、 IO流上传

    1、 代码

/**

* IO流上传

*/

@Test

public void putByIO(){

    try {

        InputStream is = new FileInputStream(new File("F:\\软件\\密钥.txt"));

        OutputStream os = fs.create(new Path("/"+USER+"/123.txt"));

        IOUtils.copyBytes(is, os, 5*1024*1024, true);

    } catch (Exception e) {

        System.err.println("上传失败: "+e.getMessage());

    }

}

    2、 结果

八、 IO流下载

    1、 代码

/**

* IO流下载

*/

@Test

public void getByIO(){

    try {

        InputStream is = fs.open(new Path("/"+USER+"/123.txt"));

        OutputStream os = new FileOutputStream(new File("F:\\软件\\密钥3.txt"));

        IOUtils.copyBytes(is, os, 5*1024*1024, true);

    } catch (Exception e) {

        System.err.println("上传失败: "+e.getMessage());

    }

}

    2、 结果

九、 使用IO流下载所有块

    1、 代码

/**

* 定位读取, 读取所有块

*/

@Test

public void getAllBlock(){

    try {

        Path path = new Path("/zh-hans_windows_xp_professional_with_service_pack_3_x86_cd_x14-80404.iso");

        FileStatus status = fs.getFileStatus(path);

        // 文件总大小

        long totalSize = status.getLen();

        //块的大小

        long blockSize = status.getBlockSize();

        //当前偏移量

        long seek = 0;

        //输入流

        FSDataInputStream is = fs.open(path);

        while (seek < totalSize){

            //构造输出流

            OutputStream os = new FileOutputStream(new File("F:\\软件\\"+(seek/blockSize)));

            is.seek(seek);

            //定义缓冲区

            byte[] buff = new byte[1024*1024];

            if(totalSize - seek >= blockSize) {

                for (int i = 0; i < blockSize / (1024*1024); i++) {

                    is.read(buff);

                    os.write(buff);

                }

            }else{

                IOUtils.copyBytes(is,os,1024*1024,false);

            }

            seek += blockSize;

            os.close();

        }

        is.close();

    } catch (IOException e) {

        System.err.println("获取失败: "+e.getMessage());

    }

}

    2、 结果

    在windows中使用type将文件追加进另一个文件,来合并这些块

    打开合并后的文件,检验下载成功

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容