做网站的的需求文档,网站信息维护方案,网站建设傲,网页搜索关键词背景了解#xff1a;java中存在IO流的方式#xff0c;支持我们对文件进行读取#xff08;Input#xff0c;从磁盘到内存#xff09;或写入#xff08;output#xff0c;从内存到磁盘#xff09;#xff0c;那么我们在面对 “zip”格式或者 “rar” 格式的压缩文件java中存在IO流的方式支持我们对文件进行读取Input从磁盘到内存或写入output从内存到磁盘那么我们在面对 “zip”格式或者 “rar” 格式的压缩文件又如何去解析使用。下面一起学习交流
所用知识点1.java的util包下的ZipInputStream : 读取zip文件流 第三方类库 commons-io-2.16.1.jar junrar-7.5.5.jar slf4j-api-2.0.13.jar
百度网盘第三方类库下载地址链接https://pan.baidu.com/s/1iKPh6HruC70nb8rPn99pRQ?pwd1111 提取码1111
1.解析 “zip” 格式的文件 主题思路首先根据 “zip” 格式的文件的原始路径创建对应的File对象拿到其根目录通过exists方法判断根目录是否存在如果存在就删除重新创建再读取子内容包括子文件子目录分别创建对应的子文件子目录并将子文件的内容写入
重点知识点1.ZipInputStream:用于进行zip格式压缩文件的输入流(读取) 2.zipEntry:用于表示 zip 文件条目。 1.先根据文件的原始路径创建File对象得到其根目录 getParent获取其父级路径 substring(0,sourceFileName.lastIndexOf(.)负责拼接文件的文件名去掉其 “.zip后缀
//根据原始路径字符串创建源文件File对象
//path文件的原始路径
File sourceFile new File(path);//根目录
String sourceFileName sourceFile.getName();
File rootDir new File(sourceFile.getParent()\\sourceFileName.substring(0,sourceFileName.lastIndexOf(.))); 2.判断其创建的根目录是否存在如果存在就删除重新创建
注意删除时java自带的delete方法只能删除空目录当目录内部用其他子文件时需使用第三方类库删除
第三方类库的删除方法导入commons-io-2.16.1.jar
FileUtils.deleteDirectory(rootDir) 无论目录是否为空都可删除
此方法参数为要删除的目录文件对象 //判断要创建的目录是否存在if(rootDir.exists()) {//如果存在就删除重新创建//rootDir.delete();//要求只能删除空目录//第三方类库删除try {FileUtils.deleteDirectory(rootDir);} catch (IOException e) {e.printStackTrace();}} 3.重新创建新的根目录 //重新创建或创建根目录rootDir.mkdir(); 4.读取子内容子文件子目录如果为子目录就创建为子文件就创建写入 getNextEntry() 读取下一个zip文件条目并将该流定位在条目数据的开头。 返回值下一个zip文件条目如果没有更多条目则返回null。 首先呢上面我们说过了ZipInputStream用于进行zip格式的压缩文件的输入流我们先用ZipInputStream对zip文件进行读取操作然后呢遍历其内部的子文件或者子目录而ZipEntry对象又表示为zip压缩格式文件内部的文件条目。所以我们先创建一个ZipEntry对象通过getNextEntry()方法不断用循环获取其文件条目 再拿到一个文件条目时创建其对应的File对象并判断是子文件还是子目录判断时用到的一定是zipEntry对象而不是创建的File对象 如果是子目录通过mkdir(),创建子目录 如果是子文件先创建子文件再通过文件输出流FileOutputStream写入文件内容。
try (ZipInputStream in new ZipInputStream(new FileInputStream(sourceFile));){//遍历压缩包中的每个子文件或者子目录ZipEntry类型的对象ZipEntry zipEntry null;while((zipEntry in.getNextEntry()) ! null) {System.out.println(zipEntry.getName());//创建子目录或者子文件file对象File file new File(rootDir.getPath()\\zipEntry.getName());if(zipEntry.isDirectory()) {//物理磁盘创建子目录file.mkdir();}else {//物理磁盘创建子文件file.createNewFile();//此处不能用用后会将ZipInputStream创建的流关闭导致getNextEntry()无法继续使用//FileUtils.copyInputStreamToFile(in, file);//读取内容并写入try(FileOutputStream out new FileOutputStream(file)){byte[] buff new byte[1024];int len -1;while((len in.read(buff))!-1) {out.write(buff,0,len);}}}}} catch (FileNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}}
2.解析 “rar” 格式的文件 1.先根据文件的原始路径创建File对象得到其根目录 2.判断其创建的根目录是否存在如果存在就删除重新创建
此部分内容与解析 “.zip” 格式压缩文件的内容一致不再做详细描述
//1.创建解压后的根目录File rarfile new File(path);File rootDir new File(rarfile.getParent()\\rarfile.getName().substring(0,rarfile.getName().lastIndexOf(.)));if(rootDir.exists()) {try {FileUtils.deleteDirectory(rootDir);} catch (IOException e) {e.printStackTrace();}}//创建根目录rootDir.mkdir(); 3.读取 “rar” 格式压缩文件内容 在读取 “rar” 格式压缩文件时我们需用到第三方类库 junrar-7.5.5.jar 用于解析 “rar” 格式的压缩文件 slf4j-api-2.0.13.jar junrar的jar中某个类依赖此jar包
首先我们需要知道在解析“rar” 的jar中为我们提供了一个类 Archive用于读取rar压缩文件格式
内部实现逻辑也是通过文件输入流进行读取所以内部还是先通过FileInputStream读取 1先通过创建Archive对象读取rar压缩文件 2在读取后archive并没有提供任何read方法让我们读取而是依靠
getFileHeader让我们获取到所以的子目录或者子文件但是时FileHeader类型的对象返回值为一个FileHeader类型的list集合 3在获取的list集合所有的子文件或者子目录的顺序是乱序的所以我们需要对此list进行排序用到了sort的选择器此部分学习参考我帖子的
java接口及其应用场景_java接口的应用场景-CSDN博客 4在排序完成后我们对其遍历通过创建其对应的File对象判断是子文件还是子目录 子目录通过mkdir方法创建 如果是子文件先创建子文件再通过第三方类库的commons-io-2.16.1.jar
的 FileUtils.copyInputStreamToFile(in, file); 复制文件输入流至新子文件
//创建Archive对象用于读取rar压缩文件格式try (Archive archive new Archive(new FileInputStream(path));){//获取压缩文件中所有的子目录或子文件FileHeader对象ListFileHeader fileHeaders archive.getFileHeaders();//按照子目录或者子文件名称排序fileHeaders.sort(new ComparatorFileHeader() {Overridepublic int compare(FileHeader o1, FileHeader o2) {return o1.getFileName().compareTo(o2.getFileName());}});for(FileHeader fd: fileHeaders) {System.out.println(fd.getFileName());File file new File(rootDir.getParent()\\fd.getFileName());if(fd.isDirectory()) {//创建新子文件file.mkdir();}else {//创建新子目录file.createNewFile();//获取压缩包中的子文件流InputStream in archive.getInputStream(fd);//复制文件输入流至新子文件FileUtils.copyInputStreamToFile(in, file);}}} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e1) {// TODO Auto-generated catch blocke1.printStackTrace();} catch (RarException e1) {// TODO Auto-generated catch blocke1.printStackTrace();} }