您当前的位置: 首页 >  hdfs

梁云亮

暂无认证

  • 2浏览

    0关注

    1211博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

HDFS客户端编程

梁云亮 发布时间:2019-11-27 13:36:52 ,浏览量:2

文章目录
  • 理论
    • Configuration
    • FileSystem
    • FileStatus
    • FSDataInputStream
    • FSDataOutputStream
  • 1、使用系统API实现文件上传
  • 2、使用系统API实现文件下载
  • 3、目录相关
    • 创建目录
    • 删除目录
  • 4、查看文件详情(名称、权限、大小、块信息等)
  • 5、判断是文件还是文件夹
  • 4、文件操作
    • 判断文件是否存在
    • 创建文件
    • 删除文件
    • 重命名文件
    • 向文件中添加内容
  • 3、读取文件
    • 全部读取
    • 定位读取文件:从头开始读取到指定位置
    • 定位读取文件:从指定位置开始读取

前置课程:HDFS开发环境搭建

理论 Configuration

Hadoop配置文件管理类,该类的对象封装了客户端或者服务器的配置(配置集群时,所有的xml文件根节点都是configuration),可理解为configuration就是hadoop中的配置信息。 创建一个Configuration对象时,其构造方法会默认加载hadoop中的hdfs-site.xml以及core-site.xml两个配置文件,这两个文件中会有访问hdfs所需的参数值,主要是fs.default.name,指定了hdfs的地址,有了这个地址客户端就可以通过这个地址访问hdfs了。

FileSystem

该类的对象是一个文件系统对象,对HDFS中的文件进行的一系列操作,如创建等

FileStatus

获取文件或者文件夹的元信息!比如:文件路径,文件大小,文件所有者,所在的块大小,文件修改时间,备份数量,权限等

FSDataInputStream

输入流对象,利用它可以将HDFS中的文件或者文件夹读取到本地

FSDataOutputStream

输出流对象,利用它 可以将本地的文件或者文件夹上传到HDFS中

1、使用系统API实现文件上传
@Test
public void uploadFile() throws IllegalArgumentException, IOException {//上传文件到HDFS
    fs.copyFromLocalFile(new Path("E:/test/core-site.xml"), new Path("/a.xml"));
}
2、使用系统API实现文件下载
@Test
public void downFile() throws Exception {
    fs.copyToLocalFile(false, new Path("/b.xml"), new Path("E:/xqj.txt"));//第一个true表示是"剪切"操作,没有或者false表示复制
}
3、目录相关 创建目录
@Test
public void mkdir() throws IOException {//创建目录
    fs.mkdirs(new Path("/user/tt")); //可以同时创建多级目录 /aaa/bbb/ccc
}
删除目录
@Test
public void deleteDir() throws IllegalArgumentException, IOException {
    fs.delete(new Path("/user/tt"), false); //delete默认为true,false时只能删除空的文件夹
}
4、查看文件详情(名称、权限、大小、块信息等)
@Test
public void listFiles() throws IOException { //查看文件详情(名称、权限、大小、块信息等)
    RemoteIterator iterator = fs.listFiles(new Path("/aa"), true);
    while (iterator.hasNext()){
        LocatedFileStatus fileStatus = iterator.next();
        System.out.println(fileStatus.getPath().getName());
        System.out.println(fileStatus.getPermission());
        System.out.println(fileStatus.getLen());
        BlockLocation[] blockLocations = fileStatus.getBlockLocations();
        for (BlockLocation blockLocation : blockLocations) {
            String[] hosts = blockLocation.getHosts();
            for (String host : hosts) {
                System.out.println(host);//副本存储在哪个主机上
            }
        }
        System.out.println("-----------------------------");
    }
}
5、判断是文件还是文件夹
@Test
public void fileStatus() throws IOException {
    FileStatus[] fileStatuses = fs.listStatus(new Path("/aa"));
    for (FileStatus fileStatus : fileStatuses) {
        if(fileStatus.isDirectory()){
            System.out.println(fileStatus.getPath().getName()+" is folder");
        }else if(fileStatus.isFile()){
            System.out.println(fileStatus.getPath().getName()+" is file");
        }
    }
}
4、文件操作 判断文件是否存在
@Test
public void exists() throws IOException {
    boolean exists = fs.exists(new Path("/12342.xml"));
    if(exists){
        System.out.println("文件已经存在");
    }else {
        System.out.println("文件不存在");
    }
}
创建文件
@Test
public void exists() throws IOException {
   boolean newFile = fs.createNewFile(new Path("/aa.txt"));
   System.out.println(newFile);
}
删除文件
@Test
public void exists() throws IOException {
    boolean res = fs.delete(new Path("/aa.txt"),true);
    System.out.println(res);
}
重命名文件
@Test
public void rename() throws IOException {
    Path src = new Path("/a.xml");
    Path aim = new Path("/aa.xml");
    fs.rename(src, aim);
}
向文件中添加内容
@Test
public void create() throws IOException {
    FSDataOutputStream fos = fs.create(new Path("/a.txt"));
    fos.write("hello hadoop".getBytes());
    fos.writeUTF("name:zhangsan");
    fos.writeChars("age:18");
    fos.flush();
    fos.close();
}
3、读取文件 全部读取
   @Test
    public void fileToIO() throws IllegalArgumentException, IOException {//将下载的文件传为流
        FSDataInputStream inputStream = fs.open(new Path(file));
        IOUtils.copyBytes(inputStream, System.out, 4096, false);//从HDFS中读取文件到本地
    }
定位读取文件:从头开始读取到指定位置
@Test
public void getStringByLine() throws IOException {//定位读取
    FSDataInputStream dis = fs.open(new Path("/aa.xml"));
    BufferedReader br = new BufferedReader(new InputStreamReader(dis));
    FileWriter fileWriter = new FileWriter(new File("E:/ss.xml"));
    char[] temp = new char[16];
    for (int i =0;i            
关注
打赏
1665409997
查看更多评论
0.2809s