2016-05-26 6 views
0

私は、Javaプロジェクトの中で、私がそれを動作させるために必要なことの1つは、ディスクからオブジェクトを書き込んで読み込むことです。具体的には、オブジェクトごとに固定サイズのレコードを持つ単一のRandomAccessFileから、指定されたオブジェクトのデータメンバーを書き込んだ後にロードする必要があります。このファイルは、固定サイズのディスクブロックを持つパーティションを表します。Java:オブジェクトデータメンバーをファイルに書き込む最良の方法は何ですか?

これで、すべてのデータメンバーを明示的にバイトに変換するのが、ByteBufferです。その後、これらをファイルに書き込んで、後でデータを再ロードして、データメンバーの同じ値を持つ新しいオブジェクトをインスタンス化できるようにしました。私がこのアプローチについて気に入らないことは、すべてのデータメンバーを明示的に変換してByteBufferに入れて書かなければならないことです。ロードするだけで、逆の処理が行われ、すべてのバイトが変換され、適切な型のオブジェクトに格納されます。

私が上記で使用したアプローチは、あまりにも複雑です。より良い方法、簡単な方法はありますか?私が考えていたのは、C++でできることと似たものです。過去には、オブジェクトへのポインタを使用して固定サイズのインデックス付きレコードからオブジェクトデータを保存してリロードした後、へのポインタをreinterpret_castにキャストした後に、ofstream(または同様のもの)ですべてのバイトを書き込んでいました。 ifstream(またはそれに類似したもの)を含むファイルを読み込むのは、インデックス* sizeOf(Foo)を使用してファイルポインタのオフセットを計算してから、ファイルからメモリに読み込む前にシークするだけで簡単です。

Javaでこのアプローチに類似したものはありますか?

+0

タイプがPODタイプでない場合、あなたのC++のアプローチは悲惨に失敗します。あなたはオブジェクトのシリアル化について読んでおく必要があります。 – PaulMcKenzie

+0

関連オブジェクトのリスト/配列を固定長のレコードに持つオブジェクトを保存するにはどうすればよいですか? – Andreas

+0

これらのオブジェクトへのランダムアクセスは、ディスク上のファイルではなくデータベースに書き込むことで、より便利に解決できるタスクのようです。これを困難にするいくつかの制約がありますか? –

答えて

0

ObjectOutputStreamは、任意の(ただしSerializableを実装する必要があります)オブジェクトをバイト配列(この場合はストリーム)にシリアル化してディスクに書き込むことができます。それだけではランダムアクセスのニーズはサポートされませんが、カスタムアダプターを必要としないソリューションの良い部分になります。

関連する問題