JAvaはzipドキュメントを解析し、zipでxmlとhtmlドキュメントのストリームを解析する方法を解決します.

3175 ワード

プロジェクトでは、次のような問題が発生しました.
Javaでzipドキュメントを解析する(zipドキュメントのテキスト内容を抽出する)場合、zipドキュメントにxmlまたはhtmlドキュメントがある場合、その中のxmlまたはhtmlドキュメントを解析した後、次のgetNextEntry()を行うと異常が放出されます.コードは次のとおりです.
import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.io.IOException; 
import java.io.InputStream; 
import java.util.zip.ZipEntry; 
import java.util.zip.ZipInputStream; 

import XmlExtractBySAX.XmlExtractor; 

public class ZipExtract { 
public static void main(String[] args) { 
      ZipExtract zip = new ZipExtract(); 
     StringBuffer text = new StringBuffer(); 
     InputStream is; 
    try { 
       is = new FileInputStream("c://test.zip"); 
       int n = zip.getText(is,text); 
       System.out.println(text); 
     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } 
} 
/** 
* 
* @param is 
* @param text 
* @return 
*/ 

private int getText(InputStream is, StringBuffer text) { 
     ZipInputStream zipis = new ZipInputStream(is); 
    ZipEntry zipEntry = null; 
    try { 
          while((zipEntry = zipis.getNextEntry())!= null) { 
          //       
        if(zipEntry.isDirectory()) { 
        continue; 
    } 
    //       
    String fileName = zipEntry.getName(); 
    //      ,       xml    
    String fileType = fileName.substring(fileName.indexOf('.')); 
    if(fileType.equalsIgnoreCase(".xml")) { 
         XmlExtractor xml = new XmlExtractor(); 
         xml.getText(zipis,text); 
   } 
} 
} catch (IOException e) { 
   e.printStackTrace(); 
} 
return 0; 
} 
} 

エラー:
java.io.IOException: Stream closed 
at java.util.zip.ZipInputStream.ensureOpen(Unknown Source) 
at java.util.zip.ZipInputStream.getNextEntry(Unknown Source) 
at ZipExtractByJDK.ZipExtract.getText(ZipExtract.java:39) 
at ZipExtractByJDK.ZipExtract.main(ZipExtract.java:19) 

追跡ストリームを表示すると、zipストリームのパラメータがxmlを解析するparser関数またはhtmlを解析するparser関数を呼び出すとclosedがfalseからtrueに変化することが分かった.この問題は,私を長い間片づけた.ネットでもいろいろ調べました.名堂も見つからなかった.
最近、私のアーキテクチャの指導の下で、この問題は解決されました.
解決策はxmlとhtmlファイルに遭遇したときにzipストリームを分けて、自分もjavaのapiを調べて解析器クラスParserクラスのストリームのように一度しか使えないのを見て、再利用できないのですが、具体的な原因はまだ分かりません.
次は私が流れを分離する方法です.
//新しいストリームクラスを定義し、InputStreamストリームの抽象メソッドread()を書き換える.
class XmlInputStream extends InputStream{

InputStream inputStream = null;

public class XmlInputStream(InputStream is){

     this.inputStream = is;

}

//  InputStream     

   public int reade(){

      retrun inputStream.read();

   }

}

ストリームセクションを置換するには、次の手順に従います.
 if(fileType.equalsIgnoreCase(".xml")) {   
        XmlExtractor xml = new XmlExtractor();   
         xml.getText(new XmlInputStream(zipis),text);   
   } 

 
このようにXmlドキュメントまたはhtmlドキュメントを解析するときに閉じられるのは、ZipInputStreamストリームではなくXmlImputStreamストリームだけです.これにより、Stream Close異常は発生しません.問題は解決され、xmlまたはhtmlドキュメントに遭遇したときにzipストリームを使用してこの新しいXmlInputStreamストリームのオブジェクトを定義します.
この新しいxmlドキュメントとhtmlドキュメントに伝わる解析クラスを使用します.
xmlやhtmlドキュメントの解析が完了すると、この新しい定義のストリームは使用できませんが、元のzipストリームはまだ使用できます.これで私たちの目的を達成しました.では、このプロジェクトの問題は解決しました.