我在将文件写入xml时遇到问题。 以下是此元素在xsd中的外观。
<xs:element name="File">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:base64Binary">
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
这是我写的方法:
private void writeFile (XMLStreamWriter2 sw, final InputStream is){
//is - inputstream from file
try {
OutputStream output = null;
InputStream input = new Base64InputStream(is, true);
int count;
int BUFFER_SIZE = 4000;
byte[] buffer = new byte[BUFFER_SIZE];
output = new FileOutputStream(new File("D:\\test.txt"));
while ((count = input.read(buffer)) != -1) {
output.write(buffer, 0, count);
sw.writeBinary(buffer, 0, count);
}
is.close();
input.close();
output.close();
} catch (XMLStreamException ex) {
Logger.getLogger(StaxFinal.class.getName()).log(Level.SEVERE, null, ex);
} catch (IOException ex) {
Logger.getLogger(StaxFinal.class.getName()).log(Level.SEVERE, null, ex);
}
}
test.txt的内容是有效的base-64字符串,而File
xml元素文件的内容不是(我正在检查http://www.opinionatedgeek.com/dotnet/tools/base64decode/)。为什么
修改
试图使用它,但我得到了很多回车符号#xd;
private void writeFile (XMLStreamWriter sw, InputStream is){
//is - FileInputStream
Reader reader = new InputStreamReader(new Base64InputStream(is, true));
char[] buf = new char[4096];
int n;
while( (n = reader.read(buf)) >= 0 ) {
sw.writeCharacters(buf, 0, n-3 );
}
}
修改 方法:
writeRaw(char[] chars, int i, int i1)
工作正常。奇怪,但woodstox的readElementAsBinary
为我读取和解码base64。为什么writeBinary
不能写有效的base64?
无论如何,谢谢你的skaffman!你太棒了!
答案 0 :(得分:1)
我假设你使用Apache Commons Codec的Base64InputStream。它还提供了一个带有四个参数的构造函数,可用于完全关闭换行符。 从您可以编写有效Base64输出的问题调整方法,如下所示:
private void writeFile (XMLStreamWriter sw, InputStream is){
//is - FileInputStream
Reader reader = new InputStreamReader(new Base64InputStream(is, true, -1, null));
char[] buf = new char[4096];
int n;
while( (n = reader.read(buf)) >= 0 ) {
sw.writeCharacters(buf, 0, n);
}
}
答案 1 :(得分:0)
基于Base64InputStream的javadoc:如果你为构造函数提供两个参数(InputStream in,boolean doEncode),那么它创建一个Base64InputStream,这样所有读取的数据都是Base64编码的或者是原始的Base64解码的提供InputStream。和 doEncode - 如果我们应该编码从我们读取的所有数据,则为true,如果我们应该解码,则为false。
因为我不确定你的功能应该做什么,所以我只能解决这个问题: