0

我将文件作为输入流传递给 parser.parse() 方法,同时使用 apache tika 库将文件转换为文本。该方法引发异常(如下所示),但输入流在 finally 块中成功关闭。然后在重命名文件时,java.io 中的 File.renameTo 方法返回 false。尽管成功关闭了 inputStream,但我无法重命名/移动文件。恐怕会创建另一个文件实例,而 parser.parse() 方法会处理该文件,直到抛出异常时该文件才会关闭。那可能吗?如果是这样,我应该怎么做才能重命名文件。

检查内容类型时抛出的异常是

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

4

1 回答 1

0

这可能是由于其他进程仍在使用该文件,例如防病毒程序,也可能是您的应用程序中的任何其他进程可能拥有锁定。请检查并处理它,它可能会解决您的问题。

于 2014-10-20T13:03:59.837 回答