HDFS文件系统简单的Java读写操作

package com.cn.hadoop.hdfs;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
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;

public class HdfsApi {

    // 定义一个fileSystem的变量,用的是Hadoop的包
    FileSystem fileSystem = null;
    
    // 添加一个注解
    @Before
    public void getfileSystem() throws IOException, InterruptedException, URISyntaxException{
        
        // 获取一个具体的文件系统对象
        fileSystem = FileSystem.get(
            // 创建一下HDFS文件系统的访问路径,就是Hadoop配置文件中的core-sit.xml中的HDFS文件系统的所在机器
                new URI("hdfs://linux.centos.one:8020"),    
            // 创建一个Hadoop的配置文件的类
                new  Configuration(),
            // 就是Linux启动的用户名
                "hadoop");
    }
    
    /**
     *  从HDFS文件系统下载文件
     *      首先编写一个输入流,将内容输入到本地文件缓存。
     *      然后编写一个输出流,将内容输出到本地磁盘。
     */  
    /**  
     * @throws IOException 
     * @throws IllegalArgumentException 
     */
    @Test
    public void testDownload() throws IllegalArgumentException, IOException{
        
        // 构建一个输入流,将需要下载的文件写入到客户端的内存中
        FSDataInputStream in = fileSystem.open(new Path("/user/beifeng/mapreduce/wordcount/input/wc.input"));
        
        // 构建一个输出流,将需要下载的文件从内存中写入到本地磁盘
        FileOutputStream out = new FileOutputStream("D://11111111111111111111111111111111111111.txt");
        
        /**
         * 参数说明:
         *     in 
         *         代表输入流,读取HDFS文件系统的文件到本机内存中
         *     out
         *         代表输出流,将本机内存中的文件写入到本地磁盘中
         *     4096
         *         缓冲区大小
         *     true    
         *         自动关闭流,如果不使用自动关闭的话需要手动关闭输入输出流
         *         
         *         手动关闭输入输出流:
         *             IOUtils.closeStream(in);
         *            IOUtils.closeStream(out);
         */
        IOUtils.copyBytes(in, out, 4096, true);
        
    }
    
    /**
     * 上传文件到HDFS文件系统
     * @throws IOException 
     * @throws IllegalArgumentException 
     */
    @Test
    public void testUpload() throws IllegalArgumentException, IOException{
        
        // 构建一个输入流,将本机需要上传的文件写入到内存中
        FileInputStream in = new FileInputStream("D:\\settings.xml");
        
        // 构建一个输出流,将客户端内存的数据写入到HDFS文件系统指定的路径中
        FSDataOutputStream out = fileSystem.create(new Path("/input/sting.xml"), true);
        
        /*
         *    参数说明:
         *     in 
         *         代表输入流,读取HDFS文件系统的文件到本机内存中
         *     out
         *         代表输出流,将本机内存中的文件写入到本地磁盘中
         *     4096
         *         缓冲区大小
         *     true    
         *         自动关闭流,如果不使用自动关闭的话需要手动关闭输入输出流
         *         
         *         手动关闭输入输出流:
         *             IOUtils.closeStream(in);
         *            IOUtils.closeStream(out);
         */
        IOUtils.copyBytes(in, out, 4096, true);
        
    }
    
    /**
     * 测试创建一个目录
     *     bin/hdsf dfs -mkdir [-p] /dir
     * @throws IOException 
     * @throws IllegalArgumentException 
     */
    @Test
    public void testMakeDir() throws IllegalArgumentException, IOException{
        
        boolean isSuccess = fileSystem.mkdirs(new Path("/testMK"));
        
        System.out.println(isSuccess);
        
    }
    
    /**
     * 测试删除目录/文件:
     * @throws IOException 
     * @throws IllegalArgumentException 
     *         
     */
    @Test
    public void testDel() throws IllegalArgumentException, IOException{
        System.out.println(
                // 返回的是一个boolean类型的值
        fileSystem.delete(
                // 指定要删除的目录
                    new Path("/testMK"), 
                // 是否使用递归删除
                    true
                ));
    }
}

 

posted @ 2017-11-01 20:28  業&裳  阅读(3313)  评论(0编辑  收藏  举报