源码如下:
package com.sfd.hdfs;
import java.io.FileInputStream;
import java.io.IOException;
import org.apache.commons.compress.utils.IOUtils;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.LocatedFileStatus;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.fs.RemoteIterator;
import org.junit.BeforeClass;
import org.junit.Test;
public class HdfsUtils {
private static FileSystem fs;
/**
* 每次测试前都将进入此方法对fs进行初始化
* @throws Exception
*/
@BeforeClass
public static void init()throws Exception{
Configuration conf=new Configuration();
/**
设置配置文件(hdfs-site.xml,core-site.xml文件)的信息,
也可以将工作目录下的core-site.xml,hdfs-site.xml文件
添加到src目录下,如果不填加程序运行时会报错,
因为程序的默认的文件管理系统是本地的文件管理系统而不是
hdfs。
下面的设置相当于告诉程序,我们的配置是作用在hdfs(分布式文件系统)上的,
这个设置将会覆盖scr目录下hdfs-site.xml中的相应属性的配置
通过这个配置生成的fs实际上继承了抽象类FileSystem的DistributedFileSystem子类。
*/
conf.set("fs.defaultFS", "hdfs://localhost:9000");
fs = FileSystem.get(conf);
}
/**
* 上传文件到hdfs上(没有被封装)
* @throws Exception
*/
@Test
public void upload() throws Exception{
Path path=new Path("hdfs://localhost:9000/sfd/sfd3.txt");
FSDataOutputStream os=fs.create(path);
FileInputStream in=new FileInputStream("/home/sfd/soft/download/sfd1.txt");
IOUtils.copy(in, os);
}
/**
* 使用框架实现本地文件的上传
* @throws Exception
*/
@Test
public void upload2() throws Exception{
fs.copyFromLocalFile(new Path("/home/sfd/soft/download/sfd1.txt"), new Path("hdfs://localhost:9000/aa/bb/sfd3.txt"));
}
/**
* 使用框架下载hdfs中的文件到本地
* @throws Exception
*/
@Test
public void download()throws Exception{
fs.copyToLocalFile(new Path("hdfs://localhost:9000/aa/bb/sfd3.txt"), new Path("/home/sfd/soft/download/sfd4.txt"));
}
/**
* 查询文件目录中的所有文件(包括子文件夹下的文件,不包括文件夹)
* @throws Exception
*/
@Test
public void listFile()throws Exception{
RemoteIterator< LocatedFileStatus> files=fs.listFiles(new Path("/"), false);
while (files.hasNext()){
LocatedFileStatus file=files.next();
Path path=file.getPath();
String filename=path.getName();
System.out.println(filename);
}
}
/**
* 查询指定目录下的文件和文件夹
* @throws Exception
*/
@Test
public void listFindAndDir()throws Exception{
FileStatus[] listStatus = fs.listStatus(new Path("/"));
for (FileStatus fileStatus:listStatus){
Path path = fileStatus.getPath();
String name = path.getName();
System.out.println(name);
}
}
/**
* 在hdfs中创建文件夹
* @throws Exception
*/
@Test
public void makedir()throws Exception{
fs.mkdirs(new Path("/aa/bb/cc"));
}
/**
* 使用框架删除文件或非空文件夹
* @throws Exception
*/
@Test
public void remove()throws Exception{
fs.delete(new Path("/aa/bb"), true);
}
/**
* 使用框架实现文件的重命名和移动
* @throws Exception
*/
@Test
public void reName()throws Exception{
fs.rename(new Path("/sfd/sfd1.txt"),new Path("/sfd/sfd4.txt"));
}
}