JAvaはzipドキュメントを解析し、zipでxmlとhtmlドキュメントのストリームを解析する方法を解決します.
3175 ワード
プロジェクトでは、次のような問題が発生しました.
Javaでzipドキュメントを解析する(zipドキュメントのテキスト内容を抽出する)場合、zipドキュメントにxmlまたはhtmlドキュメントがある場合、その中のxmlまたはhtmlドキュメントを解析した後、次のgetNextEntry()を行うと異常が放出されます.コードは次のとおりです.
エラー:
追跡ストリームを表示すると、zipストリームのパラメータがxmlを解析するparser関数またはhtmlを解析するparser関数を呼び出すとclosedがfalseからtrueに変化することが分かった.この問題は,私を長い間片づけた.ネットでもいろいろ調べました.名堂も見つからなかった.
最近、私のアーキテクチャの指導の下で、この問題は解決されました.
解決策はxmlとhtmlファイルに遭遇したときにzipストリームを分けて、自分もjavaのapiを調べて解析器クラスParserクラスのストリームのように一度しか使えないのを見て、再利用できないのですが、具体的な原因はまだ分かりません.
次は私が流れを分離する方法です.
//新しいストリームクラスを定義し、InputStreamストリームの抽象メソッドread()を書き換える.
ストリームセクションを置換するには、次の手順に従います.
このようにXmlドキュメントまたはhtmlドキュメントを解析するときに閉じられるのは、ZipInputStreamストリームではなくXmlImputStreamストリームだけです.これにより、Stream Close異常は発生しません.問題は解決され、xmlまたはhtmlドキュメントに遭遇したときにzipストリームを使用してこの新しいXmlInputStreamストリームのオブジェクトを定義します.
この新しいxmlドキュメントとhtmlドキュメントに伝わる解析クラスを使用します.
xmlやhtmlドキュメントの解析が完了すると、この新しい定義のストリームは使用できませんが、元のzipストリームはまだ使用できます.これで私たちの目的を達成しました.では、このプロジェクトの問題は解決しました.
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ストリームはまだ使用できます.これで私たちの目的を達成しました.では、このプロジェクトの問題は解決しました.