2014-10-20 12 views
0

아파치 tika 라이브러리를 사용하여 파일을 텍스트로 변환하는 동안 parser.parse() 메소드에 입력 스트림으로 파일을 전달 중입니다. 입력 스트림은 finally 블록에서 성공적으로 닫힙니다. 그런 다음 파일의 이름을 바꾸는 동안 java.io의 File.renameTo 메서드는 false를 반환합니다. inputStream을 성공적으로 닫음에도 불구하고 파일의 이름을 바꾸거나 이동할 수 없습니다. parser.parse() 메서드는 시간이 예외가 throw 될 때까지 닫히지 않는 파일을 처리하는 동안 나는 파일의 다른 인스턴스가 생성되는 것이 두렵다. 그게 가능하니? 그렇다면 파일의 이름을 바꾸려면 어떻게해야합니까?아파치 tika를 사용하는 동안 java를 사용하여 파일을 이동할 수 없습니다.

콘텐츠 유형을 확인하면서 던진 예외는

java.lang.NoClassDefFoundError: Could not initialize class com.adobe.xmp.impl.XMPMetaParser 
at com.adobe.xmp.XMPMetaFactory.parseFromBuffer(XMPMetaFactory.java:160) 
at com.adobe.xmp.XMPMetaFactory.parseFromBuffer(XMPMetaFactory.java:144) 
at com.drew.metadata.xmp.XmpReader.extract(XmpReader.java:106) 
at com.drew.imaging.jpeg.JpegMetadataReader.extractMetadataFromJpegSegmentReader(JpegMetadataReader.java:112) 
at com.drew.imaging.jpeg.JpegMetadataReader.readMetadata(JpegMetadataReader.java:71)  
at org.apache.tika.parser.image.ImageMetadataExtractor.parseJpeg(ImageMetadataExtractor.java:91) 
at org.apache.tika.parser.jpeg.JpegParser.parse(JpegParser.java:56) 
at org.apache.tika.parser.CompositeParser.parse(CompositeParser.java:244) 
at org.apache.tika.parser.CompositeParser.parse(CompositeParser.java:244) 
at org.apache.tika.parser.AutoDetectParser.parse(AutoDetectParser.java:121) 

어떤 솔루션을 제안하십시오입니다. 미리 감사드립니다. 때문에 다른 프로세스에

public static void main(String args[]) 
 
\t { 
 
\t \t InputStream is = null; 
 
\t \t StringWriter writer = new StringWriter(); 
 
\t \t Metadata metadata = new Metadata(); 
 
\t \t Parser parser = new AutoDetectParser(); 
 
\t \t File file = null; 
 
\t \t File destination = null; 
 
\t \t try 
 
\t \t { 
 
\t \t \t file = new File("E:\\New folder\\testFile.pdf"); 
 
\t \t \t boolean a = file.exists(); 
 
\t \t \t destination = new File("E:\\New folder\\test\\testOutput.pdf"); 
 
\t \t \t is = new FileInputStream(file); 
 
\t \t \t parser.parse(is, new WriteOutContentHandler(writer), metadata, new ParseContext()); //EXCEPTION IS THROWN HERE. 
 
\t \t \t String contentType = metadata.get(Metadata.CONTENT_TYPE); 
 
\t \t \t System.out.println(contentType); 
 
\t \t \t 
 
\t \t } 
 
\t \t catch(Exception e1) 
 
\t \t { 
 
\t \t \t e1.printStackTrace(); 
 
\t \t } 
 
\t \t catch(Throwable t) 
 
\t \t { 
 
\t \t \t t.printStackTrace(); 
 
\t \t } 
 
\t \t finally 
 
\t \t { 
 
\t \t \t try 
 
\t \t \t { 
 
\t \t \t \t if(is!=null) 
 
\t \t \t \t { 
 
\t \t \t \t \t is.close(); //CLOSES THE INPUT STREAM 
 
\t \t \t \t } 
 
\t \t \t \t writer.close(); 
 
\t \t \t } 
 
\t \t \t catch(Exception e2) 
 
\t \t \t { 
 
\t \t \t \t e2.printStackTrace(); 
 
\t \t \t } 
 
\t \t \t 
 
\t \t } 
 
\t \t boolean x = file.renameTo(destination); //RETURNS FALSE 
 
\t \t System.out.println(x); 
 
\t }

+1

종속성이 누락 된 것처럼 보입니다. stacktrace는 이동하려는 시도가 아니라 Tika 구문 분석 중에 오류를 표시합니다. 그 클래스와 항아리가 클래스 패스에 있는지 확인하십시오. – cjstehno

+0

소스 코드를 게시 할 수 있다면 다른 사람들이 문제를 분석하는 데 도움이됩니다 .. – CuriousMind

+0

코드를 추가했습니다. 어떤 해결책을 제안하십시오. –

답변

0

이 될 수 은 여전히 ​​안티 바이러스 프로그램처럼 파일을 사용하고 또한 응용 프로그램의 다른 프로세스가 잠금을 보유 할 수있는 경우가있다. 그 것을 확인하고 처리하십시오. 문제가 해결 될 수 있습니다.

+0

예. 이것이 이유 일 수 있지만 file.renameTo()가 false를 반환하는 동안 file.delete() 메서드가 동일한 파일에 대해 true를 반환합니다. –