HDFS分布式文件系统资源管理器开发总结(5)

下载目录文件,是指在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();

下载效果图如下所示:

HDFS分布式文件系统资源管理器开发总结

3.7 目录文件属性

此功能窗体用于查看目录文件的详细属性信息,对于目录,则会统计此目录所包含的子目录和文件数量,以及目录的总大小。效果图如下所示:

HDFS分布式文件系统资源管理器开发总结

3.8 配置目录文件权限

配置目录文件权限是一个高级别的功能,一般只开放给管理员用户,普通用户是禁用的。权限配置分两部分:文件权限和用户权限。

文件权限配置代码如下所示:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/cbc60029fbef37427c41aa2cd27bfc0e.html