hadoop java api下载文件_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就玩命的报错。。。

```

908bb83b68a3

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

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

经过了大百度的求救。有高人指出,传参数时加上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函数都跑到了这个函数:

908bb83b68a3

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

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

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值