前情概要
这篇文章是在上一篇文章如何处理零碎小文件归档的基础上写的。
串行化(也叫序列化)
就像过隧道一样,将需要传输的数据排成一排依次传输;
问: java需要这样的技术,为什么呢?
答: 因为在网络中传输数据的时候,所有的数据都是以字节的形式来传输(存储)。
而Java是面相对象编程,那么对象在内存中可能以各种形式存在。那么,当我们需要网络传输或本地存储(实际就是存到磁盘上去)时,我们必须以某种统一的格式(如:xml格式、文本格式、最常见的就是json格式、以对象方式的串行、以二进制方式存储)转化这些数据;这个过程就叫做串行化。
设计思路
按照如下顺序依次将文件一个一个的解档出来:
- 读取4个字节的文件名长度
- 根据读取到的文件名长度,读取文件名
- 读取4个字节的文件内容长度
- 根据读取到的文件内容长度,读取文件内容
注:
其中存储的文件名长度和文件内容长度的字节数是可以自己定义的;并且第一次读取文件名的长度时需要判断是否到了文件末尾,如果是则解档结束。
具体实现方案
同上一篇文章的Util类:
1 package com.mmzs.util; 2 3 /** 4 * @author: mmzs 5 * @date: 2018年8月9日 6 * @Description: 7 * 博客地址:https://www.cnblogs.com/mmzs/p/9282412.html 8 * @version V1.0 9 */ 10 public class Util { 11 /** 12 * 将int转化为字节数组 13 * @return 14 */ 15 public static byte[] int2Bytes(int i){ 16 byte[] arr = new byte[4]; 17 arr[0] = (byte) i; 18 arr[1] = (byte) (i >> 8); 19 arr[2] = (byte) (i >> 16); 20 arr[3] = (byte) (i >> 24); 21 return arr; 22 } 23 24 /** 25 * 将字节数组转化为int 26 */ 27 public static int bytes2Int(byte[] bytes){ 28 int i0 = bytes[0]; 29 int i1 = (bytes[1] & 0xFF) << 8; 30 int i2 = (bytes[2] & 0xFF) << 16; 31 int i3 = (bytes[3] & 0xFF) << 24; 32 return i0 | i1 | i2 | i3; 33 } 34 }