【问题标题】:Unable to move a file using java while using apache tika使用 apache tika 时无法使用 java 移动文件
【发布时间】:2014-12-15 11:06:39
【问题描述】:

我将文件作为输入流传递给 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);
	}

【问题讨论】:

  • 看起来您缺少依赖项 - 堆栈跟踪在 Tika 解析期间显示错误,而不是在尝试移动期间显示错误。确保你的类路径中有包含该类的 jar。
  • 如果能贴出源代码,帮助别人分析问题..
  • 我已经添加了代码。请提出任何解决方案。
  • file.delete() 方法为同一文件返回 true,而 file.renameTo() 返回 false。可能是什么原因。但在某些情况下,文件已成功重命名。是文件系统的问题吗?

标签: java java-io file-rename apache-tika file-moving


【解决方案1】:

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

【讨论】:

  • 是的,这可能是原因,但 file.delete() 方法对同一文件返回 true,而 file.renameTo() 返回 false
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多