首页 > 代码库 > javase解归档文件
javase解归档文件
1 package com.archiver; 2 3 import java.util.List; 4 5 import org.junit.Test; 6 7 public class ArchiverDemo { 8 /** 9 * 测归档 10 */ 11 @Test 12 public void testArchive() { 13 String archFile = "D:\\arch\\my.xar"; 14 String txt = "D:\\a.txt"; 15 String jpg = "E:\\迅雷下载\\b.jpg"; 16 String ma3 = "E:\\迅雷下载\\c.mp3"; 17 Archiver ar = new Archiver(); 18 ar.archive(archFile, txt, jpg, ma3); 19 } 20 21 /** 22 * 测解档 23 */ 24 @Test 25 public void testunArhive() { 26 String archFile = "D:\\arch\\my.xar"; 27 Archiver ar = new Archiver(); 28 ar.unArchiver(archFile, "D:\\arch\\unarch"); 29 } 30 /** 31 * 测追加文件 32 */ 33 @Test 34 public void testAppendFileToArhive() { 35 String archFile = "D:\\arch\\my.xar"; 36 Archiver ar = new Archiver(); 37 ar.appendFile(archFile, "D:\\arch\\d.jpg"); 38 } 39 40 /** 41 * 测文档所有内容 42 */ 43 @Test 44 public void testArchFileNames() { 45 Archiver ar = new Archiver(); 46 List<String> list = ar.getAllFileName("D:\\arch\\my.xar"); 47 for (String string : list) { 48 System.out.println(string); 49 } 50 } 51 }
1 package com.archiver; 2 3 import java.io.FileInputStream; 4 import java.io.FileOutputStream; 5 import java.io.IOException; 6 import java.util.ArrayList; 7 import java.util.List; 8 9 public class Archiver { 10 11 /** 12 * 把多个文件归档到一个文件中 13 */ 14 public void archive(String archFile, String... srcFiles) { 15 for (String srcFile : srcFiles) { 16 appendFile(archFile, srcFile); 17 } 18 } 19 20 /** 21 * 向归档文件中追加内容 22 * 23 * @param archFile 24 * @param srcFile 25 */ 26 public void appendFile(String archFile, String srcFile) { 27 FileOutputStream fos=null; 28 FileInputStream fis=null; 29 try { 30 fos = new FileOutputStream(archFile, true); 31 // 1.处理文件名 32 String fileName = getName(srcFile); 33 // 1.1 存储文件名长度 34 byte[] byt = Int2Byte(fileName.length()); 35 fos.write(byt); 36 // 1.2 文件字节数组 37 fos.write(fileName.getBytes()); 38 // 2、处理文件内容 39 fis = new FileInputStream(srcFile); 40 int count=fis.available();//文件内容长度 41 //存储文件内容长度 42 fos.write(Int2Byte(count)); 43 byte[] buff = new byte[1024]; 44 int len = 0; 45 while ((len = fis.read(buff)) != -1) { 46 fos.write(buff, 0, len); 47 } 48 } catch (Exception e) { 49 // TODO Auto-generated catch block 50 e.printStackTrace(); 51 } finally { 52 try { 53 fis.close(); 54 fos.close(); 55 } catch (IOException e) { 56 // TODO Auto-generated catch block 57 e.printStackTrace(); 58 } 59 } 60 61 } 62 /** 63 * 解归档 64 * @param length 65 * @return 66 */ 67 public void unArchiver(String archFile,String destDir){ 68 //FileInputStream fis=null; 69 //FileOutputStream fos=null; 70 try { 71 FileInputStream fis=new FileInputStream(archFile); 72 //读取文件名长度 73 byte[] fnameLenBuff=new byte[4]; 74 while((fis.read(fnameLenBuff))!=-1){ 75 76 int fnameLength=Byte2Int(fnameLenBuff); 77 //读取文件名 78 byte[] fnameBuf=new byte[fnameLength]; 79 fis.read(fnameBuf); 80 String fname=new String(fnameBuf); 81 //读取文件内容长度 82 byte[] fcontBuf=new byte[4]; 83 fis.read(fcontBuf); 84 int flen=Byte2Int(fcontBuf); 85 //将归档内容写到指定目录处 86 FileOutputStream fos=new FileOutputStream(destDir+"\\"+fname); 87 byte[] buf=new byte[1024]; 88 int mod=flen % buf.length; 89 int count=0; 90 91 if(mod==0){ 92 count=flen/buf.length; 93 } 94 else{ 95 count=flen/buf.length+1; 96 } 97 for(int i=0;i<count;i++){ 98 //最后一次 99 if(i==(count-1)){ 100 mod=(mod==0?buf.length:mod); 101 fis.read(buf, 0, mod); 102 fos.write(buf, 0, mod); 103 fos.close(); 104 } 105 else{ 106 fis.read(buf); 107 fos.write(buf); 108 } 109 } 110 } 111 fis.close(); 112 } catch (Exception e) { 113 e.printStackTrace(); 114 // TODO: handle exception 115 } 116 } 117 /** 118 * 提取归档文件的所有文件名 119 * @param length 120 * @return 121 */ 122 public List<String> getAllFileName(String archFile){ 123 //FileInputStream fis=null; 124 //FileOutputStream fos=null; 125 ArrayList<String> names = new ArrayList<>(); 126 try { 127 FileInputStream fis=new FileInputStream(archFile); 128 //读取文件名长度 129 byte[] fnameLenBuff=new byte[4]; 130 while((fis.read(fnameLenBuff))!=-1){ 131 132 int fnameLength=Byte2Int(fnameLenBuff); 133 //读取文件名 134 byte[] fnameBuf=new byte[fnameLength]; 135 fis.read(fnameBuf); 136 String fname=new String(fnameBuf); 137 names.add(fname); 138 //读取文件内容长度 139 byte[] fcontBuf=new byte[4]; 140 fis.read(fcontBuf); 141 int flen=Byte2Int(fcontBuf); 142 //跳过文件内容 143 fis.skip(flen); 144 } 145 fis.close(); 146 } catch (Exception e) { 147 e.printStackTrace(); 148 // TODO: handle exception 149 } 150 return names; 151 } 152 //整数转为字节数组 153 private byte[] Int2Byte(int length) { 154 byte[] a=new byte[4]; 155 a[0]=(byte) (length>>24); 156 a[1]=(byte) (length>>16); 157 a[2]=(byte) (length>>8); 158 a[3]=(byte) (length>>0); 159 return a; 160 } 161 //字节数组转为整数 162 private int Byte2Int(byte[] by) { 163 int a1=by[0]<<24; 164 int a2=(by[1]&0xff)<<16; 165 int a3=(by[2]&0xff)<<8; 166 int a4=(by[3]&0xff)<<0; 167 168 return a1|a2|a3|a4; 169 } 170 /** 171 * 获取文件名称 172 * 173 * @param srcFile 174 * @return 175 */ 176 private String getName(String srcFilePath) { 177 String seg = null; 178 if(srcFilePath.contains("\\")){ 179 seg="\\"; 180 } 181 else if(srcFilePath.contains("/")){ 182 seg="/"; 183 } 184 return srcFilePath.substring(srcFilePath.lastIndexOf(seg)+1); 185 } 186 }
package com.archiver; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.util.ArrayList; import java.util.List; public class Archiver { /** * 把多个文件归档到一个文件中 */ public void archive(String archFile, String... srcFiles) { for (String srcFile : srcFiles) { appendFile(archFile, srcFile); } } /** * 向归档文件中追加内容 * * @param archFile * @param srcFile */ public void appendFile(String archFile, String srcFile) { FileOutputStream fos=null; FileInputStream fis=null; try { fos = new FileOutputStream(archFile, true); // 1.处理文件名 String fileName = getName(srcFile); // 1.1 存储文件名长度 byte[] byt = Int2Byte(fileName.length()); fos.write(byt); // 1.2 文件字节数组 fos.write(fileName.getBytes()); // 2、处理文件内容 fis = new FileInputStream(srcFile); int count=fis.available();//文件内容长度 //存储文件内容长度 fos.write(Int2Byte(count)); byte[] buff = new byte[1024]; int len = 0; while ((len = fis.read(buff)) != -1) { fos.write(buff, 0, len); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { try { fis.close(); fos.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } /** * 解归档 * @param length * @return */ public void unArchiver(String archFile,String destDir){ //FileInputStream fis=null; //FileOutputStream fos=null; try { FileInputStream fis=new FileInputStream(archFile); //读取文件名长度 byte[] fnameLenBuff=new byte[4]; while((fis.read(fnameLenBuff))!=-1){ int fnameLength=Byte2Int(fnameLenBuff); //读取文件名 byte[] fnameBuf=new byte[fnameLength]; fis.read(fnameBuf); String fname=new String(fnameBuf); //读取文件内容长度 byte[] fcontBuf=new byte[4]; fis.read(fcontBuf); int flen=Byte2Int(fcontBuf); //将归档内容写到指定目录处 FileOutputStream fos=new FileOutputStream(destDir+"\\"+fname); byte[] buf=new byte[1024]; int mod=flen % buf.length; int count=0; if(mod==0){ count=flen/buf.length; } else{ count=flen/buf.length+1; } for(int i=0;i<count;i++){ //最后一次 if(i==(count-1)){ mod=(mod==0?buf.length:mod); fis.read(buf, 0, mod); fos.write(buf, 0, mod); fos.close(); } else{ fis.read(buf); fos.write(buf); } } } fis.close(); } catch (Exception e) { e.printStackTrace(); // TODO: handle exception } } /** * 提取归档文件的所有文件名 * @param length * @return */ public List<String> getAllFileName(String archFile){ //FileInputStream fis=null; //FileOutputStream fos=null; ArrayList<String> names = new ArrayList<>(); try { FileInputStream fis=new FileInputStream(archFile); //读取文件名长度 byte[] fnameLenBuff=new byte[4]; while((fis.read(fnameLenBuff))!=-1){ int fnameLength=Byte2Int(fnameLenBuff); //读取文件名 byte[] fnameBuf=new byte[fnameLength]; fis.read(fnameBuf); String fname=new String(fnameBuf); names.add(fname); //读取文件内容长度 byte[] fcontBuf=new byte[4]; fis.read(fcontBuf); int flen=Byte2Int(fcontBuf); //跳过文件内容 fis.skip(flen); } fis.close(); } catch (Exception e) { e.printStackTrace(); // TODO: handle exception } return names; } //整数转为字节数组 private byte[] Int2Byte(int length) { byte[] a=new byte[4]; a[0]=(byte) (length>>24); a[1]=(byte) (length>>16); a[2]=(byte) (length>>8); a[3]=(byte) (length>>0); return a; } //字节数组转为整数 private int Byte2Int(byte[] by) { int a1=by[0]<<24; int a2=(by[1]&0xff)<<16; int a3=(by[2]&0xff)<<8; int a4=(by[3]&0xff)<<0; return a1|a2|a3|a4; } /** * 获取文件名称 * * @param srcFile * @return */ private String getName(String srcFilePath) { String seg = null; if(srcFilePath.contains("\\")){ seg="\\"; } else if(srcFilePath.contains("/")){ seg="/"; } return srcFilePath.substring(srcFilePath.lastIndexOf(seg)+1); } }
View Code
javase解归档文件
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。