RandomAccessFile
RandomAccessFileは、Javaの`java.io`パッケージに含まれるクラスで、ファイルシステムに保存されたファイルに対して読み取りと書き込みの両方のアクセスを提供し、ファイル内の任意の位置に移動できる機能を持ちます。
RandomAccessFileは、Javaのjava.ioパッケージに含まれるクラスで、ファイルシステムに保存されたファイルに対して読み取りと書き込みの両方のアクセスを提供し、ファイル内の任意の位置に移動できる機能を持ちます。Apache PDFBoxでは、このクラスはPDF仕様
(
Citation: N.A., 2020
(N.A.).
(2020).
Document management — Portable document format — Part 2: PDF 2.0
.
International Organization for Standardization
Retrieved from
https://www.iso.org/standard/75839.html
)
に準拠したPDFドキュメントを扱うために頻繁に使用され、PDFファイル構造の効率的な解析と操作を可能にします。このランダムアクセス機能は、シーケンシャル読み取りでは非効率的な大きなPDFファイルを扱う際に特に有用です。
RandomAccessFileは、ファイルをバイトの大きな配列として扱う標準的なJava I/Oクラスで、開発者がファイルポインタを使用してファイル内の任意の位置から読み取りまたは書き込みを行うことができます。FileInputStreamやFileOutputStreamなどのシーケンシャルなストリームベースのクラスとは異なり、RandomAccessFileは内部ファイルポインタを保持し、seek()メソッドを使用して位置を変更できるため、ファイルコンテンツへの非シーケンシャルなアクセスが可能です。
Apache PDFBoxのコンテキストでは、RandomAccessFileはPDFドキュメントの読み込みと処理のための複数の入力ソースオプションの1つとして機能します。PDFBoxはこのクラスを使用してPDFファイルの複雑な構造を効率的にナビゲートします。PDFファイルは、相互参照テーブル、オブジェクトストリーム、ページコンテンツストリームなど、ファイル全体に散在する異なるセクション間を頻繁にジャンプする必要があります。このランダムアクセスパターンは、 ( Citation: N.A., 2020 (N.A.). (2020). Document management — Portable document format — Part 2: PDF 2.0 . International Organization for Standardization Retrieved from https://www.iso.org/standard/75839.html ) で定義されているPDFファイルフォーマット構造とよく整合しており、オブジェクトがファイル内の任意の位置にある他のオブジェクトを参照できます。
このクラスは、メモリマップドファイルやバイトバッファとは異なり、ファイル全体をメモリに読み込むことなくファイルシステム上で直接動作するため、利用可能なヒープスペースを超える大きなPDFドキュメントの処理に適しています。
JavaでのPDF処理に携わる開発者にとって、RandomAccessFileを理解することは、いくつかの実用的な理由から不可欠です。
パフォーマンスの最適化: 大きなPDFファイルやメモリが限られたサーバー環境で作業する場合、RandomAccessFileにより、PDFBoxはドキュメント全体をメモリに読み込むことなく、必要な部分のみを読み取ることができます。これは、メタデータの抽出、特定のページの読み取り、またはPDFドキュメントへの段階的な更新を実行する際に特に重要です。
リソース管理: RandomAccessFileは、ファイルハンドルとシステムリソースに対する明示的な制御を提供し、開発者がファイルロックを適切に管理し、処理後にファイルが確実に閉じられるようにします。これは、複数のスレッドまたはプロセスがPDFファイルに同時にアクセスする必要がある本番環境では重要です。
PDF構造との互換性: ( Citation: N.A., 2020 (N.A.). (2020). Document management — Portable document format — Part 2: PDF 2.0 . International Organization for Standardization Retrieved from https://www.iso.org/standard/75839.html ) で定義されているPDFファイルは、ファイル全体のオブジェクト位置を指し示す相互参照テーブル構造を使用します。RandomAccessFileの特定のバイトオフセットにシークできる能力は、このアーキテクチャと理想的にマッチし、シーケンシャルスキャンなしでPDFオブジェクトの効率的な解析を可能にします。
段階的な保存: 既存のPDFドキュメントを変更する場合(例えば、注釈、フォームフィールド、またはPDF/UA準拠 ( Citation: N.A., 2014 (N.A.). (2014). Document management applications — Electronic document file format enhancement for accessibility — Part 1: Use of ISO 32000-1 (PDF/UA-1) . International Organization for Standardization Retrieved from https://www.iso.org/standard/64599.html ) のためのアクセシビリティ機能の追加など)、RandomAccessFileにより、PDFBoxはドキュメント全体を書き直すのではなく、ファイルの末尾に変更を追加できるため、パフォーマンスが大幅に向上します。
RandomAccessFileは、PDF処理に適したいくつかの主要なメカニズムを通じて動作します。
ファイルポインタ管理: このクラスは、ファイル内の現在位置を追跡する内部ファイルポインタを保持します。開発者は、seek(long pos)を使用して任意のバイトオフセットに移動し、getFilePointer()で現在位置を取得し、length()でファイルの合計サイズを決定できます。PDFBoxは、これらのメソッドを活用して、相互参照テーブルに保存されたオフセットに基づいてPDFオブジェクト間を移動します。
読み取りと書き込み操作: RandomAccessFileは、read()、readFully()、write()、writeBytes()などのメソッドを通じて読み取りと書き込みの両方をサポートします。このクラスは、異なるモードで開くことができます:“r”(読み取り専用)、“rw”(読み取り/書き込み)、“rws”(ファイルとメタデータの同期更新を伴う読み取り/書き込み)、または"rwd"(ファイルの同期更新を伴う読み取り/書き込み)。PDFBoxは通常、既存のPDFを読み込む際には読み取り専用モードを使用し、ドキュメントを作成または変更する際には読み取り/書き込みモードを使用します。
PDFBoxとの統合: Apache PDFBoxでは、RandomAccessFileは通常、RandomAccessReadまたはRandomAccessBufferインターフェース実装でラップされます。PDDocument.load(File file)を使用してPDFドキュメントを読み込む場合、PDFBoxは内部的にRandomAccessFileインスタンスを作成してファイルコンテンツにアクセスします。その後、ライブラリはこれを使用して以下を実行します:
- PDFヘッダーを読み取り、相互参照テーブルを見つける
- トレーラー辞書を解析してドキュメントカタログを見つける
- ドキュメント処理中に必要に応じて特定のオブジェクト位置にジャンプする
- オンデマンドでページコンテンツストリームとリソースを読み取る
バッファ管理: RandomAccessFile自体はバッファリングを提供しますが、PDFBoxは典型的なPDFアクセスパターンに対してパフォーマンスを最適化するために、追加のバッファリングレイヤーでラップすることがよくあります。これには、頻繁にアクセスされるオブジェクトのキャッシングや、埋め込みフォント、画像、またはタグ付きコンテンツ構造 ( Citation: PDF Association, 2023 PDF Association(2023). Retrieved from https://pdfa.org/resource/tagged-pdf-best-practice-guide-syntax/ ) を含む複雑なドキュメントを解析する際のディスクI/O操作の最小化が含まれます。
スレッドセーフティの考慮事項: RandomAccessFileインスタンスはスレッドセーフではありません。マルチスレッド環境でPDFBoxを使用する場合、開発者は各スレッドが独自のRandomAccessFileインスタンスを使用するか、同時アクセスの問題を防ぐための適切な同期メカニズムを実装する必要があります。
- PDDocument – Apache PDFBoxの主要クラスで、メモリ内のPDFドキュメントを表現し、RandomAccessFileを含むさまざまなソースから読み込むことができます
- 相互参照テーブル – オブジェクト番号をファイル内のバイトオフセットにマッピングするPDF構造で、効率的なPDF解析にはランダムアクセスが不可欠です
- Stream I/O – InputStreamおよびOutputStreamクラスを使用したシーケンシャルなファイルアクセスアプローチで、RandomAccessFileのランダムアクセス機能とは対照的です
- メモリマップドファイル – FileChannelとMappedByteBufferを使用したファイルアクセスの代替アプローチで、RandomAccessFileとは異なるパフォーマンス特性を提供します
- RandomAccessRead – PDFBoxのインターフェースで、ランダムアクセス操作を抽象化し、RandomAccessFileベースおよびメモリベースのソースを含むさまざまな実装を可能にします
- (N.A.) (2020)
- (N.A.). (2020). Document management — Portable document format — Part 2: PDF 2.0 . International Organization for Standardization Retrieved from https://www.iso.org/standard/75839.html
- PDF Association (2023)
- PDF Association(2023). Retrieved from https://pdfa.org/resource/tagged-pdf-best-practice-guide-syntax/
- (N.A.) (2014)
- (N.A.). (2014). Document management applications — Electronic document file format enhancement for accessibility — Part 1: Use of ISO 32000-1 (PDF/UA-1) . International Organization for Standardization Retrieved from https://www.iso.org/standard/64599.html
