大数据学习第三课之hdfs的java客户端IO流和简单Util的文件操作(以idea展示,eclipse为辅)

方法一:第一种(在eclipse中,主要讲解环境)先进行依赖包引入,代码操作看方法二。

导包(在java中的jar包)流程如此下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述导入这两个包,这里就演示的包,common相同。
先导入这第三个还有它lib第三方依赖包的全部:
在这里插入图片描述
点击打开就导入了,下面也是。
在这里插入图片描述
这里就是导入成功了(hdfs和hdfsbao包一样的,举个例子,我这里是hdfs,名字随便取):
在这里插入图片描述

方法二(一):IO流的操作(idea中)

首先就是建一个maven项目(都学到大数据了,这个要会哦):
然后找到网站上找依赖包。
网站如下:依赖包获得链接

接下来就是获得下面的两个的依赖包(我两个依赖都是要的2.6.5版本,因为自己的hadoop就是2.6.5的版本,以自己安装的版本为主):点进去自己找。
下面找common为例,hdfs一样的操作:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
找到两个依赖之后,放进去maven里去(看图):
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190928214933949.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5
接下来就是创建java类进行操作:

package xiaoi;

import com.sun.xml.internal.ws.policy.privateutil.PolicyUtils;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;
import org.junit.Before;
import org.junit.Test;


import java.io.*;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URISyntaxException;

public class HdfsTest {

    FileSystem fileSystem;
     @Before
    public void init() throws Exception {

         fileSystem = FileSystem.get(new URI("hdfs://192.168.71.200:9000"),new Configuration(),"root");

    }

    /**
     * 对数据库的文件流的文件操作
     * @throws IOException
     */
    @Test
    public void testseek () throws IOException {
        FSDataInputStream in =fileSystem.open(new Path("/1.text"));
        //读取文件六个字节的内容
        in.seek(6);

        FileOutputStream out = new FileOutputStream("D://hdfs.txt");
        IOUtils.copyBytes(in,out,4096);
        //关闭资源流
        IOUtils.closeStream(in);
        IOUtils.closeStream(out);
    }

    /**
     * 以文件流的形式从hdfs中复制文件到本地磁盘
     * @throws IOException
     */
    @Test
    public void TestDownLoad() throws IOException {

        FSDataInputStream in =fileSystem.open(new Path("/jdk1.8.0_172/bin/jar"));
        //写入的文件可以没有,系统会自己创建与之相同的文件进行操作。
        FileOutputStream out = new FileOutputStream("D:/jdk.tgz");

        IOUtils.copyBytes(in,out,new Configuration());

        IOUtils.closeStream(in);
        IOUtils.closeStream(out);
    }
    /**
     * 以文件流的形式从hdfs中复制文件到本地磁盘
     * @throws IOException
     */
     @Test
    public void testUpload() throws IOException {
        //获得本地输入流
        FileInputStream in = new FileInputStream("D:/jdk.tgz");
        //获得hdfs的输出流
         FSDataOutputStream Out = fileSystem.create(new Path("/jdk.tar.gz"));
         IOUtils.copyBytes(in, Out,4096);
         //关闭字符流
         IOUtils.closeStream(in);
         IOUtils.closeStream(Out);

     }
}

结果展示(test中方法一):

在这里插入图片描述
在这里插入图片描述

结果展示(test中方法二):

在这里插入图片描述
在这里插入图片描述
拷贝到本地就是这个样子:
在这里插入图片描述

结果展示(test中方法三):

在这里插入图片描述

方法二(二):简单文件的操作(idea中)

话不多说,直接上代码,一目了然:

package xiaoi;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;
import org.junit.Before;
import org.junit.Test;

import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;

public class HdfsUtil {

    FileSystem fileSystem = null;

    @Before
    public void init() throws Exception {

         fileSystem = FileSystem.get(new URI("hdfs://192.168.71.200:9000"), new Configuration(), "root");

    }

    /**
     * 从hdfs中下载文件到本地
     */
    @Test
    public void downLoad() throws IllegalArgumentException, IOException {
        fileSystem.copyToLocalFile(false,new Path("/1.text"),new Path("d:/"),true);
        fileSystem.close();
    }

    /**
     * 对文件夹的操作
     * @throws Exception
     */
    @Test
    public void testDir() throws Exception {

        boolean mkdirs = fileSystem.mkdirs(new Path("/aaa"));
        System.out.println("创建了一个文件夹");

        boolean exists = fileSystem.exists(new Path("/aaa"));
        System.out.println("文件夹是否存在:"+exists);

        fileSystem.copyFromLocalFile(new Path("d:/person.sql"),new Path("/aaa"));
        System.out.println("成功上传一个文件到/aaa下");

       // fileSystem.delete(new Path("/aaa"),true);
       // System.out.println("已经把文件删除");

        fileSystem.close();
    }

    /**
     * 对文件信息的查看
     * @throws Exception
     */
    @Test
    public void testFileStutas() throws Exception {

        //只能列出“文件”信息
        RemoteIterator<LocatedFileStatus> locatedFileStatusRemoteIterator = fileSystem.listFiles(new Path("/"), true);
        //判断是否为空
        while (locatedFileStatusRemoteIterator.hasNext()){
            //依次遍历下一个
            LocatedFileStatus next = locatedFileStatusRemoteIterator.next();
            System.out.println(next);
        }
        System.out.println("--------------------------------------------------------");

        FileStatus[] fileStatuses = fileSystem.listStatus(new Path("/"));
        for (FileStatus fileStatus : fileStatuses) {
            String type = "-";
            if(fileStatus.isDirectory()){
                type = "d";
            }
            System.out.println(type+"\t"+fileStatus.getPath().getName());
        }

    }

    /**
     * 查看hdfs的文件的块信息
     * @throws Exception
     */
    @Test
    public void testBLokInfo() throws Exception {


        BlockLocation[] fileBlockLocations = fileSystem.getFileBlockLocations(new Path("/jdk.tar.gz"), 0, 143588167);
        for (BlockLocation fileBlockLocation : fileBlockLocations) {
            //获得切割块的位置
            System.out.println(fileBlockLocation.getOffset());
            //获得存储在第一个块存储的位置的主机ip
            System.out.println(fileBlockLocation.getNames()[0]);
        }
        //修改文件名:第一个参数是原来文件的名字,第二个参数是改后的文件的名字。
       // fileSystem.rename(new Path("/jdk.tar.gz"),new Path(""));
        //设置文件的块存贮量,也就是分几块备份;
       // fileSystem.setReplication(new Path("/文件的名字"),(short)2);
    }
    
}

downLoad()方法的结果展示:

在这里插入图片描述
在这里插入图片描述

testDir()方法结果展示:

在这里插入图片描述
在这里插入图片描述

testFileStutas()方法结果展示:

在这里插入图片描述

testBLokInfo()方法结果展示:

在这里插入图片描述
至此,简单的java操作hadoop的hdfs文件两种方式就已经展示完了,读者可以按照步骤进行操做一遍。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值