java实现文件归档和还原

作者:binSama 时间:2023-02-28 23:09:51 

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

基本思路: 

文件归档,换句话就是把多个文件的字节存到一个文件中。为此我们必须定义存储格式,才能从包中把文件重新抽出来。

文件由文件名和内容组成。要想完整的还原文件,我们必须同时存下这两个东西,而文件名和内容的字节大小我们都是不知道的,为此我们必须要用固定大小的空间存储它们的大小。

存储格式

java实现文件归档和还原

代码实现

因为文件内容大小是4个字节(也就是int型),我们要把它存到文件,就要转化成字节数组。我们规定低位靠前,高位靠后。按照这种格式封装转换操作与一个基础类DataUtil中。

DataUtil代码


package util;

public class DataUtil {
public static byte[] int2bytes(int src) {
byte[] rt = new byte[4];
for(int i=0; i<4; ++i) {
rt[i] = (byte)(src>>(i*8));
}
return rt;
}
public static int bytes2int(byte[] src) {
int rt = 0;
for(int i=0; i<4; ++i) {
rt |= (src[i]&0xFF)<<(i*8);
//字节在进行移位运算时,首先会被转换成int类型,
//此时若字节的符号位为1,它前面就会补全1,比如:
//0x80在byte类型时是-128,而转换成int,它的值还是
//-128,即0xffffff80,而我们移位运算想要的是
//0x00000080,即前面补全0,跟我们拆时一致。为此,
//我们让它与0xFF相与,从0xffffff80变为0x00000080。
}
return rt;
}
}

归档类


package wfb.binSama;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;

import util.DataUtil;

/**
* @author binSama
*/
public class Archive {

public static void archive(File[] srcs,File tar) {//归档
try {
FileOutputStream fos = new FileOutputStream(tar);
for(int i=0; i<srcs.length; ++i) {
//获得文件名
byte[] fileName = srcs[i].getName().getBytes();
//获得文件名长度
byte fileNameLen = (byte)fileName.length;
//获得文件内容
FileInputStream fis = new FileInputStream(srcs[i]);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int len = -1;
byte[] buf = new byte[1024];
while((len = fis.read(buf)) != -1) {
 baos.write(buf, 0, len);
}
baos.close();
fis.close();
byte[] fileContent = baos.toByteArray();
//获得文件内容长度
byte[] fileContentLen = DataUtil.int2bytes(fileContent.length);
//写入
fos.write(fileNameLen);
fos.write(fileName);
fos.write(fileContentLen);
fos.write(fileContent);
}
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
}

public static void unArchive(File src) {//解档到当前文件夹
try {
FileInputStream fis = new FileInputStream(src);
int fileNameLen = -1;
while((fileNameLen = fis.read()) != -1){
byte[] byteFileName = new byte[fileNameLen];
fis.read(byteFileName);
String fileName = src.getParent() +"\\"+ new String(byteFileName);
FileOutputStream fos = new FileOutputStream(fileName);
byte[] byteFileContentLen = new byte[4];
fis.read(byteFileContentLen);
int fileContentLen = DataUtil.bytes2int(byteFileContentLen);
int divisorFileContentLen = fileContentLen / 1024;
int remainderFileContentLen = fileContentLen % 1024;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] divisorBuf = new byte[1024];
for(int i=0; i<divisorFileContentLen; ++i) {
 fis.read(divisorBuf);
 baos.write(divisorBuf);
}
byte[] remainderBuf = new byte[remainderFileContentLen];
fis.read(remainderBuf);
baos.write(remainderBuf);
baos.close();
byte[] fileContent = baos.toByteArray();
fos.write(fileContent);
}
fis.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}

测试:


package wfb.binSama;

import java.io.File;

public class Test {
@org.junit.Test
public void test() {
File[] files = new File[3];
files[0] = new File("E:\\waster\\Archiver1\\1.txt");
files[1] = new File("E:\\waster\\Archiver1\\2.png");
files[2] = new File("E:\\waster\\Archiver1\\3.txt");
File bsm = new File("E:\\waster\\Archiver2\\archive.bsm");
Archive.archive(files, bsm);
Archive.unArchive(bsm);
}

}

现象

成功在E:\waster\Archiver2文件夹生成了archive.bsm归档文件,并解档出1.txt 2.png 3.txt三个文件。

java实现文件归档和还原

来源:https://blog.csdn.net/qq_40424244/article/details/82874160

标签:java,文件归档,文件还原
0
投稿

猜你喜欢

  • Java8新特性之精简的JRE详解_动力节点Java学院整理

    2022-09-19 12:25:50
  • flutter Bloc 实现原理示例解析

    2023-07-18 08:00:39
  • java音乐播放器实现代码

    2022-08-29 08:41:22
  • Java如何实现树的同构?

    2023-11-28 09:55:19
  • Android编程开发之在Canvas中利用Path绘制基本图形(圆形,矩形,椭圆,三角形等)

    2021-11-16 03:28:09
  • java实现单链表倒转的方法

    2023-04-04 04:44:01
  • c#之事件用法

    2023-09-22 05:05:28
  • Java判断变量是否为空问题的方法总结

    2023-02-03 12:23:09
  • java使用计算md5校验码方式比较两个文件是否相同

    2023-05-10 23:43:16
  • springboot注册拦截器所遇到的问题

    2023-01-17 21:18:30
  • Java传入用户名和密码并自动提交表单实现登录到其他系统的实例代码

    2023-09-20 00:40:46
  • Java实现去除文档阴影的示例代码

    2023-08-31 11:45:48
  • 详解json string转换为java bean及实例代码

    2021-07-04 01:48:26
  • 老生常谈Scanner的基本用法

    2021-08-27 00:34:18
  • SWT(JFace) 文本编辑器 实现代码

    2023-01-27 22:39:37
  • C#设计模式之外观模式介绍

    2023-03-15 06:22:31
  • 详解mysql插入数据后返回自增ID的七种方法

    2023-07-01 21:32:20
  • Java 类与对象超基础讲解

    2023-06-12 00:03:22
  • C++string中的insert()插入函数详解

    2023-11-02 14:05:51
  • Java Object类中的常用API介绍

    2023-11-09 01:51:00
  • asp之家 软件编程 m.aspxhome.com