XML에 파일을 쓰는 데 문제가 있습니다. 다음은이 요소가 xsd에서 어떻게 보이는지입니다. 여기 STAX를 사용하여 XML에 파일을 쓰는 방법은 무엇입니까?
<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의 내용은 유효 기본-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 고마워, ! 너는 최고야!
는'writeBinary'는 Woodstox STAX 구현에 고유의 방법이며, 같은 당신이 정말로 그것을를 사용하지 않아야합니다. 표준'XMLStreamWriter' 인터페이스를 고수하십시오. – skaffman
와우 감사합니다. 하지만 스트림에서 작성하는 방법은 무엇입니까? 'writeCharacters (char [] text, int start, int len)를 사용하여'??? – bunnyjesse112
예. XML은 문자 데이터만을 나타낼 수 있으므로, base64로 인코딩 된 바이너리 데이터를 문자 데이터로 쓰려면 직접 인코딩해야합니다. Woodstox의'writeBinary'는 고성능 웹 서비스 지원 (예 : Fast Infoset)을위한 것으로, 실제로 무엇을하는지 모르는 경우에는 피해야합니다. – skaffman