JAVA-API操作HDFS文件系统(HDFS核心类FileSystem的使用)

HDFS核心类FileSystem的使用

一、引入jar包

    Hadoop的JAVAjar包在Hadoop2.7.7/share/hadoop里有如下几个文件夹。

common是Hadoop的核心类,它是下面其他核心类的依赖,使用其他类必须引入common包里的jar包。
所以使用HDFS的FileSystem包必须引入Common和hdfs两个文件夹里面所有jar包。

红色jar包为hadoop作者所写jar包,依赖在lib里面。都必须引入。hdfs同理。

二、JAVA-API连接HDFS

(所有jar包都是org.apache.hadoop.*;里的jar包)

@Test
    public void connectHDFS() {
        
        Configuration conf = new Configuration();
        conf.set("fs.defaultFS","hdfs://192.168.100.2:9000");//指定hadoop使用的文件系统和文件系统所在主机和端口
        try {
            FileSystem fileSystem = FileSystem.get(conf); //FileSystem 连接
            FileStatus fileStatus = fileSystem.getFileLinkStatus(new Path("/user"));
            System.out.println(fileStatus.isDirectory());    
        } catch (IOException e) {
            // TODO 自动生成的 catch 块
            e.printStackTrace();
        }
    }

三、文件上传

1.方法1:使用API直接上传

@Test
    public void upload1() {
        
        Configuration conf = new Configuration();
        conf.set("fs.defaultFS","hdfs://192.168.100.2:9000");//连接hdfs
        try {
            FileSystem fileSystem = FileSystem.get(conf);
            fileSystem.copyFromLocalFile(new Path("d:\\jdk-8u221-linux-x64.tar.gz"), new Path("/jdk-8u221-linux-x64.tar.gz"));//前一个path为本地路径 后一个path为hdfs保存路径
        } catch (IOException e) {
            // TODO 自动生成的 catch 块
            e.printStackTrace();
        

2.方法2:使用IO流上传

@Test
    public void upload2() {
        
        Configuration conf = new Configuration();
        conf.set("fs.defaultFS","hdfs://192.168.100.2:9000");
        try {
            FileSystem fileSystem = FileSystem.get(conf);
            FSDataOutputStream create = fileSystem.create(new Path("/stud")); //hdfs输出流
            FileInputStream f = new FileInputStream(new File("d:\\stud")); //文件输入流
            
            int len = 0;
            byte[] b = new  byte[1024];
            while((len = f.read(b))!=-1) {
                create.write(b, 0, len);
            }
            f.close();
            create.close();
            
        } catch (IOException e) {
            // TODO 自动生成的 catch 块
            e.printStackTrace();
        }
    }

四、文件下载

1.使用API直接下载

    @Test
    public void download1() {
        
        Configuration conf = new Configuration();
        conf.set("fs.defaultFS","hdfs://192.168.100.2:9000");
        try {
            FileSystem fileSystem = FileSystem.get(conf);
            fileSystem.copyToLocalFile(new Path("/stud"), new Path("E:\\stud")); //前者为hdfs路径 后者为本地保存路径
        } catch (IOException e) {
            // TODO 自动生成的 catch 块
            e.printStackTrace();
        }
    }

2.使用IO流下载

@Test
    public void download2() {
        
        Configuration conf = new Configuration();
        conf.set("fs.defaultFS","hdfs://192.168.100.2:9000");
        try {
            FileSystem fileSystem = FileSystem.get(conf);
            FSDataInputStream open = fileSystem.open(new Path("/stud"));
            FileOutputStream file = new FileOutputStream(new File("E:\\stud1"));
            
            byte [] b = new byte[1024];
            int len = 0;
            while((len = open.read(b))!=-1) {
                file.write(b, 0, len);
            }
            
            open.close();
            file.close();
            
        } catch (IOException e) {
            // TODO 自动生成的 catch 块
            e.printStackTrace();
        }
    }

五、创建文件夹(创建多级文件夹)

@Test
    public void mkdir() {
        
        Configuration conf = new Configuration();
        conf.set("fs.defaultFS","hdfs://192.168.100.2:9000");
        try {
            FileSystem fileSystem = FileSystem.get(conf);
            boolean mkdirs = fileSystem.mkdirs(new Path("/user/ky1"));  //输入单级或多级文件夹
            System.out.println(mkdirs?"创建成功":"创建失败");
        } catch (IOException e) {
            // TODO 自动生成的 catch 块
            e.printStackTrace();
        }
    }

六、重命名或者移动

    @Test
    public void rename() {
        
        Configuration conf = new Configuration();
        conf.set("fs.defaultFS","hdfs://192.168.100.2:9000");
        try {
            FileSystem fileSystem = FileSystem.get(conf);
            fileSystem.rename(new Path("/hadoop01"), new Path("/hadoop02")); //前者为修改前,后者为修改后
        } catch (IOException e) {
            // TODO 自动生成的 catch 块
            e.printStackTrace();
        }
    }

七、递归遍历所有文件或文件夹

@Test
    public void lsr() {
        
        Configuration conf = new Configuration();
        conf.set("fs.defaultFS","hdfs://192.168.100.2:9000");
        try {
            FileSystem fileSystem = FileSystem.get(conf);
            FileStatus[] listStatus = fileSystem.listStatus(new Path("/"));
            for (FileStatus fileStatus : listStatus) {
                isDir(fileStatus, fileSystem);
            }
            
        } catch (IOException e) {
            // TODO 自动生成的 catch 块
            e.printStackTrace();
        }
    }
    
    public void isDir(FileStatus fileStatus,FileSystem fileSystem) {
        if(fileStatus.isDirectory()) {
            String dirname = fileStatus.getPath().getName();
; System.out.println("文件夹:"+dirname); FileStatus[] listStatus; try { listStatus = fileSystem.listStatus(new Path("/"+dirname)); for (FileStatus fileStatus2 : listStatus) { isDir(fileStatus2,fileSystem); } } catch (FileNotFoundException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } catch (IllegalArgumentException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } catch (IOException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } }else { String dirname = fileStatus.getPath().getName(); System.out.println("文件:"+dirname); } }

还有许多方法用法相似 不一一赘述。

posted @ 2020-02-22 16:13  phy2020  阅读(956)  评论(0)    收藏  举报