文件归档与解档问题
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.实现文件归档与解档
3.测试
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"); } }
相关文章推荐
- 文件归档与解档问题
- plist文件的归档,解档
- 如何正确删除oracle归档文件解决ora-00257问题
- iOS study Day15-自定义文件的解档和归档
- oracle基于归档的增量异地恢复 --异地新增数据文件问题
- iOS之文件读写,应用程序包,归档解档
- Linux system 文件的归档与解档、传输与下载及压缩与解压
- 数据本地化存储之NSUserdefaults,plist文件,归档解档,数据库sqlite(FMDB)
- 火狐浏览器个人设置保存备份即归档文件问题
- 归档解档(文件写入与读取)
- OC—文件I/O 归档与解档
- 关于重做日志文件和归档文件的问题
- 【非凡程序员】文件的归档解档
- Spring 中注入bean的properties配置文件位置问题解决
- 正确处理下载文件时HTTP头的编码问题(Content-Disposition)
- 解决在布局文件加入app:radius="4dip"报错的问题
- Springboot 之 解决IDEA读取properties配置文件的中文乱码问题
- chm文件打开空问题解决方法
- Xcode8修改或者新建的XIB文件 xcode7上报错问题
- FCKeditor for Java 中文文件名文件上传乱码问题