io 流操作hdfs

Posted lijins

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了io 流操作hdfs相关的知识,希望对你有一定的参考价值。

hdfs 文件上传

本地   -------->    文件系统对象   -------->    hdfs 文件系统

           输入流                               输出流  

// 将流从本地 上传到  hdfs 文件系统。
    @Test
    public void ioPut() throws IOException, InterruptedException, URISyntaxException{
        //1  获取文件系统对象
        Configuration conf = new Configuration();
        FileSystem fs = FileSystem.get(new URI("hdfs://192.168.59.11:9000"), conf, "ljs");
        
        //2  输出流   流到 hdfs 
        FSDataOutputStream fo = fs.create(new Path("/user/ljs/job"));
        
        //3 定义输出流  来自 本地磁盘  
        InputStream is = new FileInputStream(new File("d:/job.txt"));
        
        //4 流对接 
        IOUtils.copyBytes(is, fo, 100);
        
        IOUtils.closeStream(fs);
        //5 关闭流
    }

 

 

hdfs 文件下载

本地 <-----------  文件系统对象  < --------------------  hdfs文件系统 集群

           输出流                                     输出流

@Test
    public void ioGet() throws IOException, InterruptedException, URISyntaxException{
        
        // 1 创建文件系统
        Configuration conf = new Configuration();
        FileSystem fs = FileSystem.get(new URI("hdfs://192.168.59.11:9000"),
                conf, "ljs");
        // 2 创建 输入流  来着 hdfs 文件系统
        FSDataInputStream fis = fs.open(new Path("/user/ljs/cook.txt"));
        // 3 创建输出流   送到 本地磁盘。
        OutputStream os = new FileOutputStream(new File("d:/cook.txt"));
        // 4  流对接
        IOUtils.copyBytes(fis, os, 20);
        // 5 关闭流
        IOUtils.closeStream(fis);
     }

 

 

定位文件读取

 

读取第一块   128M  

    
    // 从hdfs文件系统中获取第一块block (128M)
    @Test
    public void fileSeek1() throws IOException, InterruptedException, URISyntaxException{
        // 1  获取文件系统对象
        Configuration conf = new Configuration();
        FileSystem fs = FileSystem.get(new URI("hdfs://192.168.59.11:9000"), conf, "ljs");
        // 2 创建打开输入流  
        FSDataInputStream fis = fs.open(new Path("/user/ljs/hadoop-2.7.2.tar.gz"));
        // 3 创建 输出流 
        OutputStream fos = new FileOutputStream(new File("d:/hadoop-2.7.2.tar.gz.part01"));
        // 4 流对接
        byte [] buff = new byte[1024]; // 1kB;
        for(int i =0; i < 1024*128; ++i){
            fis.read(buff);
            fos.write(buff);    
        }
        // 5 关闭流
        fis.close();
        fos.close();
    }

 

 

从第二块文件开始读取

@Test
	public void fileSeek02() throws IOException, InterruptedException, URISyntaxException{
		Configuration conf = new Configuration();
		FileSystem fs = FileSystem.get(new URI("hdfs://192.168.59.11:9000"), conf, "ljs");
		FSDataInputStream fis = fs.open(new Path("/user/ljs/hadoop-2.7.2.tar.gz"));
		OutputStream fos = new FileOutputStream(new File("d:/hadoop-2.7.2.tar.gz.part02"));
		
		fis.seek(1024*1024*128);
		IOUtils.copyBytes(fis, fos,1024);
		
		fis.close();
		fos.close();
		
	}

  

 

以上是关于io 流操作hdfs的主要内容,如果未能解决你的问题,请参考以下文章

java缓冲字符字节输入输出流:java.io.BufferedReaderjava.io.BufferedWriterjava.io.BufferedInputStreamjava.io.(代码片段

Hadoop之HDFS(客户端操作) 2 HDFS的API操作 3 HDFS的I/O流操作

HDFS客户端环境准备HDFS的API操作HDFS的I/O流操作

HDFS的Java客户端操作代码(HDFS的查看创建)

Hadoop IO操作之基于文件的数据结构

HDFS设计思想元数据简单JAVAAPI操作HDFS