使用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.
困扰了好几天,终于把它干掉了。心情不错~~~^_^