![](/img/trans.png)
[英]What's the C++ equivalent to Java's java.io.FileInputStream.read()?
[英]How to resolve java.io.IOException: Read error at java.io.FileInputStream.read(Native Method)?
我收到以下錯誤,
java.io.IOException: Read error
at java.io.FileInputStream.read(Native Method) at
com.sun.org.apache.xerces.internal.impl.XMLEntityManager$RewindableInputStream.read(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLEntityManager.setupCurrentEntity
(Unknown Source) at com.sun.org.apache.xerces.internal.impl.XMLVersionDetector.determineDocVersion (Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(Unknown Source)
at javax.xml.parsers.DocumentBuilder.parse(Unknown Source)
at com.example.TestIntegrate.execute(TestIntegrate.java:71)
at com.example.TestIntegrate.main(TestIntegrate.java:42)
這是我的代碼:
public class TestIntegrate {
private Document doc = null;
public static void main(String[] args) {
FileInputStream fin;
try {
fin = new FileInputStream("C:/Users/xyz/workspace/TEST_2.xml");
FileOutputStream fout = new FileOutputStream("C:/Users/xyz/workspace/OutputFile.xml");
TestIntegrate t = new TestIntegrate();
t.execute(fin, fout);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void execute(InputStream sourceFile, OutputStream targetFile) //throws StreamTransformationException
{
BufferedReader reader;
OutputStreamWriter writer;
try{
// creating the parser object
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
String line = "<Tax>";
String line1 = "</Tax>";
String currentLine;
reader = new BufferedReader(new InputStreamReader(sourceFile));
writer =new OutputStreamWriter(targetFile);
dbFactory.setNamespaceAware(true);
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
while ( (currentLine = reader.readLine() ) != null){
String trimmedLine = currentLine.trim();
if(trimmedLine.equals(line) || trimmedLine.equals(line1) ) continue;
writer.write(currentLine + System.getProperty("line.separator"));
}
reader.close();
writer.close();
doc = dBuilder.parse(sourceFile);
writeOutputfile(doc,targetFile);
} catch (Exception e) {
e.printStackTrace();
}
}
private void writeOutputfile(Document doc,OutputStream targetFile) {
try {
TransformerFactory transformFactory = TransformerFactory.newInstance();
DOMSource source = new DOMSource(doc);
Transformer transformer;
transformer = transformFactory.newTransformer();
Writer outWriter = new StringWriter();
StreamResult result = new StreamResult(targetFile);
transformer.transform(source,result);
}
catch (TransformerException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
我要做的過程是:
1)從源位置讀取文件..(這里我僅使用main()進行測試)
2)刪除源文件中的<Tax>
和</Tax>
節點。
3)將文件寫入目標位置。
XML文件:
<!-- language: lang-xml -->
<?xml version="1.0" encoding="UTF-8"?>
<School>
<SSLC>
<name />
<rollno />
</SSLC>
<Tax>
<first_pu>
<name />
<rollno />
</first_pu>
<second_pu>
<name />
<rollno />
</second_pu>
</Tax>
<Tax>
<first_pu>
<name />
<rollno />
</first_pu>
<second_pu>
<name />
<rollno />
</second_pu>
</Tax>
<Tax>
<first_pu>
<name />
<rollno />
</first_pu>
<second_pu>
<name />
<rollno />
</second_pu>
</Tax>
</School>
請告訴我解決此問題的方法。
提前致謝..
更新根據新要求:
您需要解析XML文檔並獲取所有這些“稅”標簽。 然后,您需要收集其子元素並將其附加到Tax的父元素。 然后,刪除“稅收”標簽。 外觀應如下所示(已通過給定文檔進行了測試):
public static void execute(InputStream in, OutputStream out) {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
Document doc = null;
try {
doc = factory.newDocumentBuilder().parse(in);
} catch (SAXException | IOException | ParserConfigurationException e) {
e.printStackTrace();
}
NodeList nodes = doc.getElementsByTagName("Tax");
List<Node> nodesToRemove = new LinkedList<>();
for (int i = 0; i < nodes.getLength(); i++) {
Node node = nodes.item(i);
nodesToRemove.add(node);
List<Node> nodesToMove = new LinkedList<>();
for (int j = 0; j < node.getChildNodes().getLength(); j++) {
nodesToMove.add(node.getChildNodes().item(j));
}
for (Node childNode : nodesToMove) {
node.removeChild(childNode);
node.getParentNode().appendChild(childNode);
}
}
for (Node n : nodesToRemove) {
n.getParentNode().removeChild(n);
}
doc.normalize();
Transformer tf = null;
try {
tf = TransformerFactory.newInstance().newTransformer();
} catch (TransformerConfigurationException | TransformerFactoryConfigurationError e) {
e.printStackTrace();
}
tf.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
tf.setOutputProperty(OutputKeys.INDENT, "yes");
tf.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");
try {
tf.transform(new DOMSource(doc), new StreamResult(out));
} catch (TransformerException e) {
e.printStackTrace();
}
}
您只需要在輸入XML文檔的開頭放置<?xml ... ?>
。 否則會出現Error: The processing instruction target matching “[xX][mM][lL]” is not allowed
。
舊:
當您關閉InputStream
的BufferedReader
,它是問題所在(第69,70行)。
不要在BufferedReader
上調用close()
,因為它會關閉其下的所有系統句柄和文件(請參閱Javadoc中的BufferedReader close()
方法 )。
同樣適用於OutputStreamWriter
。
而不是reader.close()
,應該調用reader.reset()
。 這是因為您已經讀取了文件,並且有一個內部游標指向最后的讀取位置,並且將根據新的讀取請求為您提供下一個后續數據,並將其向前移動。
您已經在編寫新的XML,因此不需要writeOutputfile方法。 只需刪除方法並更新您的execute方法,如下所示:
public void execute(InputStream sourceFile, OutputStream targetFile) //throws StreamTransformationException
{
BufferedReader reader;
OutputStreamWriter writer;
try{
// creating the parser object
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
String line = "<Tax>";
String line1 = "</Tax>";
String currentLine;
reader = new BufferedReader(new InputStreamReader(sourceFile));
writer =new OutputStreamWriter(targetFile);
dbFactory.setNamespaceAware(true);
while ( (currentLine = reader.readLine() ) != null){
String trimmedLine = currentLine.trim();
if(trimmedLine.equals(line) || trimmedLine.equals(line1) ) continue;
writer.write(currentLine + System.getProperty("line.separator"));
}
reader.close();
writer.close();
} catch (Exception e) {
e.printStackTrace();
}
}
編輯:您還可以使用DOM解析器解析源文件,操作DOM並將其寫回到新文件中:
public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException, TransformerException {
try {
TestIntegrate t = new TestIntegrate();
t.execute("C:/Users/xyz/workspace/TEST_2.xml", "C:/Users/xyz/workspace/OutputFile.xml");
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void execute(String sourceFile, String targetFile) throws ParserConfigurationException, SAXException, IOException, TransformerException
{
//Parse the source xml file
File source = new File(sourceFile);
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse(source);
doc.getDocumentElement().normalize();
NodeList taxNodes = doc.getElementsByTagName("Tax");
//Loop through tax nodes and move inner nodes => start at the end as we remove the tax nodes afterwards
for(int i = taxNodes.getLength() - 1; i > -1; i--)
{
Element taxNode = (Element) taxNodes.item(i);
Node parent = taxNode.getParentNode();
while (taxNode.hasChildNodes())
{
parent.insertBefore(taxNode.getFirstChild(), taxNode);
}
taxNodes.item(i).getParentNode().removeChild(taxNodes.item(i));
}
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
DOMSource domSource = new DOMSource(doc);
StreamResult result = new StreamResult(new File(targetFile));
transformer.transform(domSource, result);
}
http://www.java2s.com/教程/Java/0440__XML/thevelement.html
http://www.mkyong.com/java/how-to-read-xml-file-in-java-dom-parser/
EDIT2:使用InputStream和OutputStream(示例)...
public void execute(InputStream sourceFile, OutputStream targetFile) throws StreamTransformationException
{
//Parse the source xml file
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = null;
try
{
dBuilder = dbFactory.newDocumentBuilder();
}
catch (ParserConfigurationException e)
{
throw new StreamTransformationException(e);
}
Document doc = null;
try
{
doc = dBuilder.parse(sourceFile);
}
catch (SAXException e)
{
throw new StreamTransformationException(e);
}
catch (IOException e)
{
throw new StreamTransformationException(e);
}
doc.getDocumentElement().normalize();
NodeList taxNodes = doc.getElementsByTagName("Tax");
//Loop through tax nodes and move inner nodes => start at the end as we remove the tax nodes afterwards
for(int i = taxNodes.getLength() - 1; i > -1; i--)
{
Element taxNode = (Element) taxNodes.item(i);
Node parent = taxNode.getParentNode();
while (taxNode.hasChildNodes())
{
parent.insertBefore(taxNode.getFirstChild(), taxNode);
}
taxNodes.item(i).getParentNode().removeChild(taxNodes.item(i));
}
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = null;
try
{
transformer = transformerFactory.newTransformer();
}
catch (TransformerConfigurationException e)
{
throw new StreamTransformationException(e);
}
DOMSource domSource = new DOMSource(doc);
StreamResult result = new StreamResult(targetFile);
try
{
transformer.transform(domSource, result);
}
catch (TransformerException e)
{
throw new StreamTransformationException(e);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.