簡體   English   中英

如何解決java.io.IOException:在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


舊:

當您關閉InputStreamBufferedReader ,它是問題所在(第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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM