项目介绍:使用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("类型\t权限\t\t副本数\t块大小\t\t\t文件大小\t\t文件路径");
        // 遍历列表信息
        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 + "\t" + permission + "\t" + replication
                    + "\t" + (blockSize/1024==0?"文件夹":blockSize/1024/1024+"Mb" )+ "\t\t"+(len/1024==0?"文件夹":len+"Byte")+"\t"+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插件设置

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

效果图:

读取文件

获取列表信息

使用Hadoop打造私有云盘之API操作的更多相关文章

  1. 基于Hadoop开发网络云盘系统架构设计方案

    基于Hadoop开发网络云盘系统架构设计方案第一稿 引言 云计算技术的发展,各种网络云盘技术如雨后春笋,层出不穷,百度.新浪.网易都推出了自己的云盘系统,本文基于开源框架Hadoop设计实现了一套自己 ...

  2. nextcloud私有云盘的部署

    nextcloud在centos系统下搭建自己的私有云盘 搭建一套自己的私有云盘,让数据存储更加方便.可靠.自己搭建的云存储,首先没有什么容量.下载速度的限制,而且本地访问速度很快.一开始以为Next ...

  3. 基于Hadoop开发网络云盘系统客户端界面设计初稿

    基于Hadoop开发网络云盘系统客户端界面设计初稿 前言: 本文是<基于Hadoop开发网络云盘系统架构设计方案>的第二篇,针对界面原型原本考虑有两个方案:1.类windows模式,文件夹 ...

  4. linux下使用URLOS搭建nextcloud私有云盘系统

    Nextcloud是一个免费专业的私有云存储网盘开源项目,可以让你简单快速地在个人/公司电脑.服务器甚至是树莓派等设备上架设一套属于自己或团队专属的云同步网盘,从而实现跨平台跨设备文件同步.共享.版本 ...

  5. 政务私有云盘系统建设的工具 – Mobox私有云盘

    序言 这几年,智慧政务已经成为了政府行业IT建设发展的重要进程.传统办公方式信息传递速度慢.共享程度低.查询利用难,早已成为政府机关获取和利用信息的严重制约因素.建立文档分享共用机制,加强数据整合,避 ...

  6. 基于Hadoop开发网络云盘系统架构设计方案第一稿

    引言 云计算技术的发展,各种网络云盘技术如雨后春笋,层出不穷,百度.新浪.网易都推出了自己的云盘系统,本文基于开源框架Hadoop设计实现了一套自己的网络云盘系统,方案为初步设计方案,不断完善中. 一 ...

  7. 极客DIY:使用树莓派制作一套“NAS+私有云盘+下载机”

    原创作者:HackLiu 0×00 前言 ‍ ‍ 如果你家里有多台设备需要联网需要娱乐,你一定会或多或少遇到设备碎片化带来的烦恼.当然,已经有很多厂商包括新晋的小米.360在内的互联网公司做了这个事情 ...

  8. Nextcloud私有云盘在Centos7下的部署笔记

    搭建个人云存储一般会想到ownCloud,堪称是自建云存储服务的经典.而Nextcloud是ownCloud原开发团队打造的号称是“下一代”存储.初一看觉得“口气”不小,刚推出来就重新“定义”了Clo ...

  9. 使用树莓派制作一套“NAS+私有云盘+下载机”

    ‍ ‍‍原创作者:HackLiu‍‍ ‍ 0×00 前言 ‍‍如果你家里有多台设备需要联网需要娱乐,你一定会或多或少遇到设备碎片化带来的烦恼.当然,已经有很多厂商包括新晋的小米.360在内的互联网公司 ...

随机推荐

  1. mvc框架下,怎样用cookie实现下次自动登录

    登录时有个下次自动登录的checkBox.点了它下次就可以自动登录了 具体流程我都晓得,就是细节的地方有些搞不定.我只要解决3个问题: (1)登录时如果点了checkbox,则在本机产生一个cooki ...

  2. poj 2175 Evacuation Plan 最小费用流判定,消圈算法

    题目链接 题意:一个城市有n座行政楼和m座避难所,现发生核战,要求将避难所中的人员全部安置到避难所中,每个人转移的费用为两座楼之间的曼哈顿距离+1,题目给了一种方案,问是否为最优方案,即是否全部的人员 ...

  3. C语言中的指针学习(小黑板)

    指针是C语言中的精华所在,也是C语言的危险之在,今天又重现温习了一下C语言,做了一下总结. 欢迎批阅. (1)指针的含义指针的本质也是数据类型,它是指向地址的变量.例如: { int a = 10; ...

  4. 深入研究java.lang.ProcessBuilder类

     深入研究java.lang.ProcessBuilder类 一.概述       ProcessBuilder类是J2SE 1.5在java.lang中新添加的一个新类,此类用于创建操作系统进程,它 ...

  5. jQuery UI dialog 的使用

    今天用到了客户端的对话框,把 jQuery UI 中的对话框学习了一下. 准备 jQuery 环境 首先,我们创建一个按钮,点击这个按钮的时候,将会弹出一个对话框. 1 <input type= ...

  6. float([x]): 将一个字符串或数转换为浮点数。如果无参数将返回0.0

    float([x]): 将一个字符串或数转换为浮点数.如果无参数将返回0.0 >>> float(12) 12.0 >>> float(-122) -122.0 & ...

  7. 练习-libev和pyev示例

    事件循环,IO复用,还是理解深刻一点好. 比较LIBEV和PYEV,发现PYTHON库只是对LIBEV作了简单的语法转换. 到了这个层次,就一个字:DIAO!!! libev的C版: #include ...

  8. UVA 10608 Friends

    题目大意:共有n个人,m对人为已知的朋友关系,而且这种关系具有传递性,也就是A与B,B与C是朋友,可以确定A与C是朋友,求一个人数最多的朋友团体. bfs就可以了,遇到未访问的结点,加入队列并且朋人数 ...

  9. DHTMLX 前端框架 建立你的一个应用程序 教程(七)-- 添加筛选功能

    表格的过滤筛选 我们在每列第一行添加一个文本,用做数据的条件筛选. 我们还提供服务端的筛选 ,当有大量数据时 , 我们可以使用dhtmlxConnector 进行后台数据的筛选. 添加过滤器到表格列中 ...

  10. 【原创】MIPS浅议之——中断系统之我见

    最近,准确的说应该是最近两个月的时间,我都在研究MIPS的异常与中断.或者可以说,最近这两个月,我才真正了解中断系统的整个结构和处理流程以及为什么要这样做?这段时间我最大的体会就是以前我们在“计算机组 ...