1

1つのファイルを複数のファイルに分割したいと思っていた仲間から、ここにも同様の質問があることを認識しています。ただし、残念ながら、新しいファイルの作成にはある程度のオーバーヘッドが伴うため、このソリューションは機能しません。

背景(読む必要はありません):

私がやろうとしているのは、データベースをシードするために任意のサイズのPDFファイルを生成することです(つまり、キロバイトまたはメガバイト単位のファイルのサイズでメソッドを呼び出すと、目的のサイズのファイルが生成されます)。

現在、入力データをランダムにして1KBブロック(段落形式)でファイルに入れることにより、入力データが非圧縮性であることを確認しています。必要なバイト数の関数として出力バイト数をプロットした後、この(楽しくそして予想通りの)線形関係を説明するようにアルゴリズムを変更しました。

ただし、入力データの確率的性質により、この方法にはある程度の不確実性があり、その絶対値は目的のサイズとともに増加します(したがって、100分の1パーセントオフであるにもかかわらず、その100分の1は20 MBのファイルでは、絶対値でパーセントがかなり重要になります)。

最適には、キロバイト以内の任意のサイズのファイルを生成できますが、これを行うには、特定の操作後のファイルサイズを知る必要があり、それを知るためには、いつPDFWriterはそのバッファを書き込みます。または、少なくともそのバッファの大きさ(つまり、バッファが1キロバイト未満の場合、そのマージン内で正確であることにのみ関心があるため、書き込みのタイミングは重要ではありません)。

質問:

ドキュメントを実際に閉じずに、テキストを使用してPDFで実際にディスクに書き込まれるデータのバイト数を確認する方法はありますか?

または、「ドキュメントを閉じる」とは、バッファをフラッシュしてストリームを閉じることを意味しますか(つまり、閉じるときにユーザーが入力しない追加のデータをファイルに書き込む必要はありません)。

4

1 に答える 1

2

PdfWriterをビルドするときは、必ずしも FileOutputStream ではないOutputStreamを指定する必要があります。このようにビルドすると

      ByteArrayOutputStream baos = new ByteArrayOutputStream();
      PdfWriter writer = PdfWriter.getInstance(document, baos);
       . . .          

いつでもバッファサイズを確認できます:

 System.out.println("Current size: " + baos.size());

これがあなたを助けることを願っています。

于 2012-06-28T08:14:50.230 に答える