项目介绍:使用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插件设置

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

效果图:

读取文件

获取列表信息

最新文章

  1. my SQL下载安装,环境配置,以及密码忘记的解决,以及navicat for mysql下载,安装,测试连接
  2. JavaWeb前端:JQuery
  3. serv-u and hway3.0
  4. 用imageNamed加载图片产生的问题
  5. Ubuntu14.04 切换root账户su root失败解决办法
  6. spoj 138
  7. css笔记--web端小于1px设计的处理方法
  8. Yum安装Memcache
  9. FBReader移植日记 第一天
  10. QProcess 进程类—调用外部程序
  11. mybatis入门篇基——基本配置与参数说明
  12. POI excel导出
  13. centos7配置静态ip地址
  14. Servlet(四):request和response对象
  15. 【转载】系统吞吐量(TPS)、用户并发量、性能测试概念和公式
  16. 关于make: *** No rule to make target `clean'. Stop.这个莫名其妙问题的解决方法
  17. python3 raise HTTPError(req.full_url, code, msg, hdrs, fp) urllib.error.HTTPError: HTTP Error 403: Forbid
  18. CVE-2010-2883
  19. 【oneday_onepage】—— 美国人的仪容整洁与个人卫生
  20. Android-天气预报Demo-JSON数据解析

热门文章

  1. 我的第一个BAE python应用
  2. 一步步学习ASP.NET MVC3 (15)——过滤器
  3. Emule使用Upnp,解决Lowid和port not reachable的问题
  4. PHP漏洞全解(八)-HTTP响应拆分
  5. c语言的自动类型转换
  6. 中国海洋大学第四届朗讯杯高级组 I Cuckoo for Hashing
  7. Mpeg-2的同步及时间恢复--STC,PCR,DTS,PTS
  8. 如何迁移SharePoint 2010至新的站点
  9. 《深入理解linux内核》第二章 内存寻址
  10. write & read a sequence file(基于全新2.2.0API)