例如,下面的代码演示了如何使用 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_resultvoid 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给去掉就行了
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)