import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;
import org.apache.hadoop.io.IOUtils;
import org.junit.Before;
import org.junit.Test;
import java.io.*;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.Arrays;
public class HdfsClient {
FileSystem fs = null;
//每次运行test的时候 before先运行 初始化
@Before
public void init() throws URISyntaxException, IOException, InterruptedException, IOException, InterruptedException {
//创建出来 hdfs 配置
Configuration conf = new Configuration();
//指定本客户端上传文件到hdfs是需要保存的副本数是2
conf.set("dfs,replication", "2");
//指定本客户端上传文件到hdfs时切块的规格大小:64m
conf.set("dfs.blocksize", "64m");
//构造一个访问指定HDFS系统的客户端对:参数1:HDFS系统的URI 参数2:客户端要指定特别的参数
//参数3:客户端的身份(指用户名)
fs = FileSystem.get(new URI("hdfs://192.168.66.10:9000"), conf, "root");
}
/**
* 从HDFS下载文件到本地磁盘
*/
@Test
public void testGet() throws IOException {
boolean faile;
//第一个参数 HDFS文件路径 第二个参数 windows 路径
fs.copyToLocalFile(false,new Path("/a.info"), new Path("e:\\"),true);
fs.close();
}
/**
* 本地文件上传至hdfs
*/
@Test
public void copyFileToHDFS() throws IOException {
//windows 电脑下的路径文件
FileInputStream in = new FileInputStream(new File("e:\\ "));//读取本地文件
//指定上传到hdfs的文件路径及上传后的文件名
OutputStream out =fs.create(new Path("/test3"));
//开始拷贝 第一个参数是 输入文件 第二个是 hdfs目的地路径 第三个缓存区的大小 第4个 表示是否使用
IOUtils.copyBytes(in,out,4096,true);
System.out.println("拷贝完成.....");
fs.close();
}
/**
在hdfs内部移动文件/修改名称
*/
@Test
public void testRename() throws IOException {
//第一个 要修改的hdfs的文件名字 第二个是要修改后的名字
fs.rename(new Path("/a.info"),new Path("/test2"));
fs.close();
}
/**
* HDFS中创建文件夹
*/
@Test
public void testMkdir() throws IOException {
fs.mkdirs(new Path("/zhe/1/1.1"));
fs.close();
}
/**
* 在hdfs中删除文件或者文件夹
*/
@Test
public void testRm() throws IOException {
fs.delete(new Path("/zhe"),true);
fs.close();
}
/**
* 查询hdfs指定目录下的文件信息
*/
@Test
public void testLs() throws IOException {
RemoteIterator iter = fs.listFiles(new Path("/"),true);
while (iter.hasNext()){
LocatedFileStatus status = (LocatedFileStatus) iter.next();
System.out.println(“文件全路径:”+status.getPath());
System.out.println(“块大小:”+status.getBlockSize());
System.out.println(“文件长度”+status.getLen());
System.out.println(“副本数量”+status.getReplication());
System.out.println(“块信息”+ Arrays.toString(status.getBlockLocations()));
}
fs.close();
}
/**
* 查询hdfs指定目录下的文件和文件下信息
*/
@Test
public void testLs2() throws IOException {
FileStatus[] listStatus = fs.listStatus(new Path("/"));
for (FileStatus status:listStatus){
System.out.println(“文件全路径 :”+ status.getPath());
System.out.println(status.isDirectory()?“这是文件夹”:“这是文件”);
System.out.println("块大小: "+status.getBlockSize());
System.out.println("文本长度: "+status.getLen());
System.out.println(“副本数量: “+status.getReplication());
System.out.println(”---------------------------------------”);
}
fs.close();
}
}