HDFS客户端操作(JAVA代码)
环境准备
windows需要配置hadoop的windows下的依赖
安装包地址:
链接:https://pan.baidu.com/s/1QtbH-x-S0QytkmaoSosdEw
提取码:2ktw
将安装包解压至自己所选择的目录,然后配置环境变量:
HADOOP_HOME : 解压的目录
PATH后新增:%HADOOP_HOME%\bin
maven所需依赖
新建Maven项目,添加以下依赖:
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>2.12.0</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>3.1.3</version>
</dependency>
实际操作
实际操作前先讲所需要的对象设为全局变量,方便今后操作:
private URI uri;
private Configuration configuration;
private String user;
private FileSystem fileSystem;
使用@Before注释的函数,可以在@Test注释下的函数运行前执行,可以进行对象的初始化:
@Before
public void init() throws IOException, InterruptedException {
uri = URI.create("hdfs://hadoop100:8020");
configuration = new Configuration();
user = "nevesettle";
fileSystem = FileSystem.get(uri,configuration,user);
}
@After则相反
@After
public void closeFs() throws IOException {
fileSystem.close();
}
文件上传
/**
* 上传文件
* @throws IOException
*/
@Test
public void uploadFile() throws IOException {
fileSystem.copyFromLocalFile(false,false,
new Path("D:\\Program files\\QQ\\QQ Data\\794133319\\FileRecv\\资源集合.txt"),
new Path("/"));
}
使用的函数为:
copyFromLocalFile(boolean delSrc, boolean overwrite,Path src, Path dst)
- delSrc:是否删除源文件
- overwrite:目标地址有相同文件是否覆盖
- src:源文件地址
- dst:目标文件地址
文件下载
/**
* 文件下载
* @throws IOException
* @throws InterruptedException
*/
@Test
public void downFile() throws IOException {
fileSystem.copyToLocalFile(false,
new Path("/资源集合.txt"),
new Path("d:\\"),
true);
}
使用的函数为:
copyToLocalFile(boolean delSrc, Path src, Path dst,boolean useRawLocalFileSystem)
- delSrc:是否删除源文件
- src:源文件地址
- dst:目标文件地址
- useRawLocalFileSystem:是否进行文件传输校验(CRC校验)
文件更名及移动位置
/**
* 文件名字修改
* @throws IOException
* @throws InterruptedException
*/
@Test
public void updateFile() throws IOException {
fileSystem.rename(new Path("/资源集合.txt"),
new Path("/资源.txt"));
}
使用的函数为:
rename(Path src, Path dst)
- src:源文件
- dst:目标文件
- 前后目录相同,文件名不同,则是修改文件名
- 前后目录不同,文件名相同,则是修改目录
- 前后目录和文件名都不同,则是移动位置并修改文件名
文件删除
/**
* 文件删除
* @throws IOException
* @throws InterruptedException
*/
@Test
public void deleteFile() throws IOException {
fileSystem.delete(new Path("/资源.txt"),false);
}
使用的函数为:
delete(Path f, boolean recursive)
- f:删除的文件或目录地址
- recursive:是否递归删除
- 当要删除的为文件是,递归删除为false
- 当要删除的是目录且为空时,递归删除为false
- 当要删除的是目录且不为空,则递归删除为true
IO流的文件上传
/**
* IO流的文件上传
* @throws IOException
* @throws InterruptedException
*/
@Test
public void uploadFileByIO() throws IOException {
//源文件地址
String srcFilePath = "D:\\资源集合.txt";
//目标文件地址
String destFilePath = "/资源集合.txt";
//输入流
FileInputStream fis = new FileInputStream(new File(srcFilePath));
//通过hdfs封装的方法获取输出流
FSDataOutputStream fos = fileSystem.create(new Path(destFilePath));
//最原始的方法
// int i = 0;
// while ( ( i = fis.read()) != -1 ){
// fot.write(i);
// }
//hdfs封装的方法
IOUtils.copyBytes(fis,fos,configuration);
//关闭IO流
IOUtils.closeStream(fis);
IOUtils.closeStream(fos);
}
- IOUtils 使用时注意要使用hadoop的包,不要使用错了
- configuration 为我们的全局变量,即配置
IO流的文件下载
/**
* IO流的文件下载
* @throws IOException
* @throws InterruptedException
*/
@Test
public void downFileByIO() throws IOException {
//源文件
String srcFilePath = "/资源集合.txt";
//目标文件
String destFilePath = "d:\\资源.txt";
//获得输入流
FSDataInputStream fis = fileSystem.open(new Path(srcFilePath));
//获得输出流
FileOutputStream fos = new FileOutputStream(new File(destFilePath));
//传输
IOUtils.copyBytes(fis,fos,configuration);
//关闭
IOUtils.closeStream(fis);
IOUtils.closeStream(fos);
}