最近在项目中遇到了将二进制图片文件封装为XML格式的要求。最初的设想是将二进制文件转换为String类型封装在XML中。
编写代码时发现,将二进制数据文件直接转换为String类型封装到XML中时,无法解析XML文件,因为图片String中有大量的特殊字符。
最后只能使用GOOGLE, 发现可以采用base64编码的方式将二进制图片文件转换String类型.
参考了:
http://blog.sina.com.cn/s/blog_674bc8f90100o3e5.html 的实现将其转换成功并且封装为格式.
进行相应的测试后,发现解析后的图片格式无法显示数据,使用工具打开图片文件时,显示文件数据丢失。
百思不得其解,再次GOOGLE,这次就不太容易了,早了半天也没有解决,一个偶然的机会采用了axis.jar包中的Base64工具类进行base64编码,解码,测试成功
回个头来,单独用jdk提供的base64编码工具类进行数据操作,发现编码,解码没有问题
进行debug调试,开始也没有发现问题。一个偶然的机会发现base64编码后的数据是有换行符的,二生成的xml数据后,换行符被转换为了空格.
立马进行调试
new BASE64Decoder().decodeBuffer(content1.replaceAll(" ", "\n"));
测试通过,问题出在dom4j将\n转换为了" “ 导致jdk的BASE64解码操作出错。
用google查了一下dom4j将\n转换为" "的问题,.
dom4j是可以避免转换的,方法如下:
OutputFormat format = new OutputFormat("", true);
format.setEncoding("UTF-8");
//xml输出器
StringWriter out = new StringWriter();
XMLWriter xmlWriter = new XMLWriter(out, format);
try {
xmlWriter.write(doc);
xmlWriter.close();
} catch (IOException e) {
e.printStackTrace();
}
return out.toString();
将document对象转换为xml字符串时,不会讲\n转换为空格
File file = new File("D:/Demo/WEBSERVICE.jpg");
InputStream in = new FileInputStream(file);
byte[] buffer = new byte[in.available()];
int i = 0;
i=in.read(buffer);
String a = new BASE64Encoder().encode(buffer);
byte[] bytes = new BASE64Decoder().decodeBuffer(content1);
FileOutputStream out = new FileOutputStream("D:/Demo/WEBSERVICE1.jpg");
out.write(bytes);
out.close();