0

私のチームと私は、Java ライブラリをサポートし、より大きなファイルに関するさまざまなメタデータを保持するファイル形式の要件を与えられました。実際、大きなファイル (おそらく 100MB) と他の関連ファイル (メタデータ、非破壊編集など) を 1 つのバンドルされたアーカイブ ファイルにラップすることを望んでいます。

1 回限りの作成の場合は簡単です。すべてを Zip ファイルに入れるだけです。しかし、メタデータや非破壊編集などを常に更新できるようにしたいと考えています。メタデータ ファイル。

いくつかのプロジェクト (例: TrueVFS ) では、zip ファイルやその他のアーカイブ ファイル形式をファイル システムとして抽象化することを主張することで、一見理想的に聞こえます。しかし、よく調べてみると、インプレース更新機能は単純に新しいファイルを追加するだけで、実際に個々のファイルを変更したり追加したりすることはないように思われます。

必要なのは、Zip ファイルとリレーショナル データベースの間のファイル形式です。階層構造のあるものは素晴らしいでしょう。かなり大きなファイル (100MB 以上) を効率的にサポートし、ランダム アクセスでアーカイブ内の個々のファイルを追加、削除、および変更できるようにする必要があります。何も見つからないことに驚いた。助言がありますか?

PS 私は何年も前に、Microsoft の複合ファイル形式が破損するという悪い経験をしました。Apache POIFSのようなものが信頼性が高く、大きなファイルで効率的かどうかはわかりません。

4

2 に答える 2

1

あなたが求めていることは、1つの単純な理由で簡単に実行できるとは思いません.ファイルシステムは、通常、ファイルの途中にデータを挿入することをサポートしていません-残りを切り捨てて再書き込みすることはできません. つまり、単純なファイルへの単純な追加は、そのファイルがアーカイブに保存されると、切り捨て-書き換え操作に変わります。

そのような操作を可能にするために、実際のファイルシステムの機能の多くを本質的に複製するブロックベースのフォーマットを見つける必要があります。

システム全体をリファクタリングして、そのビッグ データ ファイルに何らかの構造を適用することを検討します。これにより、データベースに格納できるものに変換できます。たとえば、行ベースのテキストは、主キーとしての行番号と行テキストの 2 つの列を持つテーブルに格納できます。行ベースの操作は、DB ベースの操作に簡単に変換できます。

次に、 SQLiteなどの組み込みデータベースを使用して、外部サーバーに依存することなく、すべてを同じファイルに保持することができます。

于 2012-12-07T21:45:22.207 に答える
0

アプリケーションを実行するプラットフォームに応じて、Solid File Systemを使用できます。これは、自動的にサイズ変更可能なコンテナー ファイルによってサポートされる仮想ファイル システムです。これは Ansi C で書かれており、Android 用の Java JNI ラッパーを備えています (このラッパーは、要求に応じて他のプラットフォームに持ち込むことができます - 以前はそのような目標はありませんでした)。

私が理解しているように、Java用のJNIも提供するCodebase File Systemもあります。

于 2012-12-08T06:57:11.757 に答える