使用randomAccessFileOrArray()

问题描述 投票:0回答:1

任何人都可以向我解释一下iText中randomAccessFileOrArray()函数的用途以及与使用Files.readAllBytes()有何不同。

我正在使用以下代码行:

PdfReader reader = new PdfReader(Files.readAllBytes((new File(filenameSource)).toPath()));

但是在运行时,我遇到了Java堆空间错误,因此我发现了以下选项:

PdfReader reader = new PdfReader(new RandomAccessFileOrArray(filenameSource),null);

但是我不太确定这会带来什么不同。有人可以帮我吗?

java pdf itext itext7
1个回答
0
投票

无论您使用哪个PdfReader构造函数,最终都会在内部使用IRandomAccessSource实现来访问pdf。此接口表示可以从中读取字节的抽象源

[RandomAccessFileOrArray就是这样的实现,而byte[]构造函数中的PdfReader将被包装在另一个中。

因此,两种用于itext的方法的区别仅在于,该接口的确切实现用于读取pdf字节。

但是,两种方法在资源方面的区别在于:>

PdfReader reader = new PdfReader(Files.readAllBytes((new File(filenameSource)).toPath()));

首先将pdf加载到内存中的byte[]中,该数组与原始pdf一样大,然后由PdfReader使用该数组读取数据。但是在

的情况下
PdfReader reader = new PdfReader(new RandomAccessFileOrArray(filenameSource),null);

PdfReader(通过RandomAccessFileOrArray实例)立即从磁盘上的文件读取,而中间没有byte[]。因此,从本质上讲,在后一种方法中,您使用的内存要比前一种方法少,而内存的大小与原始pdf一样。

性能方面,如果您有足够的内存(实际内存并分配给您的程序),则前一种解决方案会更快一些。此外,如果您需要快速删除从中读取的文件,则前一种解决方案也是选择的方法。

因此,了解两种方法都有意义。

© www.soinside.com 2019 - 2024. All rights reserved.