2012-11-15 3 views
0
public static String getTextOf(String xsl) throws Exception { 
     DocXHandler docxh1 = new DocXHandler(ACE.getInputFilePath()); 
     InputStream inputDocumentXMLStream = docxh1.getInputDocumentXMLZERO(); 
    return new Cache().getXSLOutput(inputDocumentXMLStream, xsl); 
} 

위의 방법은 다른 xsl 인수로 100 회 이상 호출됩니다. 이제는 InputStream inputDocumentXMLStream에 값이 할당 될 때마다 (예 : 100 회 이상). 내가 전역 속성으로 inputDocumentXMLStream을 변경하여왜 InputStream을 재사용 할 수 없습니까?

public static String getTextOf(String xsl) throws Exception { 
    return new Cache().getXSLOutput(inputDocumentXMLStream, xsl); 
    } 

, 한 번만의 InputStream가 value.My 코드가 지금과 같이되었다 할당됩니다 같은 방법으로이 코드를 리팩토링하는 것을 시도하고있다. 그래서 전화 나 어떻게 다시 읽고,

Unexpected end of ZLIB input stream 

를 처음 내가 올바른 결과를 얻고있다하지만 두 번째로 나는 아래의 오류?

답변

1

증기의 끝까지 도달 한 후 입력 스트림을 읽는 것은 한 방향으로 만 진행되므로 다시 시작할 수 없습니다.

난 당신의 문제를 해결하기위한 최선의 생각은 XML 파일을 완전히 구문 분석하고 일부 Java 객체에 값을 배치하는 것입니다. 완료되면지도를 사용하여 필요한 값을 검색하기 만하면됩니다. 이것도 훨씬 효율적입니다.

Object parseValueMap = paseXML(inputDocumentXMLStream);//use appropriate object 
    //^ called only once, you may use some libraries such as JAXB to parse the xml 

경로 표현 xsl을한다 가정하면, 위의 단계에서 만든 자바 컬렉션의 경로를 적용 할 수 있습니다. JXPath과 같은 라이브러리를 다음과 같이 사용할 수 있습니다.

 String value = JXPathEvaluator(parseValueMap, xsl); 

희망이 있습니다.

+1

@Kate : 도움이 될 것입니다. 나는 동일한 파일을 반복해서 읽는 것과 비교하여 프로그래밍에 약간의 노력이 있다는 것을 이해합니다. 하지만 일단 끝나면 훨씬 나아 졌다고 생각합니다. –

+1

@Kate 조언은'Map'에서'InputStream'을 저장하는 것이 아닙니다 (이것은 정말 나쁜 접근입니다).파일을 열어 ('InputStream' 등으로) 파일을 구문 분석하여 파일의 메모리 내 표현을 작성하고이 구조를 통해 액세스 및 탐색을 용이하게하는 메소드를 가져야합니다. –

+0

@LuiggiMendoza : 이미 언급했는데 특정 Java 객체를 사용하도록 조언하지 않았습니다. 한 번 파일을 구문 분석하고 파싱 된 개체를 다시 사용한다는 생각을 공유하려고합니다. 다른 건 없어. 희망이 명확하게. –

2

한 번만 스트림을 읽을 수 있으며 오류 메시지에 EOF가 표시됩니다. 당신이하려는 것은 의미가 없습니다.

0

입력 스트림을 닫지 않고 파일 전체에서 다시 사용할 수 없습니다. 모든 파일 입출력 기능은 EOF를 사용하여 중지합니다.

0

각 xls 파일에 대해 파일을 구문 분석하고 Java의 Excel 문서 인스턴스를 만들어야합니다. Java 인스턴스가 InputStream을 제공합니다. 이 경우에 당신을위한 탈출구는 없습니다.

동일한 파일의 경우 동일한 InputStream을 사용할 수 있습니다. 그리고 그것은 하나의 단위 또는 일이 될 것입니다.

+0

실례합니다. 'xls'의 'xslt', 스타일 시트 파일 ... – Linda

1

난 당신이 getXSLOutput에서 무엇을하고 있는지 잘 모르겠어요과 같은의 InputStream을 읽을 필요가 왜 당신이 당신의 getXSLOutput 방법에 스트림의 시작을 표시하기 위해 mark(int)를 사용하고에 reset를 호출 할 수 있습니다 EOF 그러나 100 번 피하기 위해 같은 방법의 끝. 그래도 잘못된 일처럼 보입니다 ...

더 나은 결과를 얻으려면 한 번 읽고 데이터 유형 inJava에 내용을 저장 한 다음 100 번 작업하십시오.

+0

@ ramsinb - 나는 mark (0) 및 reset()을 시도하고 'java.io.IOException : mark/reset not supported'를 얻었다. – Linda

+0

이것은'DocXHandler.getInputDocumentXMLZERO'에 의해 반환 된'InputStream'의 구현이'mark' 또는'reset' 메소드를 구현하지 않는다는 것을 암시합니다. 그러므로이 접근법은 작동하지 않을 것입니다. Java 데이터 구조를 채우고 100 개의 메소드 호출에서이를 사용하는 대안을 찾아야합니다. – ramsinb

+0

@ ramsinb- 코멘트 주셔서 감사합니다, 나는 이것을 의지하고있었습니다. – Linda

관련 문제