最近接到一个需求,做个进程,涉及去某台服务器上面取tar.gz压缩文件,然后进行解压。
奈何自己没搞过类似的需求。自己很懵逼。最后一番波折写出以下代码。
谨做个人笔记。
知识前提:
1、tar.gz为后缀的文件是一种压缩文件,在Linux和macOS下常见,Linux和macOS都可以直接解压使用这种压缩文件。但是我们是要从Java!扯什么Linux和macOS!!!!
2、自测代码,可以通过自己压缩一个tar.gz压缩包。压缩工具推荐7-zip。先tar压缩,再gzip压缩。
3、先使用GZIPInputStream读取文件(为什么要先用GZIPInputStream,建议参考tar.gz文件是怎么生成,个人理解。)。生成文件,再进行使用FileInputStream和FileOutputStream文件流进行读文件和写文件。
4、类TarEntry
隶属于 Apcache org.apache.tools.tar 包的一个类。
这个类TarEntry表示Tar归档文件中的条目。它由条目的标题和条目的File组成。
从存档中读取的标头字节创建的TarEntries使用TarEntry(byte [])构造函数实例化。从存档内容中提取或列出存档内容时,将使用这些条目。
TarEntries只能由名称构成。这使程序员可以手动构造条目。
一,处理解tar.gz压缩包.主要方法。
1 /** 2 * 处理压缩包并获取文件Name 3 * @param fileName 4 * @return 5 */ 6 private List<String> processSingleZipFile(String zipFileName) throws Exception { 7 if(log.isInfoEnabled()){ 8 log.info("开始解压["+zipFileName+"]*************"); 9 } 10 List<String> retFiles=null; 11 try { 12 String tarFile = zipFileName.substring(0, zipFileName.indexOf(".gz")); 13 this.unZip(this.localPath + File.separator + zipFileName, this.localPath + File.separator + tarFile); 14 retFiles = this.unTar(this.localPath + File.separator + tarFile, this.localPath + File.separator); 15 // move to his 16 File gzFile = new File(this.localPath+ File.separator + zipFileName); 17 File gzHisFile = new File(this.localPath + File.separator + zipFileName); 18 gzFile.renameTo(gzHisFile); 19 gzFile.delete();//把解压包移到HIS目录 20 } catch (Exception e) { 21 if(log.isErrorEnabled()){ 22 log.error("解压文件"+zipFileName+"失败!", e); 23 } 24 } 25 return retFiles; 26 }