我试图使用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中读取保存的文件)。
是否有任何方法我可以得到一个文件对象引用输入流?任何其他避免磁盘IO的方法都可以!
编辑:我不在乎这是否会最终使用大量的系统内存。该应用程序将被托管在一个并行用户数量很少甚至为零的局域网上。
基于文件的转换比基于流的转换(由StreamOpenOfficeDocumentConverter提供)要快,但它们需要OpenOffice.org服务在本地运行,并且对文件具有正确的权限。
尝试doc以避免磁盘写入:
convert(java.io.InputStream inputStream, DocumentFormat inputFormat, java.io.OutputStream outputStream, DocumentFormat outputFormat)
没有办法做到这一点,使代码坚实。例如,.convert()
方法只接受两个File
作为参数。
因此,这意味着您必须扩展File
,这在理论上是可能的,但是非常脆弱,因为您需要深入研究库代码,这些代码可以随时更改并使您扩展的类失去功能。
(当然,如果您使用ram支持的文件系统并从该文件系统读写,那么是一种避免磁盘写入的方法)
很可能commons fileupload已经将上传内容写入了文件系统。
检查FileItem是否为DiskFileItem的实例。如果是这种情况,DiskFileItem的写入实现将尝试将文件移动到您传递的文件对象中。因为写操作已经发生了,所以不会造成任何额外的磁盘io。