下载目录文件,是指在HDFS文件系统中选择目录文件,将其下载到本地文件系统中。如果下载的是文件,则直接将其下载到本地指定目录中即可;如果下载的是目录,则需要根据HDFS系统目录结构在本地系统中构建对应的目录结构,然后将文件下载到对应的目录中。
下面,笔者将采用截图、代码的形式讲解下目录文件下载的大致流程。
第一,选择HDFS文件系统中要下载的目录文件,可一次下载多个目录文件。
第二,解析已选择的HDFS文件,将它们罗列在JTable列表中,以方便下载监控。
第三,根据已选择的HDFS目录,在本地文件系统中构建对应的目录结构。
第四,循环读取JTable文件列表,逐个下载文件,并实时更新下载进度。关键代码如下所示:
new Thread(new Runnable() {
@Override
public void run() {
int rowCount = tableModel.getRowCount();
for(int i=0;i<rowCount;i++) {
String hdfsFilePath = tableModel.getValueAt(i, 1).toString();
String localFilePath = pathMappingList.get(hdfsFilePath);
Path path = new Path(hdfsFilePath);
InputStream in = null;
OutputStream out = null;
try {
FileStatus fs = HadoopConfigUtil.getFileSystem().getFileStatus(path);
int fileSize = (int)fs.getLen();
in = HadoopConfigUtil.getFileSystem().open(path, 1024);
byte[] buffer = new byte[fileSize];
int offset = 0;
int numRead = 0;
double dblPercent = 0;
DecimalFormat df = new DecimalFormat("#");
while(offset < buffer.length && (numRead = in.read(buffer,offset,buffer.length - offset)) >= 0) {
offset += numRead;
dblPercent = (offset * 1.0 / fileSize) * 100;
String strPercent = df.format(dblPercent);
tableModel.setValueAt(strPercent + "%", i, 4);
}
if(offset != buffer.length) {
throw new IOException("不能完整地读取文件 " + hdfsFilePath);
}
tableModel.setValueAt("已下载", i, 4);
File localFile = new File(localFilePath);
if(localFile.getParentFile().exists() == false) {
localFile.getParentFile().mkdirs();
}
out = new FileOutputStream(localFile);
out.write(buffer);
out.flush();
} catch (Exception ex) {
ex.printStackTrace();
} finally {
if(in != null) {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(out != null) {
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
}).start();
下载效果图如下所示:
3.7 目录文件属性
此功能窗体用于查看目录文件的详细属性信息,对于目录,则会统计此目录所包含的子目录和文件数量,以及目录的总大小。效果图如下所示:
3.8 配置目录文件权限
配置目录文件权限是一个高级别的功能,一般只开放给管理员用户,普通用户是禁用的。权限配置分两部分:文件权限和用户权限。
文件权限配置代码如下所示: