您的位置:首页 > 大数据

文件归档与解档问题

2017-07-29 00:34 218 查看
在大数据开发中,或这一些项目中,经常遇到很多小文件的处理,为了减小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 {

/**
* 测试归档
*/
@Test
public 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");
}
/**
* 测试归档
*/
@Test
public void TestUnarchive(){
Archiver a = new Archiver();
a.unarchive("d:/arch/my.xar","d:/arch/unarch");
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息