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
                ));
    }
}
相關文章
相關標籤/搜索