zoukankan      html  css  js  c++  java
  • 【HDFS API编程】查看目标文件夹下的所有文件、递归查看目标文件夹下的所有文件

    使用hadoop命令:hadoop fs -ls /hdfsapi/test  我们能够查看HDFS文件系统/hdfsapi/test目录下的所有文件信息

    那么使用代码怎么写呢?直接先上代码:(这之后贴上去的代码怎么就全灰色了?....)

    public class HDFSApp {

        public static final String HDFS_PATH = "hdfs://hadoop000:8020";
        FileSystem fileSystem = null;
        Configuration configuration = null;

        @Before
        public void setUp() throws Exception{
            System.out.println("setUp-----------");
            configuration = new Configuration();
            configuration.set("dfs.replication","1");

            /**
             * 构造一个访问制定HDFS系统的客户端对象
             * 第一个参数:HDFS的URI
             * 第二个参数:客户端制定的配置参数
             * 第三个参数:客户端的身份,说白了就是用户名
             */
            fileSystem = FileSystem.get(new URI(HDFS_PATH),configuration,"hadoop");
        }
      /** * 查看目标文件夹下的所有文件 * @throws Exception */ @Test public void listFiles() throws Exception{ FileStatus[] statuses = fileSystem.listStatus(new Path("/hdfsapi/test")); for(FileStatus file : statuses){ String isDir = file.isDirectory() ? "文件夹" : "文件"; String permission = file.getPermission().toString(); short replication = file.getReplication(); long length = file.getLen(); String path = file.getPath().toString(); System.out.println(isDir + " " + permission + " " + replication + " " + length + " " + path); } }
       @After
        public void tearDown(){
            configuration = null;
            fileSystem = null;
            System.out.println("----------tearDown------");
        }
    }

    运行测试类:
    setUp-----------
    log4j:WARN No appenders could be found for logger (org.apache.hadoop.metrics2.lib.MutableMetricsFactory).
    log4j:WARN Please initialize the log4j system properly.
    log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
    文件    rw-r--r--    3    14    hdfs://hadoop000:8020/hdfsapi/test/a.txt
    文件    rw-r--r--    1    28    hdfs://hadoop000:8020/hdfsapi/test/c.txt
    文件    rw-r--r--    1    181367942    hdfs://hadoop000:8020/hdfsapi/test/jdk.zip
    文件    rw-r--r--    1    2732    hdfs://hadoop000:8020/hdfsapi/test/t.txt
    文件夹    rwxr-xr-x    0    0    hdfs://hadoop000:8020/hdfsapi/test/testdir
    ----------tearDown------

    首先我们找到fileSystem的listStatus方法,这个方法怎么用?还是那句话:哪里不会Ctrl点哪里。我们点进去能看到方法的源码信息,能够知道该方法的返回值是一个FileStatus[]数组类型,所要传入的参数是目标目录Path:

     /**
       * List the statuses of the files/directories in the given path if the path is
       * a directory.
       * <p>
       * Does not guarantee to return the List of files/directories status in a
       * sorted order.
       *列出给定路径中文件/目录的状态(如果路径为目录。不保证返回排序顺序。 
       * @param f given path
       * @return the statuses of the files/directories in the given patch
       * @throws FileNotFoundException when the path does not exist;
       *         IOException see specific implementation
       */
      public abstract FileStatus[] listStatus(Path f) throws FileNotFoundException, 
                                                             IOException;

    既然返回的是一个数组类型,我们自然会想到用循环来遍历,但是FileStatus 这个又是什么呢?Ctrl点进去:

    /** Interface that represents the client side information for a file.
     *表示文件的客户端信息的接口。
     */
    @InterfaceAudience.Public
    @InterfaceStability.Stable
    public class FileStatus implements Writable, Comparable {
    
      private Path path;
      private long length;
      private boolean isdir;
      private short block_replication;
      private long blocksize;
      private long modification_time;
      private long access_time;
      private FsPermission permission;
      private String owner;
      private String group;
      private Path symlink;

    FileStatus这是一个表示文件的客户端信息的接口,贴上了一些类的成员变量,我们能从中知道这个里面包含了文件的这么多信息接口。自然就能够使用类里的方法进行访问取得文件的相关信息了。

    测试成功,但是我们发现一个问题,就是这个方法就如hadoop fs -ls /hdfsapi/test 一样用户只能查看到当前目录下的文件信息,倘若文件夹test下还有文件夹testdir,testdir文件夹里还有文件就无法显示了,所以我们来看看怎么进行递归查看目标文件夹下的所有文件。

    首先通过hadoop命令递归查看: hadoop fs -ls -R /hdfsapi/test    (赶紧试试去 recursive 递归)

    那么通过代码怎么实现呢?

    我们之前使用的是fileSystem下的listStatus方法,那么我们继续查看API有没有能够使用的,我们看到有一个方法是listFiles

     /**
       * List the statuses and block locations of the files in the given path.
       * Does not guarantee to return the iterator that traverses statuses
       * of the files in a sorted order.
       * 
       * If the path is a directory, 
       *   if recursive is false, returns files in the directory;
       *   if recursive is true, return files in the subtree rooted at the path.
       * If the path is a file, return the file's status and block locations.
       * 
       * @param f is the path
       * @param recursive if the subdirectories need to be traversed recursively
       *
       * @return an iterator that traverses statuses of the files
       *
       * @throws FileNotFoundException when the path does not exist;
       *         IOException see specific implementation
       */
      public RemoteIterator<LocatedFileStatus> listFiles(
          final Path f, final boolean recursive)
      throws FileNotFoundException, IOException {}

    所以需要我们不仅善于查看API还要善于查找API。

    于是递归查看目标文件夹下的所有文件代码这么写:

    /**
         * 递归查看目标文件夹下的所有文件
         * @throws Exception
         */
        @Test
        public void listFilesRecursive() throws Exception{
    
            RemoteIterator<LocatedFileStatus> files = fileSystem.listFiles(new Path("/hdfsapi/test"),true);
    
            while (files.hasNext()){
                LocatedFileStatus file = files.next();
                String isDir = file.isDirectory() ? "文件夹" : "文件";
                String permission = file.getPermission().toString();
                short replication = file.getReplication();
                long length = file.getLen();
                String path = file.getPath().toString();
                System.out.println(isDir + "	" + permission + "	" + replication + "	" + length + "	" + path);
            }
        }
    
    运行测试类:
    setUp-----------
    log4j:WARN No appenders could be found for logger (org.apache.hadoop.metrics2.lib.MutableMetricsFactory).
    log4j:WARN Please initialize the log4j system properly.
    log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
    文件    rw-r--r--    3    14    hdfs://hadoop000:8020/hdfsapi/test/a.txt
    文件    rw-r--r--    1    28    hdfs://hadoop000:8020/hdfsapi/test/c.txt
    文件    rw-r--r--    1    181367942    hdfs://hadoop000:8020/hdfsapi/test/jdk.zip
    文件    rw-r--r--    1    2732    hdfs://hadoop000:8020/hdfsapi/test/t.txt
    文件    rw-r--r--    1    11    hdfs://hadoop000:8020/hdfsapi/test/testdir/h.txt
    ----------tearDown------
  • 相关阅读:
    CSS Modules
    回调地狱
    css实现双色饼图
    vue项目中使用less
    pug(jade) 学习笔记
    React组件proptypes, ref
    react+express实现跨域
    react高阶组件
    Oracle数据库出现锁表情况分析
    JPA常用注解记录
  • 原文地址:https://www.cnblogs.com/Liuyt-61/p/10742824.html
Copyright © 2011-2022 走看看