java 遍历hdfs文件夹报错!!急!!急

FileStatus[] srcFileStatus = hdfs.listStatus(new Path(srcPath));执行到这句话的时候会报如下错:

java.lang.NullPointerException
at org.apache.hadoop.fs.Path.(Path.java:104)
at org.apache.hadoop.fs.Path.makeQualified(Path.java:440)
at org.apache.hadoop.hdfs.protocol.HdfsFileStatus.makeQualified(HdfsFileStatus.java:263)
at org.apache.hadoop.hdfs.DistributedFileSystem.listStatusInternal(DistributedFileSystem.java:802)
at org.apache.hadoop.hdfs.DistributedFileSystem.access$700(DistributedFileSystem.java:106)
at org.apache.hadoop.hdfs.DistributedFileSystem$18.doCall(DistributedFileSystem.java:853)
at org.apache.hadoop.hdfs.DistributedFileSystem$18.doCall(DistributedFileSystem.java:849)
at org.apache.hadoop.fs.FileSystemLinkResolver.resolve(FileSystemLinkResolver.java:81)
at org.apache.hadoop.hdfs.DistributedFileSystem.listStatus(DistributedFileSystem.java:849)
at test.HdfsOperate.downloadFile(HdfsOperate.java:142)
at test.HdfsTest.main(HdfsTest.java:45)

代码:

public void downloadFile(String dstPath, String srcPath) throws Exception
{
Path path = new Path(srcPath);

    Configuration conf = new Configuration();   
    FileSystem hdfs = path.getFileSystem(conf);
    //hdfs = FileSystem.get(URI.create(srcPath), conf);
    File rootfile = new File(dstPath);
    if(!rootfile.exists()) rootfile.mkdirs();
    hdfs.getFileStatus(path);
    if (hdfs.isFile(path))
    {
        FSDataInputStream in = null;
        FileOutputStream out = null;
        try
        {   
            in = hdfs.open(path);

            File srcfile = new File(rootfile ,path.getName());
            if(!srcfile.exists())srcfile.createNewFile();
            out = new FileOutputStream(srcfile);
            IOUtils.copyBytes(in, out, 4096, false);
        }
        finally
        {
            IOUtils.closeStream(in);
            IOUtils.closeStream(out);
        }
    }
    else
    {
        File dstDir = new File(dstPath);
        if (!dstDir.exists())
        {
            dstDir.mkdirs();
        }


        FileStatus[] srcFileStatus = hdfs.listStatus(path);
        Path[] srcFilePath = FileUtil.stat2Paths(srcFileStatus);
        for (int i = 0; i < srcFilePath.length; i++)
        {
            String srcFile = srcFilePath[i].toString();
            int fileNamePosi = srcFile.lastIndexOf("/");
            String fileName = srcFile.substring(fileNamePosi + 1);
            //String fileName = srcFilePath[i].getName();
            downloadFile(dstPath  + fileName, srcPath  + fileName +"/");
        }
    }
}

3个回答

就给这行代码,也是6。。。。

lihe55966
lihe55966 好吧,我错了,已贴上方法全部代码,麻烦看一下
大约 4 年之前 回复

就给这行代码,也是6。。。。

srcPath为空了吧

lihe55966
lihe55966 回复u011376884: 主要是没地方为空啊
大约 4 年之前 回复
u011376884
逝_去_的_光_阴 回复lihe55966: Path.java:104 看看这一行什么地方可能为空,自己找下原因吧
大约 4 年之前 回复
u011376884
逝_去_的_光_阴 回复lihe55966: Path.java:104 这一行代码是什么?
大约 4 年之前 回复
lihe55966
lihe55966 回复u011376884: 不是空的,我把代码贴上了,目的是根据这个hdfs路径无差别下载文件或者文件夹
大约 4 年之前 回复
lihe55966
lihe55966 回复u011376884: 嗯嗯 谢谢 我先试试
大约 4 年之前 回复
u011376884
逝_去_的_光_阴 回复lihe55966: FileStatus[] srcFileStatus = hdfs.listStatus(new Path(srcPath)); 如果是这句报空指针错误,那只有3个地方:hdfs、new Path(srcPath)、srcPath,自己打印一下哪个是空吧
大约 4 年之前 回复
lihe55966
lihe55966 没有啊,我拿着这个地址在linux上用hdfs命令查看 是有内容的
大约 4 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问