一、效果与主要工具
先展示实现效果如下:
其中使用vue的 tree控件
<el-tree :data="data" :props="defaultProps" @node-click="handleNodeClick"></el-tree>
JAVA中使用的 java.util.zip
二、实现代码
具体代码如下,主要为入口和递归方法组成 传入的是zip的file流
public static JSONArray getZipTreeChild(InputStream ins) throws Exception {
JSONArray result = new JSONArray();
ZipInputStream zin = new ZipInputStream(ins, Charset.forName("GBK"));
try {
ZipEntry ze = zin.getNextEntry();
if(ze == null) throw new RuntimeException("读取压缩包失败");
getZipTreeUtil(ze,zin,result,"");
}catch (Exception e){
throw new RuntimeException(e.toString());
}finally {
zin.close();
}
return result;
}
public static ZipEntry getZipTreeUtil(ZipEntry ze,ZipInputStream zin,JSONArray arr,String parentName)throws Exception{
while (ze != null) {
boolean isbrother = false;
ZipEntry beforeze = null;
JSONObject zipFile = new JSONObject();
if (ze.isDirectory()) {
if(!ze.getName().contains(parentName)){
//回退一格
return ze;
}
JSONArray child = new JSONArray();
String zeName = ze.getName();
String cutZeName = zeName.substring(0,zeName.lastIndexOf("/"));
zipFile.put("label",cutZeName.substring(cutZeName.lastIndexOf("/")+1));
zipFile.put("children",child);
arr.add(zipFile);
ze = zin.getNextEntry();
beforeze = getZipTreeUtil(ze,zin, child,zeName);
ze = beforeze;
} else {
if(!ze.getName().contains(parentName)){
//不属于此文件夹的文件退出一层文件夹
return ze;
}
beforeze = null;
zipFile.put("label", ze.getName().substring(ze.getName().lastIndexOf("/")+1)+"["+fileconver(ze.getSize()/1000)+"]");
arr.add(zipFile);
}
if(beforeze == null) ze = zin.getNextEntry();
}
return null;
}
/**
* 测试用例
*
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
try {
File file = new File("D:\\Project\\mycat\\1.20可运行.zip");
InputStream ins = new FileInputStream(file);
JSONArray aa = getZipTreeChild(ins);
System.out.println(aa.toString());
}catch (Exception e){
}
}
供有需求的朋友使用,也请指出可优化部分,总感觉写复杂了