关于文件格式,引用一下百度百科的定义:
文件格式(或文件类型)是指电脑为了存储信息而使用的对信息的特殊编码方式,是用于识别内部储存的资料。比如有的储存图片,有的储存程序,有的储存文字信息。每一类信息,都可以一种或多种文件格式保存在电脑存储中。每一种文件格式通常会有一种或多种扩展名可以用来识别,但也可能没有扩展名。扩展名可以帮助应用程序识别的文件格式。
对于硬盘机或任何电脑存储来说,有效的信息只有0和1两种。所以电脑必须设计有相应的方式进行信息-位元的转换。对于不同的信息有不同的存储格式。文件格式也意味着文件的用途。
关于上面一段话,个人觉得比较重要的是:对于所有的文件,对于计算机来说还是二进制流(0和1)。
一、规定二进制流协议
所有的文件对于计算机来说都是二进制流,那么我们需要去规定一下二进制协议:
1. 文件类型(1:xxx文件,2:yyy文件)
2. 文件类型所占长度(1字节)
3. 版本号(1,2,3...)
4. 版本号所占长度(1字节)
5. 文件二进制流所占长度(4个字节)
6. 其他拓展文件所占长度(json字符串,图像等2个字节)
二、按照规定协议写入二进制流
File targetFile = new File(targetFilePath);
if(!targetFile.getParentFile().exists()){
targetFile.getParentFile().mkdirs();
}
OutputStream out = new FileOutputStream(targetFile);
// 写入文件类型
out.write(fileType);
// 写入文件协议版本号
out.write(version);
文件首先base64,然后计算base64之后的byte长度,然后写入:
String fileBase64Str = Base64Util.encodeBase64File(srcFilePath);
out.write(ByteUtil.intToBytes(fileBase64Str.getBytes().length));
拓展部分长度写入,也是首先base64之后计算长度,然后写入:
// 写入拓展部分大小
String encodedText = encoder.encodeToString(configJson.getBytes("UTF-8"));
byte[] configJsonBytes = encodedText.getBytes("UTF-8");
byte[] configJsonByteLength = ByteUtil.intToByte2(configJsonBytes.length);
out.write(configJsonByteLength);
文件二进制流写入:
out.write(fileBase64Str.getBytes());
拓展部分二进制流写入:
out.write(configJsonBytes);
out.close();
写入之后的结果如下:
用pdf打开之后的结果如下:
ps:荣耀的背后总是刻着一道孤独!