1. ホーム
  2. java

[解決済み] Premature end of file(ファイルの早期終了)」というエラーが発生するのはなぜですか?

2022-02-02 15:37:47

質問

をパースしようとしています。 XML response しかし、私は惨めに失敗しています。私は最初 その xml がレスポンスで返されないだけなので、以下のようなコードを作成し、私の xml ファイルをオンラインで表示します。を印刷することができます。 XML を問題なく画面に表示することができます。しかし、parseメソッドを呼び出すと、次のようになります。 ファイルの早期終了。

URLを直接渡すとうまくいくのですが。

  • builder.parse("");

が、InputStreamを渡すと失敗する。

  • builder.parse(connection.getInputStream());

      try {
        URL url = new URL(xml);
        URLConnection uc =  url.openConnection();
        HttpURLConnection  connection = (HttpURLConnection )uc;
    
        connection.setDoInput(true);
        connection.setDoOutput(true);
    
        InputStream instream;
        InputSource source;
        //get XML from InputStream
        if(connection.getResponseCode()>= 200){
            connection.connect();       
            instream = connection.getInputStream();         
            parseDoc(instream);     
        }
        else{
            instream = connection.getErrorStream();
        }
    
    
    } catch (MalformedURLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (ParserConfigurationException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (SAXException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    
    
    
     static void parseDoc(InputStream instream) throws ParserConfigurationException,
     SAXException, IOException{
    
    
      BufferedReader buff_read = new BufferedReader(new InputStreamReader(instream,"UTF-8"));
        String  inputLine = null;
    
        while((inputLine = buff_read.readLine())!= null){
            System.out.println(inputLine);
        }
    
      DocumentBuilderFactory factory =DocumentBuilderFactory.newInstance();
      factory.isIgnoringElementContentWhitespace();
      DocumentBuilder builder = factory.newDocumentBuilder();
      Document doc = builder.parse(instream);
    }
    
    

私が受けているエラー

    [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(Unknown Source)
    at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(Unknown Source)
    at javax.xml.parsers.DocumentBuilder.parse(Unknown Source)
    at com.ameba.api.network.MainApp.parseDoc(MainApp.java:78)
    at com.ameba.api.network.MainApp.main(MainApp.java:41)

解決方法は?

こんなときは

while((inputLine = buff_read.readLine())!= null){
        System.out.println(inputLine);
    }

インスタンスストリームですべてを消費するので、インスタンスストリームは空です。 さて、これを実行しようとすると

Document doc = builder.parse(instream);

空のストリームを渡したので、パースに失敗します。