1. 递归读取文件名

1.1 递归实现读取文件名(scala + listFiles)

/**
* 实现:listFiles方法
* 迭代列出文件夹下的文件,只能列出文件
* 通过fs的listFiles方法可以自动实现递归(自带递归)列出文件类型
* 第一个参数是服务器路径,第二个参数是否递归
* @param srcPath
*/
def listFullFileNames(srcPath: String): List[String] = {
val buffer = new ArrayBuffer[String]
try {
val iterator: RemoteIterator[LocatedFileStatus] = fs.listFiles(new Path(srcPath), true)
while (iterator.hasNext) {
val fileStatus = iterator.next()
buffer.append(fileStatus.getPath.getName)
}
} finally {
this.closeFS(fs)
}
buffer.toList
}

1.2 递归实现读取文件名(scala + listStatus)

 /**
* 通过fs的listStatus方法可以自动实现递归(自带递归)列出文件类型
* @param srcPath 目录
* @param buffer 全局的 ArrayBuffer
* @return
*/ val buffer = new ArrayBuffer[String]()

def listFullFileNames(srcPath: String, buffer: ArrayBuffer[String]): List[String] = {
val fileStatuses: Array[FileStatus] = fs.listStatus(new Path(srcPath))
for (fileStatus <- fileStatuses) {
//判断当前迭代对象是否是目录
if (fileStatus.isDirectory) {
listFullFileNames(fileStatus.getPath.toString, buffer)
} else {
buffer.append(fileStatus.getPath.getName)
}
}
buffer.toList
}

注意:使用了全局buffer,以至于递归收集文件数目

1.3  列出某个目录读取文件名(scala)

 /** 列出具体路径下的所有文件名称 **/
def listFilesNames(finalPath: String): List[String] = {
val listStatus = try {
fs.listStatus(new Path(finalPath)).map(_.getPath.getName).toList
} catch {
case e: Exception => Nil
}
listStatus
}

2. 获取文件状态

2.1 HDFS文件的属性获取

  def readFileContent(path: String) = {
val conf: Configuration = new Configuration()
val fs: FileSystem = FileSystem.newInstance(conf)
val fileStatus: Array[FileStatus] = fs.listStatus(new Path(path))
for (fileStatue <- fileStatus) {
println(
s"""
| 是否为目录: ${fileStatue.isDirectory}
| 是否为文件: ${fileStatue.isFile}
| 该文件上次访问时间:${fileStatue.getAccessTime}
| 文件块大小: ${fileStatue.getBlockSize}
| 文件所属组: ${fileStatue.getGroup}
| 文件长度:${fileStatue.getLen}
| 文件最后修改时间:${fileStatue.getModificationTime}
| 文件所有者:${fileStatue.getOwner}
| 文件的路径:${fileStatue.getPath}
| 文件的父路径:${fileStatue.getPath.getParent}
| 文件的名称:${fileStatue.getPath.getName}
| 文件的权限:${fileStatue.getPermission}
| 文件副本数:${fileStatue.getReplication}
| ${fileStatue.getSymlink}
""".stripMargin) }
}

2.2  正则表达式获取文件状态

/**
* 正则获取文件信息
*/
def readStatusGlobStatus() = {
val conf: Configuration = new Configuration()
// val fs: FileSystem = FileSystem.newInstance(conf)
val fs = FileSystem.get(new URI("hdfs://192.xxx.xxx.xxx:9000"), conf, "master")
val path = new Path("/user/compass/*/*") // 路径正则表达式
val fileStatus: Array[FileStatus] = fs.globStatus(path) // 文件名数组
for (fileStatue <- fileStatus) {
println(
s"""
| 文件的名称:${fileStatue.getPath.getName}
| 文件的路径:${fileStatue.getPath}
""".stripMargin)
}
}

2.3  正则表达式过滤文件

