文件归档与解档问题
2018-01-04 22:12
288 查看
在大数据开发中,或这一些项目中,经常遇到很多小文件的处理,为了减小namenode内存的占用,提高效率,经常将小文件压缩并归档处理,而在流的读取与写的操作的时候,归档后还需要解档,下面写一个工具类,实现文件的归档与解档:
1.字节数组与整数转化的工具类
[java] view plain copy
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.实现文件归档与解档
[java] view plain copy
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.测试
[java] view plain copy
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");
}
}
1.字节数组与整数转化的工具类
[java] view plain copy
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.实现文件归档与解档
[java] view plain copy
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.测试
[java] view plain copy
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");
}
}
相关文章推荐
- 文件归档与解档问题
- 关于重做日志文件和归档文件的问题
- OC—文件I/O 归档与解档
- plist文件的归档,解档
- 【非凡程序员】文件的归档解档
- 数据本地化存储之NSUserdefaults,plist文件,归档解档,数据库sqlite(FMDB)
- 火狐浏览器个人设置保存备份即归档文件问题
- Linux system 文件的归档与解档、传输与下载及压缩与解压
- oracle基于归档的增量异地恢复 --异地新增数据文件问题
- iOS study Day15-自定义文件的解档和归档
- 归档解档(文件写入与读取)
- iOS之文件读写,应用程序包,归档解档
- 如何正确删除oracle归档文件解决ora-00257问题
- ssh上传带中文的视频文件不能播放的问题
- Linux操作系统口令文件安全问题详细解析
- 利用ASH功能定位处理产生core文件超大问题
- Struts2 下载文件乱码问题
- 网站中文件或图片的路径问题
- 母版页中引用图片、外部js、css文件的路径问题
- 【问题】VS2010 VS2012 VS2013 安装之后提示 "无法打开文件 kernel32.lib" 解决方案