HDFS(Hadoop Distributed File System)是Hadoop项目的核心子项目,在大数据开发中通过分布式计算对海量数据进行存储与管理。它基于流数据模式访问和处理超大文件的需求而开发
FileSystem是HDFS Java API的核心工具类,该类是一个抽象类,其中封装了很多操作文件的方法,使用这些方法可以很轻松地操作HDFS中的文件。
package com.xc.xcspringboot.test; import org.apache.hadoop.conf.Configuration; 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; import org.apache.hadoop.util.Progressable; import java.io.BufferedInputStream; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.sql.Timestamp; public class HdfsApiTest { private static FileSystem hdfs; static { Configuration conf = new Configuration(); //设置HDFS访问地址 conf.set("fs.default.name", "hdfs://172.19.25.168:9000"); try { //取得FileSystem文件系统实例 hdfs = FileSystem.get(conf); } catch (IOException e) { e.printStackTrace(); } } public static void main(String[] args) throws Exception { // mkdirs(hdfs); // createFile(hdfs); // createFileProgressable(hdfs); // getFile(hdfs); // deleteFile(hdfs); // listStatus(hdfs); // getFileStatus(hdfs); // copyFromLocalFile(hdfs); copyToLocalFile(hdfs); } /** * 创建目录 */ public static void mkdirs(FileSystem hdfs) throws IOException { boolean isok = hdfs.mkdirs(new Path("hdfs:/mydir")); if (isok) { System.out.println("创建目录成功!"); } else { System.out.println("创建目录失败! "); } } /** * 创建文件 */ public static void createFile(FileSystem hdfs) throws Exception { //打开一个输出流 FSDataOutputStream outputStream = hdfs.create(new Path("hdfs:/mydir/newfile2.txt")); //写入文件内容 outputStream.write("我是文件内容".getBytes()); System.out.println("文件创建成功! "); } /** * 查询HDFS文件内容并输出 */ public static void getFile(FileSystem hdfs) throws IOException { //打开文件输入流 InputStream in = hdfs.open(new Path("hdfs:/mydir/newfile2.txt")); //输出文件内容 IOUtils.copyBytes(in, System.out, 4096, false); } /** * 上传文件并监控上传进度 */ public static void createFileProgressable(FileSystem hdfs) throws IOException { InputStream in = new BufferedInputStream(new FileInputStream("D:/导入导出/Java大全(2021年).pdf")); //上传文件并监控上传进度 FSDataOutputStream outputStream = hdfs.create(new Path("hdfs:/mydir/Java大全(2021年).pdf"), new Progressable() { @Override public void progress() {//回调 方法显示进度 System.out.println("."); } }); IOUtils.copyBytes(in, outputStream, 4096, false); } /** * 删除文件 */ public static void deleteFile(FileSystem hdfs) throws Exception { Path path = new Path("hdfs:/mydir/newfile2.txt"); //删除文件 boolean isok = hdfs.deleteOnExit(path); if (isok) { System.out.println("删除成功!"); } else { System.out.println("删除失败! "); } } /** * 递归遍历目录和文件 */ public static void listStatus(FileSystem hdfs) throws IOException { //遍历HDFS上的文件和目录 FileStatus[] fs = hdfs.listStatus(new Path("hdfs:/")); if (fs.length > 0) { for (FileStatus f : fs) { showDir(f); } } } private static void showDir(FileStatus fs) throws IOException { Path path = fs.getPath(); //输出文件或目录的路径 System.out.println(path); //如果是目录,则递归遍历该目录下的所有子目录或文件 if (fs.isDirectory()) { FileStatus[] f = hdfs.listStatus(path); if (f.length > 0) { for (FileStatus file : f) { showDir(file); } } } } /** * 获取文件或目录的元数据 */ public static void getFileStatus(FileSystem hdfs) throws IOException { Path path = new Path("hdfs:/mydir/newfile2.txt"); FileStatus fileStatus = hdfs.getFileStatus(path); //判断是文件夹还是文件 if (fileStatus.isDirectory()) { System.out.println("这是一个文件夹"); } else { System.out.println("这是一个文件"); //输出元数据信息 System.out.println("文件路径: " + fileStatus.getPath()); System.out.println("文件修改日期: " + new Timestamp(fileStatus.getModificationTime()).toString()); System.out.println("文件上次访问日期: " + new Timestamp(fileStatus.getAccessTime()).toString()); System.out.println("文件长度: " + fileStatus.getLen()); System.out.println("文件备份数: " + fileStatus.getReplication()); System.out.println("文件块大小: " + fileStatus.getBlockSize()); System.out.println("文件所有者:" + fileStatus.getOwner()); System.out.println("文件所在分组: " + fileStatus.getGroup()); System.out.println("文件的权限: " + fileStatus.getPermission().toString()); } } /** * 上传本地文件 */ public static void copyFromLocalFile(FileSystem hdfs) throws IOException { //创建可供hadoop使用的文件系统路径 Path src = new Path("D:/xc-desktop/日志1.txt"); //本地目录/文件 Path dst = new Path("hdfs:/mydir/日志1.txt"); //HDFS目录/文件 //复制上传本地文件至HDFS文件系统中 hdfs.copyFromLocalFile(src, dst); System.out.println("文件上传成功!"); } /** * 下载文件到本地 */ public static void copyToLocalFile(FileSystem hdfs) throws IOException { //创建可供hadoop使用的文件系统路径 Path src = new Path("hdfs:/mydir/日志1.txt"); //HDFS目录/文件 Path dst = new Path("D:/xc-desktop/日志1.txt"); //本地目录/文件 //4.从HDFS文件系统中复制下载文件至本地 hdfs.copyToLocalFile(false, src, dst, true); System.out.println("文件下载成功!"); } }
书籍:Hadoop大数据技术开发实战 4.4 HDFS Java API操作
https://gitee.com/caoyeoo0/xc-springboot/blob/hadoopApi/src/main/java/com/xc/xcspringboot/test/HdfsApiTest.java
标签:HDFS,Java,hdfs,System,API,文件,println,Path,out From: https://www.cnblogs.com/ooo0/p/16869872.html