/**
* 过滤文件信息
* 过滤出包含compass的路径
*/
def readStatusFilterGlobStatus() = {
val conf: Configuration = new Configuration()
// val fs: FileSystem = FileSystem.newInstance(conf)
val fs = FileSystem.get(new URI("hdfs://192.xxx.xxx.xxx:9000"), conf, "master")
val path = new Path("/user/compass/*/*") // 路径正则表达式
val fileGlobStatuses = fs.globStatus(path, new PathFilter {
override def accept(path: Path): Boolean = {
val contidion: String = "compass"
path.toString.contains(contidion)
}
})
注:globStatus 很灵活,内部甚至可以写一些正则表达式,有时候在处理大数据的预处理的时候可能很有效

参考:https://www.cnblogs.com/yinzhengjie/p/9094087.html

HDFS API 操作实例(二) 目录操作的更多相关文章

  1. linux文件操作篇 (四) 目录操作

    #include <sys/stat.h>#include <unistd.h>#include <dirent.h> //创建文件夹 路径 掩码 int mkdi ...

  2. Selenium常用操作汇总二——如何操作select下拉框

    下面我们来看一下selenium webdriver是如何来处理select下拉框的,以http://passport.51.com/reg2.5p这个页面为例.这个页面中有4个下拉框,下面演示4种选 ...

  3. Selenium常用操作汇总二——如何操作cookies(转)

    Web 测试中我们经常会接触到Cookies,一个Cookies主要属性有”所在域.name.value.有效日期和路径",下面来讲一下怎么操作Cookies. import java.ut ...

  4. Python学习笔记(二十五)操作文件和目录

    摘抄:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0014319253241 ...

  5. Python之IO编程——文件读写、StringIO/BytesIO、操作文件和目录、序列化

    IO编程 IO在计算机中指Input/Output,也就是输入和输出.由于程序和运行时数据是在内存中驻留,由CPU这个超快的计算核心来执行,涉及到数据交换的地方,通常是磁盘.网络等,就需要IO接口.从 ...

  6. SSISDB2:SSIS工程的操作实例

    SSISDB 系列随笔汇总: SSISDB1:使用SSISDB管理Package SSISDB2:SSIS工程的操作实例 SSISDB3:Package的执行实例 SSISDB4:当前正在运行的Pac ...

  7. IO编程(2)-操作文件和目录

    操作文件和目录 如果我们要操作文件.目录,可以在命令行下面输入操作系统提供的各种命令来完成.比如dir.cp等命令. 如果要在Python程序中执行这些目录和文件的操作怎么办?其实操作系统提供的命令只 ...

  8. os,操作文件和目录

    如果我们要操作文件.目录,可以在命令行下面输入操作系统提供的各种命令来完成.比如dir.cp等命令. 如果要在Python程序中执行这些目录和文件的操作怎么办?其实操作系统提供的命令只是简单地调用了操 ...

  9. python学习笔记 操作文件和目录

    如果我们要操作文件.目录,可以在命令行下面输入操作系统提供的各种命令来完成.比如dir.cp等命令. 如果要在Python程序中执行这些目录和文件的操作怎么办?其实操作系统提供的命令只是简单地调用了操 ...

随机推荐

  1. Openfire调整成自己的IM部署到LInux系统上

    部署自己的IM到Linux系统下:需要生成相关jar包再部署 1.在myeclipse上把openfire源代码加在加载进来,做相应调整后,运行测试没问题 2.  编译admin-jsp.jar(所有 ...

  2. vscode 编写Python走过的坑

    1,在使用vscode 中import turtle 这个模块, 再调用t = turtle.Pen(),始终提示无法找到turtle模块 2.可是使用terminal 中调用turtle模块,没有问 ...

  3. 1251 client does not support

    1.mysql -uroot -p 123456        (用户root,密码123465) 2.use mysql: 3.ALTER USER 'root'@'localhost' IDENT ...

  4. POJ 1873 UVA 811 The Fortified Forest (凸包 + 状态压缩枚举)

    题目链接:UVA 811 Description Once upon a time, in a faraway land, there lived a king. This king owned a ...

  5. 服务器搭建node环境

    最近由于工作原因开始学习服务器的搭建和环境配置.记录一下我在服务器搭建node环境的步骤.中间踩了很多坑. 首先,确定自己的服务器可以连接到外网,如果连接不上的话,会出现ETIMEOUT的报错,但这只 ...

  6. 第五记 JDBC

    了解JDBC JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API(API:Application Program Inter ...

  7. C# WinfForm 控件之dev表格 GridControl

    基本用法 1.新建一个winformAPP 放一个gridControl 为gridC 再放一个button 用法与dataGrid一样 代码如下: /// <summary> /// 显 ...

  8. poj 3258 二分

    题意:看了很久才懂,有n个石头,去掉m个后,求跳两个石头或石头和岸边距离最小的最大值,就是至少要跳的距离的最大. 参考博客: 代码: #include<stdio.h> #include& ...

  9. .Net平台调用の初识

    前言 工作过程中难免遇到混合编程,现在我们要谈的是C#和c++语言的编程.C#要调用C++的库目前可选主要有两种方式:Com技术和平台调用(P/Invoke).现在我们要谈的是P/Invoke技术. ...

  10. Keil5-建立第一个STM32工程

    此致:特别感谢作者Lomo-chen所写的文章给我的帮助,我尝试做了一下,成功了,今天整理一下. 一.建立文件夹: 1.在桌面或其他盘建立一个文件夹,此处名称为Test,用来存放工程程序. 2.在Te ...