3

テーブルからファイルに空間データを書き込もうとしています。しかし、ディスクに書き込む前に、ディスク上のデータの正確なサイズを知る必要があります。例として、次のコードを使用してディスクに書き込んでいるとします。

    FileOutputStream fos = new FileOutputStream("t.tmp",false);
    ObjectOutputStream oos = new ObjectOutputStream(fos);
    oos.writeInt(gid);
    oos.writeUTF(fullname);
    oos.writeInt(d.shape.length);
    oos.write(d.shape);

    oos.close();
    fos.close();

ディスク上のファイルサイズは次のようになると考えていました:

size= 4B {for gid, int} + fullname.getBytes.length() {string} + 4B {d.shape.length, int} + d.shape.length

しかし実際には、これはディスク上の実際のファイル サイズとは大きく異なります。

また、ObjectOutputstream を使用して空のファイルを作成しても、ディスク上に 4B のスペースが発生することにも気付きました。

ディスク上のファイルサイズを計算する方法について何か助けはありますか?

(データをディスクに書き込んで実際のサイズを読み取ることはできません。これによりパフォーマンスが低下します。代わりに、メモリに格納されているデータ値に基づいてディスク上のデータのサイズを計算する必要があります。)

4

2 に答える 2

2

テーブルからファイルに空間データを書き込もうとしています。しかし、ディスクに書き込む前に、ディスク上のデータの正確なサイズを知る必要があります。

を使用しないでくださいObjectOutputStream。オブジェクトのObjectOutputStream複雑なグラフを自動的にシリアル化できますが、これは要件の 1 つではないようです。このシリアル化の一環として、ObjectOutputStreamはいくつかのストリーム ヘッダー情報 (最初に発見した 4 バイト) を書き込み、以前に書き込まれたオブジェクトを追跡して、オブジェクト全体を再度書き出すのではなく、特別なマーカー値を書き込めるようにします。

代わりに、を使用してDataOutputStreamください。それはあなたが望むのと同じ機能を提供します:

データ出力ストリームを使用すると、アプリケーションはプリミティブ Java データ型を移植可能な方法で出力ストリームに書き込むことができます。その後、アプリケーションはデータ入力ストリームを使用してデータを読み戻すことができます。

FileOutputStream fos = new FileOutputStream("t.tmp",false);
DataOutputStream dos = new DataOutputStream(fos);
dos.writeInt(gid);                 // write 4 bytes
dos.writeUTF(fullname);            // write 2 bytes of length, then variable length string (UTF encoded)
dos.writeInt(d.shape.length);      // write 4 bytes
dos.write(d.shape);                // write a variable length byte array

dos.close();
fos.close();

ここで驚くことはありません (UTF エンコードされた文字列が最終的に何バイトになるかを知っていれば)、正確なファイル サイズを計算するために算術を実行できます。

(1 文字 1 バイトに相当しない文字列を扱っている場合は、最初に文字セット エンコーダーを使用して文字列をバイト配列にレンダリングできます)。

于 2012-06-26T04:22:44.800 に答える
1

いくらかのメモリを浪費してもかまわないと仮定すると、ByteArrayOutputStream最初にすべてを書き込んでからサイズを取得できます。

ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(boas);
oos.writeInt(gid);
oos.writeUTF(fullname);
oos.writeInt(d.shape.length);
oos.write(d.shape);

oos.close();
boas.close();
int size = boas.size();
于 2012-06-26T02:53:59.817 に答える