FileSystem使用

 核心类 org.apache.hadoop.fs.FileSystem 文件系统类 抽象类

//静态方法创建对象
public static FileSystem newInstance(URI uri,Configuration conf,String user)
/*
     	  参数一  URI  分布式文件系统 HDFS的资源地址 NN地址 hdfs://linux01:8020
          参数二  Configuration  用户自定义参数设置   副本数 3   物理切块的大小 128M
          		 
          参数三  user  客户端用户名      
 */   
/*
      org.apache.hadoop.fs.FileSystem  文件系统类  抽象类
         静态方法获取对象(子类对象)
              public static FileSystem newInstance(URI uri,Configuration conf,String user)
                    URI uri: 统一资源标识符   协议://
                                url统一资源定位符   www.baidu.com
                                只要是网络相关的 都是uri包括url
                                迅雷下载 百度网盘 邮件发送 mailto:  jdbc连接
                             分布式文件系统 HDFS的资源地址 NN地址
                             hdfs://linux01:8020
                             构造方法
                                  public URI uri
                   Configuration conf:用户自定义参数设置   副本数 3   物理切块的大小 128M
                                      如果不设置 使用默认设置
                   String user: 用户名  root
 */
public class Demo01_FileSystem {
    public static void main(String[] args) throws URISyntaxException, IOException, InterruptedException {
        //文件系统的客户端连接对象
        URI  uri = new URI("hdfs://linux01:8020");
        //配置对象 没有进行配置 使用默认配置
        Configuration  con = new Configuration();
        //用户名
        String user = "root";
        //通过静态方法 获取 分布式文件系统对象
        FileSystem fs = FileSystem.newInstance(uri, con, user);
        System.out.println(fs);
    }
}

常用方法

public void copyFromLocalFile(Path src, Path dst)  将本地文件上传到文件系统
public void copyFromLocalFile(boolean delSrc, Path src, Path dst)
public void copyToLocalFile(Path src, Path dst)    将文件系统上的文件下载到本地
public void copyToLocalFile(boolean delSrc, Path src, Path dst)
public FileStatus[] listStatus(Path f) 列出目录下所有的内容 包括文件  文件夹
public RemoteIterator<LocatedFileStatus> listFiles(Path f, boolean recursive)列出目录下所有的文件
public FSDataOutputStream create(Path f, boolean overwrite)  获取字节输出流 向文件中写数据
public FSDataOutputStream append(Path path) 向指定的文件路径中追加写入数据
public FSDataInputStream open(Path f) 获取字节输入流 读取文件中数据

 获取文件系统对象工具类

public class HDFSUtils {
    private HDFSUtils(){}

    public static FileSystem  getFileSystem() throws  Exception {
        //文件系统的客户端连接对象
        URI uri = new URI("hdfs://linux01:8020");
        //配置对象 没有进行配置 使用默认配置
        Configuration con = new Configuration();
        //用户名
        String user = "root";
        //通过静态方法 获取 分布式文件系统对象
        FileSystem fs = FileSystem.newInstance(uri, con, user);
        return fs;
    }
}

上传文件

public class Demo03_FileSystem {
    public static void main(String[] args) throws IOException {
        FileSystem fs = HDFSUtils.getFs();
        Path src = new Path("d://1.jpg");
        Path dest = new Path("/user");
//        fs.copyFromLocalFile(src,dest);

        //上传并改名
        dest = new Path("/user/11.jpg");
//        fs.copyFromLocalFile(src,dest);

        //上传并删除源文件
//        fs.copyFromLocalFile(true,src,dest);

        //上传不删除源文件 如文件已存在 报错   如不存在,直接上传
        dest = new Path("/user/111.jpg");
        fs.copyFromLocalFile(false,false,src,dest);
        fs.close();
    }
}

下载文件

