itext库Document.add(Element element)方法返回true,并且在写入PDF文件时磁盘已满时不会抛出任何异常

时间:2015-08-22 18:46:11

标签: java itext

我使用itext java库生成PDF文件到Windows硬盘。 我正在使用的方法是

  

com.itextpdf.text.Document.add(元素元素)

此方法由多个线程调用(可配置)。 让我解释下面的一些示例数字正在发生的事情: 例如,我必须编写10个pdf文件,每个文件大小为100KB。所需的总大小为1000KB。硬盘中的可用空间为500KB。 发生了三件事:

  1. 当代码开始执行时,它最初创建一个100KB的文件。让我们说创建了2个文件,add()方法返回true,表示文件已成功创建(这是预期的行为)
  2. 然后它会创建一些50KB或60KB或40KB(某些数字小于实际大小)的不完整文件并抛出IOException。在这种情况下,我将文档标记为“不完整”,稍后当磁盘空间可用时,我会重写该文件。那时旧文件被新文件覆盖,新文件很完美。
  3. 现在,让我们说6个文件被写入,只留下4个文件(也可能是2个或3个)。在这种情况下,正在创建具有2KB或0KB或4KB的不完整文件,并且add()方法不会出现任何异常并返回“TRUE”(这意味着文件已成功写入)。这些文件已损坏。当磁盘空间可用时我无法重写,因为我被告知它已成功写入。
  4. 所以问题出在第三种情况。该方法最终会出现问题。在第二种情况下,它会抛出异常,因为它在第三种情况下会这样做。 我的代码编写了数千个文件,在生产中,为多个服务器配置了大量的线程。

    当有足够的磁盘空间可用时,此代码可以正常运行,而且在写入文件时磁盘空间耗尽时会出现问题。

    我使用的itext库版本是5.0.6。 有什么帮助吗?

1 个答案:

答案 0 :(得分:1)

OP在评论中澄清:

  

我的观点是,当磁盘写入尚未完成时,add方法返回true的原因是什么?

方法评论说:

/**
 * Adds an <CODE>Element</CODE> to the <CODE>Document</CODE>.
 *
 * @param element
 *            the <CODE>Element</CODE> to add
 * @return <CODE>true</CODE> if the element was added, <CODE>false
 *         </CODE> if not
 * @throws DocumentException
 *             when a document isn't open yet, or has been closed
 */

因此,根据文档,true仅表示该元素已添加到此Document实例本身,而不是光盘上的某个文件。

您肯定知道iText Document仅仅是已注册DocListener个实例侦听的文档抽象,并且至少有一个侦听器返回true add },Document.add返回true。

PdfWriter.getInstance调用会将新PdfDocument实例添加为Document侦听器,只要相关编写者PdfDocument.add truenull就会返回true并且暂停并且要添加的元素是已知类型,并且此处不会抛出异常。所以很可能它会在你的程序中一直返回brew install tmux

顺便说一下:

  

我使用的itext库版本是5.0.6

该版本很古老,所以除非您有非常特殊的支持合同,否则您可能无法获得符合预期的二进制兼容库版本。