【问题标题】:Java- using an InputStream as a FileJava- 使用 InputStream 作为文件
【发布时间】:2012-12-19 14:13:25
【问题描述】:

我正在尝试使用 JODConverter 从上传的“.docx”文件生成 PDF 文档。 对生成 PDF 的方法的调用是这样的:

File inputFile = new File("document.doc");
File outputFile = new File("document.pdf");

// connect to an OpenOffice.org instance running on port 8100
OpenOfficeConnection connection = new SocketOpenOfficeConnection(8100);
connection.connect();

// convert
DocumentConverter converter = new OpenOfficeDocumentConverter(connection);
converter.convert(inputFile, outputFile);

// close the connection
connection.disconnect();

我正在使用 apache commons FileUpload 来处理 docx 文件的上传,我可以从中获取 InputStream 对象。我知道Java.io.File 只是对系统中文件的抽象引用。

我想避免磁盘写入(将 InputStream 保存到磁盘)和磁盘读取(读取 JODConverter 中保存的文件)。

有什么方法可以获取引用输入流的 File 对象?任何其他避免磁盘 IO 的方法也可以!

编辑:我不在乎这是否会最终使用大量系统内存。该应用程序将托管在并行用户数量很少甚至为零的 LAN 上。

【问题讨论】:

  • 您能说说您是如何为 XHTML(.html) 和 MS word 2003(.doc) 编写 DocumentFormat(s) 的吗?

标签: java file jakarta-ee inputstream


【解决方案1】:

commons fileupload 可能已经将上传内容写入文件系统。

检查您的 FileItem 是否是 DiskFileItem 的实例。如果是这种情况,DiskFileItem 的写入实现将尝试将文件移动到您传递的文件对象。由于写入已经发生,因此您不会导致任何额外的磁盘 io。

【讨论】:

  • 不,commons fileupload 为您提供了获取流的选项。检查:link
  • 我指的是 write() 调用。在 DiskFileItem 实现中,它会将临​​时文件重命名为另一个文件 (commons.apache.org/fileupload/apidocs/src-html/org/apache/…)。我的观点是,high commons fileupload 很可能已经做了磁盘 IO 来将传入的流写入临时文件。
  • 哦。谁会想到:|。猜你是对的。我会再看一遍然后回来。感谢您的意见:)
  • 首先为这个想法 +1。并检查this 它实际上比我想象的要复杂一些。有一个动态阈值,超过该阈值文件将被写入磁盘。但在我的情况下,它将是小文件,所以它并不重要。
【解决方案2】:

基于文件的转换比基于流的转换更快(由StreamOpenOfficeDocumentConverter 提供),但它们需要 OpenOffice.org 服务在本地运行并且对文件具有正确的权限。

尝试doc 以避免磁盘写入:

convert(java.io.InputStream inputStream, DocumentFormat inputFormat, java.io.OutputStream outputStream, DocumentFormat outputFormat) 

【讨论】:

  • 哇!你先生,让我开心!谢谢!想知道为什么你没有在他们的网站上详细说明这一点。
【解决方案3】:

没有办法做到这一点并使代码可靠。其一,.convert() 方法只接受两个Files 作为参数。

因此,这意味着您必须扩展 File,这在理论上是可能的,但 非常 脆弱,因为您需要深入研究库代码,它可以在随时让你的扩展类失效。

(当然,如果您使用 RAM 支持的文件系统并从该文件系统读/写,一种方法可以避免磁盘写入)

【讨论】:

  • 感谢您的回复,但我确实需要这样做:(!如果没有其他办法,那么我在考虑 RAM 驱动器。
  • @viswa:那么,RAM 驱动器就是这样。相信我,你真的不想这样做。您的代码充其量是脆弱的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-07
  • 1970-01-01
  • 2014-10-29
  • 2016-10-06
  • 2016-03-19
相关资源
最近更新 更多