zoukankan      html  css  js  c++  java
  • 使用Hadoop打造私有云盘之API操作

    项目介绍:使用hadoop实现云盘的增删读获取列表功能,hadoop不支持数据修改,特性是一次写入多次读取。主流的网盘也不支持该功能。今天我们用hdfs的FileSystem实现这些操作。

    1、上传功能

    指定文件的本地路径和hdfs存储路径,通过hadoop提供的IOUtils工具类将流写入到hdfs中。

    2、下载功能

    指定要访问的hdfs中的文件路径,使用FileSystem的open函数获取Hadoop的输入流,使用Hadoop提供的IOUtils工具类将输入流写入到本地磁盘或者控制太。

    3、删除功能

    指定要访问的hdfs中的文件路径,使用FileSystem的delete函数删除文件或文件夹,返回一个boolean值,判断是否删除成功。

    4、查看文件列表功能

    指定要访问的hdfs中的路径,使用FileSystem的listStatus函数获取列表状态数组,遍历显示列表内容。

    package hdfs;

    import java.io.FileInputStream;
    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.FileStatus;
    import org.apache.hadoop.fs.FileSystem;
    import org.apache.hadoop.fs.Path;
    import org.apache.hadoop.io.IOUtils;

    public class FileSystemAceess {

        /**
         * @param args
         * @throws Exception
         * @throws URISyntaxException
         */
        public static void main(String[] args) throws URISyntaxException, Exception {
            // 传入URI访问地址获取FileSystem对象
            FileSystem fs = getFileSystem(new URI(args[0]));

            //上传函数
            uploadFile(args, fs);
            //下载函数
            ReadFile(args, fs);
            //删除函数
            delete(args, fs);
            //获取列表函数
            listStatus(args, fs);
        }

        private static void listStatus(String[] args, FileSystem fs)
                throws IOException {
            // 获取列表信息
            String pth = args[2].substring(0, 1);
            FileStatus[] listStatus = fs.listStatus(new Path(pth));
            System.out.println("类型 权限 副本数 块大小 文件大小 文件路径");
            // 遍历列表信息
            for (FileStatus fileStatus : listStatus) {
                String fileDir = fileStatus.isDir() ? "文件夹" : "文件";
                String permission = fileStatus.getPermission().toString();
                short replication = fileStatus.getReplication();
                long len = fileStatus.getLen();
                long blockSize = fileStatus.getBlockSize();
                String path = fileStatus.getPath().toString();
                System.out.println(fileDir + " " + permission + " " + replication
                        + " " + (blockSize/1024==0?"文件夹":blockSize/1024/1024+"Mb" )+ " "+(len/1024==0?"文件夹":len+"Byte")+" "+path);

            }
        }

        /**
         * FileSystem.delete 删除文件或文件夹
         *
         * @param args
         *            外部传入的参数
         * @param fs
         *            FileSystem文件系统
         * @throws IOException
         */
        private static void delete(String[] args, FileSystem fs) throws IOException {
            //上传前判断是否存在,如果存在删除
            if(fs.exists(new Path(args[2]))){
                boolean result = fs.delete(new Path(args[2]), true);
                if(result){
                    System.out.println("删除成功!!");
                }else{
                    System.out.println("删除失败!");
                }
            }
           
            /**
             * 第一个参数,删除文件的路径,例如,/a.txt 第二个参数,删除后自动关闭流
             */
            boolean result = fs.delete(new Path(args[2]), true);
            if (result) {
                System.out.println("删除成功!!!");
            } else {

                System.out.println("删除失败!!!");
            }
        }

        /**
         * FileSystem.open 读取、下载
         *
         * @param args
         *            外部传入的参数
         * @param fs
         *            FileSystem对象
         * @throws IOException
         */
        private static void ReadFile(String[] args, FileSystem fs)
                throws IOException {
            // 获取hdfs文件系统的输入流
            FSDataInputStream in = fs.open(new Path(args[2]));
            // 通过hadoop提供的ioutils工具包在控制台输出内容
            IOUtils.copyBytes(in, System.out, 1024, true);
        }

        /**
         * FileSystem.create 上传文件
         *
         * @param args
         * @param fs
         *            FileSystem对象
         * @throws Exception
         *
         */
        @SuppressWarnings("unused")
        private static void uploadFile(String[] args, FileSystem fs)
                throws Exception {
            // 创建文件输入流,指定要上传的文件地址
            FileInputStream in = new FileInputStream(args[1]);
            // 使用create方法上传,设置上传的路径和文件名
            FSDataOutputStream out = fs.create(new Path(args[2]));
            // 使用hadoop提供的IOUtils上传
            /**
             * 第一个参数,输入流也就是指定需要上传的文件路径 第二个参数,输出流是hadoop的存储位置 第三个参数,缓冲区大小 第四个参数,是否上传
             */
            IOUtils.copyBytes(in, out, 1024, true);
        }

        // 获取FileSystem对象
        static FileSystem getFileSystem(URI uri) throws Exception {
            return FileSystem.get(uri, new Configuration());
        }

    }

    hadoop插件设置

    image

    image

    以上参数根据实际情况设置!

    效果图:

    读取文件

    image

    获取列表信息

    image

  • 相关阅读:
    深度优先搜索初尝试-DFS-LakeCounting POJ No.2386
    hdoj-2053-Switch Game
    《算法竞赛入门经典》习题及反思 -<2>
    高精度N的阶乘-N!
    列举一些有所帮助的blog和文章
    hdoj-2039-三角形
    hdoj-2035-人见人爱a^b
    hdoj-2028-Lowest common multiple plus
    hdoj上的一题和程序设计第二次作业的拓展-人见人爱a+b
    程序设计第三次作业---C++计算器雏形
  • 原文地址:https://www.cnblogs.com/luguoyuanf/p/3595838.html
Copyright © 2011-2022 走看看