1、需求说明,实现细节要求:
解析二进制文件 files/case10/binary,其中包含一个字符串和一张图片,数据文件格式为字符串数据长度(2字节)+字符串内容+图片数据长度(4字节)+图片数据,数据长度均为数据字节长度,高位在后,字符串为UTF-8编码,请解析,输出字符串内容,图片文件保存为files/case10/test.png。
2、实现代码:
package com.igen.case10; import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.net.URISyntaxException; /*** * @ClassName Case10* @Description TODO** @author wjggwm* @data 2017年2月7日 上午11:46:25*/public class Case10 { static final String fileName = "/test.png";static final String filePath = "D:/files/case10";static final String sourceFileName = "binary"; public static void main(String[] args) {try {readFile(Case10.class.getResource(sourceFileName).toURI().getPath());} catch (URISyntaxException e) {e.printStackTrace();}} /*** * @Description 解析二进制文件* @param sourceFileName** @author wjggwm* @data 2017年2月7日 上午11:47:12*/public static void readFile(String sourceFileName) {InputStream in = null;try {in = new FileInputStream(sourceFileName); // 读取字符串数据长度字节byte[] txtLenByte = new byte[2];in.read(txtLenByte);int txtlen = byte2ToUnsignedShort(txtLenByte, 0); // 读取字符串字节byte[] txtByte = new byte[txtlen];in.read(txtByte);//字符串为UTF-8编码String txt = new String(txtByte, "UTF-8");// 输出字符串System.out.println(txt); // 读取图片数据长度byte[] imgLenByte = new byte[4];in.read(imgLenByte);int imgLen = byte4ToInt(imgLenByte, 0); // 读取图片数据byte[] img = new byte[imgLen];in.read(img);// 生成图片文件saveToImgByBytes(filePath, fileName, img);} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {if (in != null) {try {in.close();} catch (IOException e) {e.printStackTrace();}}} } /*** * @Description 将字节写入文件* @param imgName* @param imgByte** @author wjggwm* @data 2017年2月7日 上午11:07:45*/public static void saveToImgByBytes(String filePath, String imgName, byte[] imgByte) {try {File dic = new File(filePath);if (!dic.exists()) {dic.mkdirs();}File image = new File(filePath + imgName);if (!image.exists()) {image.createNewFile();}FileOutputStream fos = new FileOutputStream(image);fos.write(imgByte);fos.flush();fos.close();} catch (Exception e) {e.printStackTrace();}} /*** * @Description byte数组转换为无符号short整数* @param bytes* @param off* @return** @author wjggwm* @data 2017年2月7日 上午11:05:58*/public static int byte2ToUnsignedShort(byte[] bytes, int off) {// 注意高位在后面,即大小端问题int low = bytes[off];int high = bytes[off + 1];return (high << 8 & 0xFF00) | (low & 0xFF);} /*** * @Description byte数组转换为int整数* @param bytes* @param off* @return** @author wjggwm* @data 2017年2月7日 上午11:07:23*/public static int byte4ToInt(byte[] bytes, int off) {// 注意高位在后面,即大小端问题int b3 = bytes[off] & 0xFF;int b2 = bytes[off + 1] & 0xFF;int b1 = bytes[off + 2] & 0xFF;int b0 = bytes[off + 3] & 0xFF;return (b0 << 24) | (b1 << 16) | (b2 << 8) | b3;}}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。