天天看点

java归档_Java实现文件的归档和解档

本文实例为大家分享了Java实现文件归档和解档的具体代码,供大家参考,具体内容如下

文件的归档

package cn.yimen.archiver;

import java.io.ByteArrayOutputStream;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileOutputStream;

public class Archiver {

public static void main(String[] args) throws Exception {

//

FileOutputStream fos = new FileOutputStream("d:/arch/x.xar");

fos.write(addFile("D:/arch/a.xls"));

fos.write(addFile("D:/arch/b.xml"));

fos.write(addFile("D:/arch/c.jpg"));

fos.close();

//

}

public static byte[] addFile(String path) throws Exception{

//文件

File f = new File(path);

//文件名

String fname = f.getName();

//文件名数组

byte[] fnameBytes = fname.getBytes() ;

//文件内容长度

int len = (int)f.length();

//计算总长度 文件名长度 + 文件名内容 + 文件内容长度 + 文件内容

int total = 4 + fnameBytes.length + 4 + len ;

//初始化总数组

byte[] bytes = new byte[total];

//1.写入文件名长度

byte[] fnameLenArr = Util.int2Bytes(fnameBytes.length);

System.arraycopy(fnameLenArr, 0, bytes, 0, 4);

//2.写入文件名本身

System.arraycopy(fnameBytes, 0, bytes, 4, fnameBytes.length);

//3.写入文件内容长度

byte[] fcontentLenArr = Util.int2Bytes(len);

System.arraycopy(fcontentLenArr, 0, bytes, 4 + fnameBytes.length, 4);

//4.写入文件内容

//读取文件内容到数组中

ByteArrayOutputStream baos = new ByteArrayOutputStream();

FileInputStream fis = new FileInputStream(f);

byte[] buf = new byte[1024];

int len0 = 0 ;

while((len0 = fis.read(buf)) != -1){

baos.write(buf, 0, len0);

}

fis.close();

//得到文件内容

byte[] fileContentArr = baos.toByteArray();

System.arraycopy(fileContentArr, 0, bytes, 4 + fnameBytes.length + 4, fileContentArr.length);

return bytes ;

}

}

文件的解档

package cn.yimen.archiver;

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.util.ArrayList;

import java.util.List;

public class Unarchiver {

public static void main(String[] args) throws Exception {

List files = new ArrayList();

//

FileInputStream fis = new FileInputStream("d:/arch/x.xar");

FileBean fileBean = null ;

//

while((fileBean = readNextFile(fis)) != null){

files.add(fileBean);

}

//关闭流

fis.close();

FileOutputStream fos = null ;

//

for(FileBean fb : files){

fos = new FileOutputStream("d:/arch/unarch/" + fb.getFileName());

fos.write(fb.getFileContent());

fos.close();

}

}

public static FileBean readNextFile(FileInputStream fis) throws Exception{

//

byte[] bytes4 = new byte[4];

//读取四个字节

int res = fis.read(bytes4);

if(res == -1){

return null ;

}

//文件名长度

int fnameLen = Util.bytes2Int(bytes4);

//文件名数组

byte[] fileNameBytes = new byte[fnameLen];

fis.read(fileNameBytes);

//得到文件名

String fname = new String(fileNameBytes);

//再读取4个字节,作为文件内容的长度

fis.read(bytes4);

int fileContLen = Util.bytes2Int(bytes4);

//读取文件内容

byte[] fileContBytes = new byte[fileContLen];

fis.read(fileContBytes);

return new FileBean(fname,fileContBytes);

}

}

package cn.yimen.archiver;

public class FileBean {

private String fileName;

private byte[] fileContent;

public FileBean() {

}

public FileBean(String fname, byte[] fileContBytes) {

this.fileName = fname ;

this.fileContent = fileContBytes ;

}

public String getFileName() {

return fileName;

}

public void setFileName(String fileName) {

this.fileName = fileName;

}

public byte[] getFileContent() {

return fileContent;

}

public void setFileContent(byte[] fileContent) {

this.fileContent = fileContent;

}

}

工具类

package cn.yimen.archiver;

public class Util {

public static byte[] int2Bytes(int i){

byte[] arr = new byte[4] ;

arr[0] = (byte)i ;

arr[1] = (byte)(i >> 8) ;

arr[2] = (byte)(i >> 16) ;

arr[3] = (byte)(i >> 24) ;

return arr ;

}

public static int bytes2Int(byte[] bytes){

int i0= bytes[0];

int i1 = (bytes[1] & 0xFF) << 8 ;

int i2 = (bytes[2] & 0xFF) << 16 ;

int i3 = (bytes[3] & 0xFF) << 24 ;

return i0 | i1 | i2 | i3 ;

}

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持聚米学院。