Java实现文件的归档和解档
本文实例为大家分享了Java实现文件归档和解档的具体代码,供大家参考,具体内容如下
文件的归档
packagecn.yimen.archiver; importjava.io.ByteArrayOutputStream; importjava.io.File; importjava.io.FileInputStream; importjava.io.FileOutputStream; /** *归档器 */ publicclassArchiver{ publicstaticvoidmain(String[]args)throwsException{ // FileOutputStreamfos=newFileOutputStream("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(); // } /** *path:d:/xxx/xxx/a.jpg *@throwsException */ publicstaticbyte[]addFile(Stringpath)throwsException{ //文件 Filef=newFile(path); //文件名 Stringfname=f.getName(); //文件名数组 byte[]fnameBytes=fname.getBytes(); //文件内容长度 intlen=(int)f.length(); //计算总长度文件名长度+文件名内容+文件内容长度+文件内容 inttotal=4+fnameBytes.length+4+len; //初始化总数组 byte[]bytes=newbyte[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.写入文件内容 //读取文件内容到数组中 ByteArrayOutputStreambaos=newByteArrayOutputStream(); FileInputStreamfis=newFileInputStream(f); byte[]buf=newbyte[1024]; intlen0=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); returnbytes; } }
文件的解档
packagecn.yimen.archiver; importjava.io.FileInputStream; importjava.io.FileOutputStream; importjava.util.ArrayList; importjava.util.List; /** *解档程序 */ publicclassUnarchiver{ publicstaticvoidmain(String[]args)throwsException{ Listfiles=newArrayList (); // FileInputStreamfis=newFileInputStream("d:/arch/x.xar"); FileBeanfileBean=null; // while((fileBean=readNextFile(fis))!=null){ files.add(fileBean); } //关闭流 fis.close(); FileOutputStreamfos=null; // for(FileBeanfb:files){ fos=newFileOutputStream("d:/arch/unarch/"+fb.getFileName()); fos.write(fb.getFileContent()); fos.close(); } } /** *从流中读取下一个文件 */ publicstaticFileBeanreadNextFile(FileInputStreamfis)throwsException{ // byte[]bytes4=newbyte[4]; //读取四个字节 intres=fis.read(bytes4); if(res==-1){ returnnull; } //文件名长度 intfnameLen=Util.bytes2Int(bytes4); //文件名数组 byte[]fileNameBytes=newbyte[fnameLen]; fis.read(fileNameBytes); //得到文件名 Stringfname=newString(fileNameBytes); //再读取4个字节,作为文件内容的长度 fis.read(bytes4); intfileContLen=Util.bytes2Int(bytes4); //读取文件内容 byte[]fileContBytes=newbyte[fileContLen]; fis.read(fileContBytes); returnnewFileBean(fname,fileContBytes); } }
packagecn.yimen.archiver; /** *文件Bean */ publicclassFileBean{ privateStringfileName; privatebyte[]fileContent; publicFileBean(){ } publicFileBean(Stringfname,byte[]fileContBytes){ this.fileName=fname; this.fileContent=fileContBytes; } publicStringgetFileName(){ returnfileName; } publicvoidsetFileName(StringfileName){ this.fileName=fileName; } publicbyte[]getFileContent(){ returnfileContent; } publicvoidsetFileContent(byte[]fileContent){ this.fileContent=fileContent; } }
工具类
packagecn.yimen.archiver; publicclassUtil{ /** *整型转换成字节数组 */ publicstaticbyte[]int2Bytes(inti){ byte[]arr=newbyte[4]; arr[0]=(byte)i; arr[1]=(byte)(i>>8); arr[2]=(byte)(i>>16); arr[3]=(byte)(i>>24); returnarr; } /** *字节数组转成int */ publicstaticintbytes2Int(byte[]bytes){ inti0=bytes[0]; inti1=(bytes[1]&0xFF)<<8; inti2=(bytes[2]&0xFF)<<16; inti3=(bytes[3]&0xFF)<<24; returni0|i1|i2|i3; } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。