java hdfs文件_使用java进行Hadoop文件上传下载和遍历

本文介绍了如何使用Java连接HDFS并进行文件操作,包括连接HDFS、创建文件夹、文件上传(两种方式)、文件下载(两种方式)、修改文件名以及遍历所有文件和文件夹。所需的jar包包括Hadoop的相关版本库。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用java操作HDFS

需要使用到的jar包

将hadoop的tar.gz包解压,里面的lib下的所有jar包,share/hadoop目录下的common和hdfs文件下的所有jar包

以及Hadoop-common-2.7.7、Hadoop-hdfs-2.7.7、hadoop-client-2.7.7这三个jar包。

常用的操作

1.连接至hdfs

@Test

public void connectHDFS() {

Configuration conf = new Configuration();

conf.set("fs.defaultFS","hdfs://192.168.5.22:9000");

try {

FileSystem fileSystem = FileSystem.get(conf);

FileStatus fileStatus = fileSystem.getFileLinkStatus(new Path("/user"));

System.out.println(fileStatus.isDirectory());

} catch (IOException e) {

// TODO 自动生成的 catch 块

e.printStackTrace();

}

}

2.创建文件夹

@Test

public void mkdir() {

Configuration conf = new Configuration();

conf.set("fs.defaultFS","hdfs://192.168.5.22:9000");

try {

FileSystem fileSystem = FileSystem.get(conf);

boolean mkdirs = fileSystem.mkdirs(new Path("/user/test")); //要创建的文件夹或多级文件夹

System.out.println(mkdirs?"成功":"失败");

} catch (IOException e) {

// TODO 自动生成的 catch 块

e.printStackTrace();

}

}

3.文件的上传

①API直接上传

@Test

public void upload1() {

Configuration conf = new Configuration();

conf.set("fs.defaultFS","hdfs://192.168.5.22:9000");//连接hdfs

try {

FileSystem fileSystem = FileSystem.get(conf);

FileInputStream in = new FileInputStream(new File("H:\\test.txt"));//获取本地文件

FSDataOutputStream out = fileSystem.create(new Path("/upload1.txt")); //选择上传路径

byte[] b = new byte[1024];

int len = 0;

while((len=in.read(b))!=-1){

out.write(b,0,len);

}

in.close();

out.close();

} catch (IOException e) {

// TODO 自动生成的 catch 块

e.printStackTrace();

}

②通过Hadoop的IOUtils上传

@Test

public void upload2(){

Configuration conf = new Configuration();

try {

FileSystem fileSystem = FileSystem.get(new URI("hdfs://192.168.5.22:9000"), conf);

FileInputStream in = new FileInputStream(new File("H:\\test.txt"));//获取本地文件

FSDataOutputStream out = fileSystem.create(new Path("/upload2.txt")); //选择上传路径

IOUtils.copyBytes(in,out,conf);

in.close();

out.close();

} catch (IOException e) {

e.printStackTrace();

} catch (URISyntaxException e) {

e.printStackTrace();

}

}

4.文件下载

①API直接下载

@Test

public void download1(){

//添加配置文件

Configuration conf = new Configuration();

try {

FileSystem fileSystem = FileSystem.get(new URI("hdfs://192.168.5.22:9000"), conf);

FSDataInputStream in = fileSystem.open(new Path("/upload.txt"));//获取服务器文件

FileOutputStream out = new FileOutputStream(new File("H:\\download1.txt"));//选择下载路径,下载文件名

byte[] b = new byte[1024];

int len = 0;

while((len=in.read(b))!=-1){

out.write(b,0,len);

}

in.close();

out.close();

} catch (IOException e) {

e.printStackTrace();

} catch (URISyntaxException e) {

e.printStackTrace();

}

}

②通过IOUtils下载

@Test

public void download1(){

//添加配置文件

Configuration conf = new Configuration();

try {

FileSystem fileSystem = FileSystem.get(new URI("hdfs://192.168.5.22:9000"), conf);

FSDataInputStream in = fileSystem.open(new Path("/upload.txt"));//获取服务器文件

FileOutputStream out = new FileOutputStream(new File("H:\\download2.txt"));//选择下载路径,下载文件名

IOUtils.copyBytes(in,out,conf);

in.close();

out.close();

} catch (IOException e) {

e.printStackTrace();

} catch (URISyntaxException e) {

e.printStackTrace();

}

}

5.修改文件名

@Test

public void rename(){

Configuration conf = new Configuration();

try {

FileSystem fileSystem = FileSystem.get(new URI("hdfs://192.168.5.22:9000"),conf);

boolean rename = fileSystem.rename(new Path("/upload1.txt"), new Path("/upload3.txt"));

System.out.println(rename?"修改成功":"修改失败");

} catch (IOException e) {

e.printStackTrace();

} catch (URISyntaxException e) {

e.printStackTrace();

}

}

6.遍历所有文件、文件夹

@Test

public void lsr() {

Configuration conf = new Configuration();

conf.set("fs.defaultFS","hdfs://192.168.5.22:9000");

try {

FileSystem fileSystem = FileSystem.get(conf);

FileStatus[] listStatus = fileSystem.listStatus(new Path("/"));//获取文件列表

for (FileStatus fileStatus : listStatus) {

isDir(fileStatus, fileSystem);//遍历文件列表,判断是文件还是文件夹

}

} catch (IOException e) {

// TODO 自动生成的 catch 块

e.printStackTrace();

}

}

public void isDir(FileStatus fileStatus,FileSystem fileSystem) {

//如果是文件夹,则获取该文件夹下的文件列表,遍历判断 递归调用

if(fileStatus.isDirectory()) {

String dirname = fileStatus.getPath().getName();

System.out.println("Directory:"+dirname);

FileStatus[] listStatus;

try {

listStatus = fileSystem.listStatus(new Path("/"+dirname));

for (FileStatus fileStatus2 : listStatus) {

isDir(fileStatus2,fileSystem);

}

} catch (Exception e) {

// TODO 自动生成的 catch 块

e.printStackTrace();

}

}else {

String dirname = fileStatus.getPath().getName();

System.out.println("File:"+dirname);

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值