public class Demo04_FileSystem {
    public static void main(String[] args) throws IOException {
        FileSystem fs = HDFSUtils.getFs();
        Path src = new Path("/user/1.jpg");
        Path dest = new Path("d://ideawork//11.jpg");

//        fs.copyToLocalFile(src,dest);
        dest = new Path("d://ideawork//aaa//111.jpg");
        fs.copyToLocalFile(false,src,dest,true);

        fs.close();
    }
}

遍历文件

public class Demo05_FileSystem {
    public static void main(String[] args) throws IOException {
        FileSystem fs = HDFSUtils.getFs();
        FileStatus[] fileArr = fs.listStatus(new Path("/"));
        for (FileStatus fileStatus : fileArr) {
            if (fileStatus.isDirectory()){
                System.out.println("是文件夹");
            }else
            {
                System.out.println("是文件");
            }
            System.out.println("权限: "+fileStatus.getPermission());
            System.out.println("拥有者: "+fileStatus.getOwner());
            System.out.println("组: "+fileStatus.getGroup());
            System.out.println("大小: "+fileStatus.getLen());
            System.out.println("最后修改时间: "+new Date(fileStatus.getModificationTime()));
            System.out.println("副本个数: "+fileStatus.getReplication());
            System.out.println("切块大小: "+fileStatus.getBlockSize()/1024/1024);
            System.out.println("文件名: "+fileStatus.getPath().getName());
            System.out.println("-------------------------------------------------");
        }

        fs.close();
    }
}

写数据

public class Demo07_FileSystem {
    public static void main(String[] args) throws IOException {
        FileSystem fs = HDFSUtils.getFs();
       /* FSDataOutputStream out = fs.create(new Path("/person.txt"), true);
        out.write("lzm\r\n".getBytes());
        out.write("cyl\r\n".getBytes());
        out.close();*/
        FSDataOutputStream append = fs.append(new Path("/person.txt"));
        append.write("spicy\r\n".getBytes());
        append.write("Thirsty\n".getBytes());
        append.close();

    }
}

读数据

public class Demo08_FileSystem {
    public static void main(String[] args) throws IOException {
        FileSystem fs = HDFSUtils.getFs();
        FSDataInputStream in = fs.open(new Path("/person.txt"));
/*
        byte[] bytes = new byte[1024];
        int len =0;
        while((len = in.read(bytes))!=-1){
            System.out.println(new String(bytes,0,len));
        }
        in.close();*/

        InputStreamReader isr = new InputStreamReader(in);
        BufferedReader br = new BufferedReader(isr);

        String line = null;
        while((line = br.readLine())!=null){
            System.out.println(line);
        }
        in.close();
        isr.close();
        fs.close();
    }
}

其他方法

//DistributedFileSystem
public class Demo10_FileSystem {
    public static void main(String[] args) throws Exception {
        FileSystem fileSystem = HDFSUtils.getFileSystem();

        fileSystem.delete(new Path("/1.txt"),true);  //删除
        fileSystem.mkdirs(new Path("/aaa/bbb") ); //创建文件夹
        fileSystem.exists(new Path("/aaa/1.txt")); //判断路径是否存在

        //...
      fileSystem.close();
    }
}

小文件合并

public class Demo10_FileSystem {
    public static void main(String[] args) throws IOException {
        FileSystem fs = HDFSUtils.getFs();
        FSDataOutputStream out = fs.create(new Path("/java/big2.txt"));

/*
        File dir = new File("d:\\ideawork\\bbb");
        File[] files = dir.listFiles();
        for (File file : files) {
            InputStream in = new FileInputStream(file);
            IOUtils.copy(in,out);
            IOUtils.closeQuietly(in);
        }
        IOUtils.closeQuietly(out);*/

        LocalFileSystem local = FileSystem.getLocal(new Configuration());
        FileStatus[] fileArr = local.listStatus(new Path("d:\\ideawork\\bbb"));
        for (FileStatus fileStatus : fileArr) {
            Path path = fileStatus.getPath();
            FSDataInputStream in = local.open(path);
            IOUtils.copy(in,out);
            IOUtils.closeQuietly(in);
        }
        IOUtils.closeQuietly(out);
    }
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值