0

Oracle 11gデータベースを使用しており、データベースからの形式でファイルjdk1.6.0_45 をフェッチしようとしています。オブジェクトを解析し、コンソールに出力コンテンツを書き込もうとしています。これが私のコードスニペットです-xmlblobDOM parserblob

String outputFile = "C:\\DEVELOPMENT_PROJECTS\\result1.xml";
String myDocId = "12345";

java.sql.PreparedStatement pstmt = connection.prepareStatement("SELECT * FROM my_document WHERE my_doc_id = '" + myDocID + "'"); // connection is of type java.sql.Connection

java.sql.ResultSet rs = pstmt.executeQuery(); // always returns only one row.

rs.next();

java.sql.Blob blobObj = rs.getBlob("DOC_BLOB");

java.io.InputStream is = blobObj.getBinaryStream();

java.io.FileOutputStream fos = new FileOutputStream(outputFile);

while (((byte) is.read()) != -1) {
    fos.write((byte) is.read());
} // tried writing in output xml file too. this writes junk data into the output file

outputFromInputStream(is);

そして、これがstacktraceの例外です-

oracle.jdbc.driver.T4CConnection@19a32e0
[Fatal Error] :1:1: Premature end of file.
org.xml.sax.SAXParseException: Premature end of file.
    at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:246)
    at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:284)
    at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:124)
    at com.dummy.project.lang.DataTest.newDocumentFromInputStream(DataTest.java:197)
    at com.dummy.project.lang.DataTest.main(DataTest.java:75)
<?xml version="1.0" encoding="UTF-8" standalone="no"?>

XML ファイルの有効性を確認しました。最初の行の後に<?xml version="1.0" encoding="UTF-8" standalone="no"?>有効な<tag>

xmlただし、ドライブなどの物理的な場所からファイルを読み取りC:\、出力 xml に書き込むことはできます。これが私がやっている方法です(InputStreamデータのフェッチとその後の残りのステップが一般的であることを覚えておいてください)-

java.io.File file = new File("C:\\myLocalXMLFile.xml");

InputStream is = new FileInputStream(file);
outputFromInputStream(is);

使用される一般的な方法は次のとおりです-

private void outputFromInputStream(InputStream is) {
javax.xml.parsers.DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

javax.xml.parsers.DocumentBuilder builder = factory.newDocumentBuilder();

org.w3c.dom.Document doc = builder.parse(in); // Exception is thrown here

java.io.StringWriter sw = new StringWriter();

javax.xml.transform.dom.DOMSource domSource = new DOMSource(xmldom);

javax.xml.transform.stream.StreamResult streamResult = new StreamResult(sw);

javax.xml.transform.TransformerFactory tf = TransformerFactory.newInstance();

javax.xml.transform.Transformer transformer = tf.newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty(OutputKeys.DOCTYPE_PUBLIC, "yes");
transformer.setOutputProperty("http://xml.apache.org/xslt}indent-amount", "10");
transformer.transform(domSource, streamResult);
System.out.println(sw.toString());
}
4

1 に答える 1

0

何らかの理由で、次のコード スニペットが機能しました。

BufferedReader br = new BufferedReader(new InputStreamReader(is));
StringBuilder sb = new StringBuilder();
String line = null;
while ((line = br.readLine()) != null) {
    sb.append(line);
}
System.out.println(sb.toString());
于 2017-01-03T07:21:21.757 に答える