文件归档与解档问题

来源:互联网 发布:ubuntu安装声卡驱动 编辑:程序博客网 时间:2024/05/16 11:24

在大数据开发中,或这一些项目中,经常遇到很多小文件的处理,为了减小namenode内存的占用,提高效率,经常将小文件压缩并归档处理,而在流的读取与写的操作的时候,归档后还需要解档,下面写一个工具类,实现文件的归档与解档:

1.字节数组与整数转化的工具类

package java.util;/** * 数据工具类 */public class DataUtil {/** * 将整数转换成字节数组 */public static byte[] int2ByteArr(int i){byte[] bytes = new byte[4] ;bytes[0] = (byte)(i >> 24) ;bytes[1] = (byte)(i >> 16) ;bytes[2] = (byte)(i >> 8) ;bytes[3] = (byte)(i >> 0) ;return bytes ;}/** * 将字节数组转换成整数 */public static int byteArr2Int(byte[] arr){return  (arr[0] & 0xff) << 24| (arr[1] & 0xff) << 16| (arr[2] & 0xff) << 8| (arr[3] & 0xff) << 0 ;}}

2.实现文件归档与解档

package java.io;import java.util.DataUtil;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;/** * 归档器 */public class Archiver {/** * 将file文件追加到xar中 */public void appendFile(String xar , String file){try {//归档文件输出流FileOutputStream fos = new FileOutputStream(xar,true) ;//1.文件名程度File f = new File(file);String fileName = f.getName();byte[] fileNameBytes = fileName.getBytes();byte[] fileNameLenBytes = DataUtil.int2ByteArr(fileNameBytes.length);fos.write(fileNameLenBytes);//2.文件名内容fos.write(fileNameBytes);//3.文件长度int len = (int)f.length();byte[] lenBytes = DataUtil.int2ByteArr(len) ;fos.write(lenBytes);//4.文件内容FileInputStream fis = new FileInputStream(f) ;byte[] buf = new byte[1024] ;int len0 = 0 ;while((len0 = fis.read(buf)) != -1){fos.write(buf,0,len0);}fis.close();fos.close();} catch (Exception e) {e.printStackTrace();}}/** * 解档 */public void unarchive(String xar , String dir){try {FileInputStream fis = new FileInputStream(xar) ;while(true){byte[] byte4 = new byte[4] ;int len = fis.read(byte4) ;//读到文件尾if(len == -1){break ;}//byte[] fileNameBytes = new byte[DataUtil.byteArr2Int(byte4)];//读取文件名fis.read(fileNameBytes);String fileName = new String(fileNameBytes) ;File newFile = new File(dir,fileName) ;FileOutputStream fos = new FileOutputStream(newFile) ;//读取文件长度fis.read(byte4);byte[] fileContBytes = new byte[DataUtil.byteArr2Int(byte4)] ;//读取文件内容fis.read(fileContBytes) ;fos.write(fileContBytes);fos.close();}fis.close();} catch (Exception e) {e.printStackTrace();}}}

3.测试

package java.test;import java.io.Archiver;import org.junit.Test;/** * 测试归档,解档 */public class TestArchiver {/** * 测试归档 */@Testpublic void TestArchive(){Archiver a = new Archiver();a.appendFile("d:/arch/my.xar","d:/arch/1.txt");a.appendFile("d:/arch/my.xar","d:/arch/2.gif");a.appendFile("d:/arch/my.xar","d:/arch/3.mp3");}/** * 测试归档 */@Testpublic void TestUnarchive(){Archiver a = new Archiver();a.unarchive("d:/arch/my.xar","d:/arch/unarch");}}



原创粉丝点击