java实现文件归档和还原

 更新时间:2019年09月26日 08:31:04   作者:binSama  
这篇文章主要为大家详细介绍了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三个文件。

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

您可能感兴趣的文章:

相关文章

  • Maven重复依赖问题解决(同一个jar多个版本)

    Maven重复依赖问题解决(同一个jar多个版本)

    本文主要介绍了Maven重复依赖问题解决(同一个jar多个版本),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • JVM Tomcat性能实战(推荐)

    JVM Tomcat性能实战(推荐)

    下面小编就为大家带来一篇JVM Tomcat性能实战(推荐)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-05-05
  • mybatis-plus分页查询三种方法小结

    mybatis-plus分页查询三种方法小结

    本文主要介绍了mybatis-plus分页查询三种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-05-05
  • Java实现获取行政区划的示例代码

    Java实现获取行政区划的示例代码

    这篇文章主要为大家详细介绍了如何利用Java语言实现获取行政区划的功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习游戏
    2023-03-03
  • springboot+element-ui实现多文件一次上传功能

    springboot+element-ui实现多文件一次上传功能

    这篇文章主要介绍了springboot+element-ui多文件一次上传功能,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-06-06
  • Java基于堆结构实现优先队列功能示例

    Java基于堆结构实现优先队列功能示例

    这篇文章主要介绍了Java基于堆结构实现优先队列功能,结合实例形式分析了java优先队列的简单定义与使用方法,需要的朋友可以参考下
    2017-11-11
  • spring boot配置读写分离的完整实现步骤

    spring boot配置读写分离的完整实现步骤

    数据库配置主从之后,如何在代码层面实现读写分离?所以下面这篇文章主要给大家介绍了关于spring boot配置读写分离的完整步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2018-09-09
  • Springboot工具类StringUtils使用教程

    Springboot工具类StringUtils使用教程

    这篇文章主要介绍了Springboot内置的工具类之StringUtils的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2022-12-12
  • Java web实现头像上传以及读取显示

    Java web实现头像上传以及读取显示

    这篇文章主要为大家详细介绍了Java web实现头像上传以及读取显示,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06
  • python实战之德州扑克第一步-发牌

    python实战之德州扑克第一步-发牌

    这篇文章主要介绍了python实战之德州扑克第一步-发牌,文中有非常详细的代码示例,对正在学习python的小伙伴们有非常好的帮助,需要的朋友可以参考下
    2021-04-04

最新评论