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.

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

推荐阅读更多精彩内容