读取文件为字节流并保存到xml中

两个不同的服务进行交互数据的时候,常常用的协议格式都是xml,但是xml也常会碰到这样那样的问题,比如今天我就碰到了两个问题,xml中会对”<” 和 “&”解析出错,这是众所周知的。今天要做的问题呢就是在xml协议中嵌套一个文件,即:将文件读成byte[]数组然后添加到协议中传给别人,这个时候呢是实现不了的,因为在协议的其他部分都是string,两者结合在一块就会把byte[]转换为string,这个时候问题就出现了。文件中如果出现”<” 和 “&”时就会报错了,但是又不能对文件中的内容中的这些值进行转义,因为如果是pdf等其他格式时就会出现问题。然后用cdata标签,就可以轻松避免转义了。其格式如下:

<question_file><![CDATA[文件内容]]</question_file>

在读取pdf格式文件读成字节流,再用new String的方式写入到新的文件中时发现写入文件大小是正确的,但是文件内容却是空白的,这个感觉是字节流转换为字符串的时候,截取的位置或者是长度不正确,必须用字节流才行,所以才协议中new string也不行。这个时候要将byte[]的格式保持不变的情况下,在协议中传过去的方法就是,用base64对字节流重新编码生成新的字符串就可以了,然后就方便很多了。

base64将字节数组转换为string的方法如下:

public static String encodeToString(byte[] bytes)  {

return new String(Base64.encode(bytes));

}

然后为什么base64编码之后就可以保持原有流的正确可以直接生成正确的文件呢?base64真的有这么神奇?虽然一直用它,也看过它的编码规则,但是还是不明白其中的原因。

 

协议组织代码:

public static String getDszxXmlFromVo(DszxNrVo vo) {

StringBuffer xml = new StringBuffer(DszxConstants.XML_HEADER);

xml.append(“<file><![CDATA[“).append(Base64.encodeToString(vo.getQuestionAppendix())).append(“]]></file>”);

xml.append(DszxConstants.XML_HEADER_ROOT_END);

return xml.toString();

}

张贴在未分类

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注