项目介绍:使用hadoop实现云盘的增删读获取列表功能,hadoop不支持数据修改,特性是一次写入多次读取。主流的网盘也不支持该功能。今天我们用hdfs的FileSystem实现这些操作。
1、上传功能
指定文件的本地路径和hdfs存储路径,通过hadoop提供的IOUtils工具类将流写入到hdfs中。
2、下载功能
指定要访问的hdfs中的文件路径,使用FileSystem的open函数获取Hadoop的输入流,使用Hadoop提供的IOUtils工具类将输入流写入到本地磁盘或者控制太。
3、删除功能
指定要访问的hdfs中的文件路径,使用FileSystem的delete函数删除文件或文件夹,返回一个boolean值,判断是否删除成功。
4、查看文件列表功能
指定要访问的hdfs中的路径,使用FileSystem的listStatus函数获取列表状态数组,遍历显示列表内容。
package hdfs;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;public class FileSystemAceess {
/**
* @param args
* @throws Exception
* @throws URISyntaxException
*/
public static void main(String[] args) throws URISyntaxException, Exception {
// 传入URI访问地址获取FileSystem对象
FileSystem fs = getFileSystem(new URI(args[0]));//上传函数
uploadFile(args, fs);
//下载函数
ReadFile(args, fs);
//删除函数
delete(args, fs);
//获取列表函数
listStatus(args, fs);
}private static void listStatus(String[] args, FileSystem fs)
throws IOException {
// 获取列表信息
String pth = args[2].substring(0, 1);
FileStatus[] listStatus = fs.listStatus(new Path(pth));
System.out.println("类型 权限 副本数 块大小 文件大小 文件路径");
// 遍历列表信息
for (FileStatus fileStatus : listStatus) {
String fileDir = fileStatus.isDir() ? "文件夹" : "文件";
String permission = fileStatus.getPermission().toString();
short replication = fileStatus.getReplication();
long len = fileStatus.getLen();
long blockSize = fileStatus.getBlockSize();
String path = fileStatus.getPath().toString();
System.out.println(fileDir + " " + permission + " " + replication
+ " " + (blockSize/1024==0?"文件夹":blockSize/1024/1024+"Mb" )+ " "+(len/1024==0?"文件夹":len+"Byte")+" "+path);}
}/**
* FileSystem.delete 删除文件或文件夹
*
* @param args
* 外部传入的参数
* @param fs
* FileSystem文件系统
* @throws IOException
*/
private static void delete(String[] args, FileSystem fs) throws IOException {
//上传前判断是否存在,如果存在删除
if(fs.exists(new Path(args[2]))){
boolean result = fs.delete(new Path(args[2]), true);
if(result){
System.out.println("删除成功!!");
}else{
System.out.println("删除失败!");
}
}
/**
* 第一个参数,删除文件的路径,例如,/a.txt 第二个参数,删除后自动关闭流
*/
boolean result = fs.delete(new Path(args[2]), true);
if (result) {
System.out.println("删除成功!!!");
} else {System.out.println("删除失败!!!");
}
}/**
* FileSystem.open 读取、下载
*
* @param args
* 外部传入的参数
* @param fs
* FileSystem对象
* @throws IOException
*/
private static void ReadFile(String[] args, FileSystem fs)
throws IOException {
// 获取hdfs文件系统的输入流
FSDataInputStream in = fs.open(new Path(args[2]));
// 通过hadoop提供的ioutils工具包在控制台输出内容
IOUtils.copyBytes(in, System.out, 1024, true);
}/**
* FileSystem.create 上传文件
*
* @param args
* @param fs
* FileSystem对象
* @throws Exception
*
*/
@SuppressWarnings("unused")
private static void uploadFile(String[] args, FileSystem fs)
throws Exception {
// 创建文件输入流,指定要上传的文件地址
FileInputStream in = new FileInputStream(args[1]);
// 使用create方法上传,设置上传的路径和文件名
FSDataOutputStream out = fs.create(new Path(args[2]));
// 使用hadoop提供的IOUtils上传
/**
* 第一个参数,输入流也就是指定需要上传的文件路径 第二个参数,输出流是hadoop的存储位置 第三个参数,缓冲区大小 第四个参数,是否上传
*/
IOUtils.copyBytes(in, out, 1024, true);
}// 获取FileSystem对象
static FileSystem getFileSystem(URI uri) throws Exception {
return FileSystem.get(uri, new Configuration());
}}
hadoop插件设置
以上参数根据实际情况设置!
效果图:
读取文件
获取列表信息