在测试类中方法前面增加@Test、@Before、@After,当在测试某个方法时代码会先执行@Before的方法,在执行@Test的方法,最后还会执行@After的方法。这样就可以减少代码的复写。
package com.atguigu.hdfs;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;
import org.apache.hadoop.io.IOUtils;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.io.*;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.Arrays;
/**
* @author layne
* @create 2020-07-18 10:12
* 客户端代码常用套路
* 1.获取客户端对象
* 2.用客户端对象做各种操作
* 3.关闭客户端对象
* 最经典的案例: hdfs zookeeper
*/
public class HdfsCllient {
private URI uri;
private Configuration conf;
private String user;
private FileSystem fs;
@Before //在执行test方法之前会先执行一次before方法
public void init() throws URISyntaxException, IOException, InterruptedException {
uri = new URI("hdfs://hadoop102:9820");
conf = new Configuration();
user = "atguigu";
conf.set("dfs.replication", "2");
//获取客户端对象
//参数解读 1.nn地址 2.配置文件 3.操作hdfs的用户
fs = FileSystem.get(uri, conf, user);
//用客户端对象进行具体操作
}
@After //执行完test方法之后,会执行一次after方法
public void close() throws IOException {
//关闭客户端对象
fs.close();
}
@Test
public void hdfscliet() throws URISyntaxException, IOException, InterruptedException {
boolean b = fs.mkdirs(new Path("/java2"));
if (b) {
System.out.println("成功");
} else {
System.out.println("失败");
}
}
/**
* 文件上传
* <p>
* hadoop参数设置方式:1.xxx-default.xml 2.服务器hadoop安装目录下conf/etc/hadoopxxx-site.xml
* 3.客户端代码类路径下 xxx-site.xml 4.在代码里面通过conf.set来设置
* 优先级:1 < 2 < 3 < 4
*/
@Test
public void put() throws IOException {
//参数解读 1.是都删除源文件(本地文件) 2.是否覆盖目标文件(hdfs文件) 3 源文件路径 4 目标路径
//fs.copyFromLocalFile(true,true,new Path("D:\\input\\wc.txt"),new Path("/java"));
//fs.copyFromLocalFile(false,true,new Path("D:\\input\\word.txt"),new Path("/java"));
fs.copyFromLocalFile(false, true, new Path("D:\\input\\hello.txt"), new Path("/java"));
}
/**
* 文件下载
*/
@Test
public void get() throws IOException {
//参数解读 1 是否删除源文件 (hdfs文件) 2 源文件路径(hdfs上要下载的文件) 3 目标路径 4 是否开启crc校验 true不开启 false 开启
fs.copyToLocalFile(true, new Path("/java/wc.txt"), new Path("d:/input"), true);
}
/**
* 文件和目录的删除
*/
@Test
public void rm() throws IOException {
//参数解读 1 要删除的路径 2 是否递归
//删除文件
//fs.delete(new Path("/java/hello.txt"),false);
//删除空目录
//fs.delete(new Path("/java2"),false);
//删除非空目录
fs.delete(new Path("/tmp"), true);
}
/**
* 文件(文件和目录)移动和更名
*/
@Test
public void mv() throws IOException {
//文件的更名
//fs.rename(new Path("/java/word.txt"),new Path("/java/word2.txt"));
//文件的移动
//fs.rename(new Path("/java/word2.txt"),new Path("/word.txt"));
//目录的更名
//fs.rename(new Path("/java"),new Path("/java2"));
//目录的移动
fs.rename(new Path("/input"), new Path("/java2/input"));
}
/**
* 文件详情查看
*/
@Test
public void ls() throws IOException {
RemoteIterator<LocatedFileStatus> remoteIterator = fs.listFiles(new Path("/"), true);
while (remoteIterator.hasNext()) {
LocatedFileStatus fileStatus = remoteIterator.next();
System.out.println("===========" + fileStatus.getPath() + "===========");
System.out.println(fileStatus.getPermission());
System.out.println(fileStatus.getOwner());
System.out.println(fileStatus.getGroup());
System.out.println(fileStatus.getLen());
System.out.println(fileStatus.getModificationTime());
System.out.println(fileStatus.getReplication());
System.out.println(fileStatus.getBlockSize());
System.out.println(fileStatus.getPath().getName());
BlockLocation[] blockLocations = fileStatus.getBlockLocations();
System.out.println(Arrays.toString(blockLocations));
}
}
/**
* 文件或者目录判断
*/
@Test
public void isFileOrDir() throws IOException {
FileStatus[] fileStatuses = fs.listStatus(new Path("/"));
for (FileStatus fileStatus : fileStatuses) {
boolean file = fileStatus.isFile();
if (file) {
System.out.println("文件: " + fileStatus.getPath());
}else{
System.out.println("目录: " + fileStatus.getPath());
}
}
}
//利用递归自己实现查看一个路径下所有的文件和目录
public void isAll(String path,FileSystem fileSystem) throws IOException {
FileStatus[] fileStatuses = fileSystem.listStatus(new Path(path));
for (FileStatus fileStatus : fileStatuses) {
boolean file = fileStatus.isFile();
if (file) {
//如果你当前路径下是文件 直接打印
System.out.println("文件: " + fileStatus.getPath());
}else{
//如果你当前路径下是目录.先打印一下目录,然后进去再次判断,因为不知道子目录下还有没有子目录,所有递归调自己
System.out.println("目录: " + fileStatus.getPath());
isAll(fileStatus.getPath().toString(),fileSystem);
}
}
}
@Test
public void testALL() throws IOException {
isAll("/",fs);
}
/**
* 基于IO流的上传
*/
@Test
public void putByIO() throws IOException {
//1 获取本地文件输入流
FileInputStream fis = new FileInputStream(new File("d:/input/wc.txt"));
//2 获取hdfs文件输出流
FSDataOutputStream hdfsfos = fs.create(new Path("/java2/wc.txt"));
//3 流的对拷
IOUtils.copyBytes(fis,hdfsfos,conf);
//4 流的关闭
IOUtils.closeStream(hdfsfos);
IOUtils.closeStream(fis);
}
/**
* 基于IO流的下载
*/
@Test
public void getByIO() throws IOException {
//1 获取hdfs文件输入流
FSDataInputStream hdfsfis = fs.open(new Path("/java2/wc.txt"));
//2 获取本地文件输出流
FileOutputStream fos = new FileOutputStream(new File("d:/input/wc2.txt"));
//3 流的对拷
IOUtils.copyBytes(hdfsfis,fos,conf);
//4 流的关闭
IOUtils.closeStream(fos);
IOUtils.closeStream(hdfsfis);
}
}