使用Java API *** 作HDFS时,_方法用于获取文件列表?

使用Java API *** 作HDFS时,_方法用于获取文件列表?,第1张

当使用 Java API *** 作 HDFS 时,可以使用 FileSystem.listFiles() 方法来获取文件列表。该方法接受一个 Path 对象,表示要列举文件的目录,并返回一个 RemoteIterator<LocatedFileStatus>对象,该对象可用于迭代目录中的文件。

例如,下面的代码演示了如何使用 listFiles() 方法来获取 HDFS 上的文件列表:

// 定义 HDFS 连接配置

Configuration conf = new Configuration()

// 获取 HDFS FileSystem 对象

FileSystem fs = FileSystem.get(conf)

// 定义要列举文件的目录

Path dirPath = new Path("/user/hadoop")

// 获取文件列表

RemoteIterator<LocatedFileStatus>fileIter = fs.listFiles(dirPath, true)

// 遍历文件列表

while (fileIter.hasNext()) {

// 获取当前文件信息

LocatedFileStatus fileStatus = fileIter.next()

// 输出文件名称和大小

System.out.println(fileStatus.getPath().getName() + " : " + fileStatus.getLen())

}

用API的方式比Dir也快不了多少的,因为目前而言,电脑运行速度的最大瓶颈就是硬盘,不管CPU、主板、内存、显卡有多快,在执行文件 *** 作时都不得不慢下来等待硬盘,所以不管软件编得多好多努力,对速度的提升都不大的。就像几十万辆车要排队过一条小桥,一次只能过一辆,那么即使所有车都是法拉利、保时捷,通过小桥的速度也比几十万台拖拉机甚至牛车快不了多少的!关键是要拓宽桥的宽度,或者多建几座桥,比如把机械硬盘换成固态硬盘,速度就会有明显提升的。

vector<string>vt_result

void find(string lpPath)

{

//lpPath 是一个路径

string szFind

string szFile

WIN32_FIND_DATAA FindFileData //保存文件的属性

szFind = lpPath

szFind += "\\*.*"

HANDLE hFinds =::FindFirstFileA(szFind.c_str(),&FindFileData)

if(INVALID_HANDLE_VALUE == hFinds)

return

while(TRUE)

{

if(FindFileData.dwFileAttributes &FILE_ATTRIBUTE_DIRECTORY)

{

if(FindFileData.cFileName[0]!=L'.')

{

szFile = lpPath

szFile += "\\"

szFile += FindFileData.cFileName

find(szFile)//递归遍历子文件夹

}

}

else

{

string str = lpPath + "\\"+ string(FindFileData.cFileName)

vt_result.push_back(str)//得到文件,保存到一个全局数组中

}

if(!FindNextFileA(hFinds,&FindFileData))

break

}

FindClose(hFinds)

}

你可能会注意到 FindFirstFileA WIN32_FIND_DATAA 这些,后面都多了一个A,你把放到你的代码中,如果编译说没有或者出错,你就把这些后面的A给去掉就行了


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/11499407.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-16
下一篇 2023-05-16

发表评论

登录后才能评论

评论列表(0条)

保存