最終效果圖

目錄樹實體類:
/**
* @Author: DaleyZou
* @Description: hdfs 目錄結構的實體類,用於展示目錄樹的支撐操作
* @Date: Created in 10:58 2018-9-27
* @Modified By:
*/
public class HdfsFolder {
private String id; // 目錄節點的id
private String name; // 目錄節點的名字
private List<HdfsFolder> children; // 此時這個目錄下的孩子節點
set get 方法
}
定義所有方法共享常量:
// hdfs路徑
private static String url = "hdfs://XXX:8020";
// 要讀取的目錄在hdfs下的相對路徑
private static String USERFILEPATH = "/user/XXX";
初始化FileSystem對象
/**
* 初始化FileSystem對象便於操作文件
*
* @return
*/
public static FileSystem getFileSystem() throws IOException, URISyntaxException {
//讀取配置文件
Configuration conf = new Configuration();
conf.set("fs.hdfs.impl",org.apache.hadoop.hdfs.DistributedFileSystem.class.getName());
//文件系統
FileSystem fs = null;
if (org.apache.commons.lang.StringUtils.isBlank(url)) {
//返回默認文件系統,如果在hadoop集群下運行,使用此種方法可直接獲取默認文件系統;
fs = FileSystem.get(conf);
} else {
//返回指定的文件系統,如果在本地測試,需要此種方法獲取文件系統;
URI uri = new URI(url.trim());
fs = FileSystem.get(uri, conf);
}
return fs;
}
根據路徑遞歸讀取 hdfs目錄
public static void listFolderByCondition(String folder, HdfsFolder hdfsFolder) throws Exception{
FileSystem fs = HdfsUtils.getFileSystem();
FileStatus[] filesStatus = fs.listStatus(new Path(folder));
List<HdfsFolder> children = new ArrayList<>();
for (FileStatus file : filesStatus) {
if (file.isFile()){
HdfsFolder temp = new HdfsFolder();
temp.setId(folder + "/" + file.getPath().getName());
temp.setName(file.getPath().getName());
children.add(temp);
}
if (file.isDirectory()){
HdfsFolder temp = new HdfsFolder();
temp.setId(folder + "/" + file.getPath().getName());
temp.setName(file.getPath().getName());
listFolderByCondition(folder + "/" + file.getPath().getName(), temp);
children.add(temp);
}
}
hdfsFolder.setChildren(children);
}
/**
* @Description: 根據路徑遞歸讀取 hdfs目錄
* @date: 17:15 2018-9-27
* @param: folder 需要讀取目錄的hdfs路徑
* @return: hdfs目錄信息
*/
public static HdfsFolder listFolder(String folder)
throws Exception {
FileSystem fs = HdfsUtils.getFileSystem();
FileStatus[] filesStatus = fs.listStatus(new Path(folder));
HdfsFolder hdfsFolder = new HdfsFolder(); // 目錄結果
hdfsFolder.setId(folder);
hdfsFolder.setName("根目錄");
List<HdfsFolder> children = new ArrayList<>();
for (FileStatus file : filesStatus) {
if (file.isFile()){
HdfsFolder temp = new HdfsFolder();
temp.setId(folder + "/" + file.getPath().getName());
temp.setName(file.getPath().getName());
children.add(temp);
}
if (file.isDirectory()){
HdfsFolder temp = new HdfsFolder();
temp.setId(folder + "/" + file.getPath().getName());
temp.setName(file.getPath().getName());
listFolderByCondition(folder + "/" + file.getPath().getName(), temp);
children.add(temp);
}
}
hdfsFolder.setChildren(children);
return hdfsFolder;
}
根據文件全路徑讀取文件的內容
/**
* @Description: 根據文件全路徑讀取文件的內容
* @date: 10:36 2018-9-28
* @param: fileName 文件全路徑
* @return: 文件內容
*/
public static String checkFile(String fileName)
throws Exception {
FileSystem fs = getFileSystem();
FSDataInputStream inStream = fs.open(new Path(fileName));
BufferedReader br = new BufferedReader(new InputStreamReader(inStream, "UTf-8"));
StringBuffer buffer = new StringBuffer();
try {
String line;
line = br.readLine();
while (line != null) {
buffer.append(line).append("<br>");
line = br.readLine();
}
} finally {
br.close();
inStream.close();
}
return buffer.toString();
}