/**
* 解析文件权限信息
* @param fs
* @return
*/
public static String getFilePermissionInfo(FileStatus fs) {
String fileType = "-";
if(fs.isDirectory()) {
fileType = "d";
} else if (fs.isSymlink()) {
fileType = "l";
}
return fileType + fs.getPermission().toString();
}
3.3 管理目录文件
创建目录、重命名目录以及重命名文件的代码都比较简单明了,这里不再赘述,下面只贴出来几张效果图供朋友们参考。当删除目录时,需要先删除目录中的文件,然后才能删除目录,也就是说,HDFS是不允许直接删除非空目录的。
3.4 移动目录文件
移动目录文件其实是重命名目录文件的变相操作,是在保持目录文件名称不变的同时改变下目录文件路径而已。当移动一个目录时,会同时移动此目录下的所有子目录和文件。譬如移动某个文件,示例代码如下:
Path srcPath = new Path("/user/hdfs/2015/10/10.dat");
Path dstPath = new Path("/user/hdfs/2014/08/10.dat");
HadoopConfigUtil.getFileSystem().rename(srcPath, dstPath);
移动目录文件有两种操作方式,一是先打开目录导航树,选择目标目录,然后移动,如下图所示;二是直接在目录文件列表区域拖动要移动的目录文件到左侧目录导航树上,完成移动。
3.5 上传目录文件
上传目录文件,是指在本地文件系统中选择目录文件,将其上传到HDFS系统中。如果上传的是文件,则直接将其上传到HDFS指定目录中即可;如果上传的是目录,则需要根据本地目录结构在HDFS系统中构建对应的目录结构,然后将文件上传到对应的目录中。
HDFS文件系统中存储的一般都是大文件数据,因此在上传或者下载的时候必须有进度提醒。
下面,笔者将采用截图、代码的形式讲解下目录文件上传的大致流程。
第一,选择本地文件系统中要上传的目录文件,可一次上传多个目录文件。
JFileChooser chooser = new JFileChooser();
chooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
chooser.setMultiSelectionEnabled(true);
chooser.showDialog(this, "选择目录或文件");
if(chooser.getSelectedFiles().length == 0) return;
File[] files = chooser.getSelectedFiles();
第二,解析已选择的本地文件,将它们罗列在JTable列表中,以方便上传监控。
第三,根据已选择的本地目录,在HDFS系统中构建对应的目录结构。
第四,循环读取JTable文件列表,逐个上传文件,并实时更新上传进度。关键代码如下所示:
new Thread(new Runnable() {
@Override
public void run() {
int rowCount = tableModel.getRowCount();
for(int i=0;i<rowCount;i++) {
final int rowIndex = i;
String localFilePath = tableModel.getValueAt(rowIndex, 1).toString();
String hdfsFilePath = pathMappingList.get(localFilePath);
InputStream in = null;
OutputStream out = null;
try {
File localFile = new File(localFilePath);
final int fileSize = (int)localFile.length();
final int[] uploadSize = new int[1];
final DecimalFormat df = new DecimalFormat("#");
in = new BufferedInputStream(new FileInputStream(localFilePath));
out = HadoopConfigUtil.getFileSystem().create(new Path(hdfsFilePath),new Progressable() {
public void progress() {
uploadSize[0] += 1024*64;
double dblPercent = (uploadSize[0] * 1.0 / fileSize) * 100;
String strPercent = df.format(dblPercent);
tableModel.setValueAt(strPercent + "%", rowIndex, 4);
}
});
IOUtils.copyBytes(in, out, 1024*64, true);
tableModel.setValueAt("已上传", rowIndex, 4);
} 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.6 下载目录文件