hadoop学习遇到的错误4 JAVA操作HDFS下载文件

使用java API操作HDFS,老师说只要掌握了FileSystem这个类就OK(的确,翻了源码,这个类里面的内容还真不少)。

下面写上JAVA操作的代码:

```java

package HDFS;

import java.io.File;

import java.io.FileOutputStream;

import java.io.InputStream;

import java.net.URI;

import org.apache.hadoop.conf.Configuration;

import org.apache.hadoop.fs.FSDataInputStream;

import org.apache.hadoop.fs.FileStatus;

import org.apache.hadoop.fs.FileSystem;

import org.apache.hadoop.fs.Path;

import org.apache.hadoop.io.IOUtils;

(上面是引入一堆要用的包^_^)

public class HDFSTest {

public static void main(String[] args) throws Exception{

//读取默认的配置文件

Configuration conf = new Configuration();

//配置HDFS的URL,端口9000是默认端口,在配置文件core-site.xml中配置的

URI uri = new URI("hdfs://192.168.255.128:9000");

//调用get方法,生成fileSystem类的事例

FileSystem fileSystem = FileSystem.get(uri , conf);


//注意:下面开始各种方法~ 没写函数,有点懒^_^

//显示一下这个对象

//System.out.println(fileSystem);

/*打开文件

FSDataInputStream openStream = fileSystem.open(new Path("hdfs://192.168.255.128:9000/begin.sh"));

IOUtils.copyBytes(openStream, System.out, 1024, false);

IOUtils.closeStream(openStream);

*/

/*创建文件

fileSystem.create(new Path("hdfs://192.168.255.128:9000/abc"));

*/

/*列出目录结构

FileStatus[] listStatus = fileSystem.listStatus(new          Path("hdfs://192.168.255.128:9000/hbase"));

for (FileStatus fileStatus : listStatus) {

       String isDir = fileStatus.isDir()?"目录":"文件";

       String name = fileStatus.getPath().toString();

       System.out.println(isDir+"  "+name);

}

*/

/*创建目录

fileSystem.mkdirs(new Path("hdfs://192.168.255.128:9000/bxjs2"));

System.out.println("创建目录完成");

*/

/*删除目录

fileSystem.delete(new Path("hdfs://192.168.255.128:9000/bxjs"));

System.out.println("删除目录完成");

*/

//上传文件

//fileSystem.copyFromLocalFile(false, new Path("C:/Users/Administrator/Desktop/java.txt"),new Path("hdfs://192.168.255.128:9000/user/java.txt"));

//System.out.println("上传文件完成");

直到现在一切正常,but,看下面!!!

//下载文件

fileSystem.copyToLocalFile(new Path("hdfs://192.168.255.128:9000/user/java.txt"), new Path("C:/Users/Administrator/Desktop/java321.txt"));

System.out.println("下载文件成功");

执行这条,eclipse就玩命的报错。。。

```

经过了无数的检测拼写错误和可能的各种低级错误之后,发现:

我写的没啥错啊,但为啥报空指针呢?

经过了大百度的求救。有高人指出,传参数时加上2个值,一个false,一个true。

就变成了这样

fileSystem.copyToLocalFile(

false,

new Path("hdfs://192.168.255.128:9000/user/java.txt"), 

new Path("C:/Users/Administrator/Desktop/java321.txt",

true));

它居然就可以正常运行了!!!

于是,我不甘心啊,就去翻源代码

实时上,参数不同的copyToLocalFile函数都跑到了这个函数:


函数里第四个参数意思是:是否用原生的文件系统作文本地文件系统。

如果不传这个参数,默认居然是false.

困扰了好几天,终于把它干掉了。心情不错~~~^_^

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,915评论 18 139
  • 之前的有点忘记了,这里在云笔记拿出来再玩玩.看不懂的可以留言 大家可以尝试下Ambari来配置Hadoop的相关环...
    HT_Jonson阅读 3,018评论 0 50
  • package hdfs; import java.io.FileInputStream; import java...
    呆老板阅读 223评论 0 0
  • 简述 hadoop 集群一共有4种部署模式,详见《hadoop 生态圈介绍》。HA联邦模式解决了单纯HA模式的性能...
    mtide阅读 13,206评论 8 20
  • (一) 月上柳梢,流光半落。 玥衣阁,熙熙攘攘,京城繁华如此。 倚门的姑娘,顾盼流离,勾魂摄魄。 回眸一笑,怕也是...
    下有酥酥杭阅读 250评论 0 1