0

私は、オブジェクトの読み取りと書き込み、およびファイル内のシークを提供するクラス(RandomAccessObjectFile)の作成を任されています。Java File NIOを使用するのはこれが初めてであり、正しく把握していることを確認したいと思います。以下は私がクラスで持っている必要があるメソッドであり、このクラスの残りの部分にアプローチする方法についての助けとより多くの理解を探しています。

public class RandomAccessObjectFile {

RandomAccessFile raFile;
private RandomAccessObjectFile(String fileName) throws FileNotFoundException {
    raFile = new RandomAccessFile(new File(fileName), "rw");
}

static void create(String fileName) throws IOException {
    Path createTarget = Paths.get(fileName);
    Files.createFile(createTarget);
}

static void delete(String fileName) throws IOException {
    Path deleteTarget = Paths.get(fileName);
    Files.delete(deleteTarget);
}

static RandomAccessObjectFile open(String fileName) {

}

<T> void write(T obj) {
}

<T> T read() {

}

void seek(long location) {
}

long length() {

}

}

よろしくお願いします。

4

2 に答える 2

2

パッケージの背景については、 Javaチュートリアルjava.nioから始めることができます。 オブジェクトをファイルにシリアル化するために、私はObjectOutputStreamを使用して成功しました。シークメソッドが何をすべきかについて、さらに明確にする必要があると思います。長い入力はファイルの場所ですか?ファイルに書き込まれたオブジェクトはファイル内のさまざまな量のスペースを占めるため、これは奇妙なことのように思われます。ファイル内の特定の場所がオブジェクトのシリアル化の開始を表していない可能性があるため、seekメソッドへのほとんどの入力値は無効になります。しかし、これが入力パラメーターの解釈方法である場合、入力値がオブジェクトの開始を表していない場合、メソッドはIllegalArgumentExceptionをスローする必要があると思います。

このクラスのユーザーは、特定のオブジェクトを探す方法をどのように知るのでしょうか。

たぶん、いくつかのインデックスデータも保存する必要があります。たぶん、ファイルに書き込まれる各オブジェクトには、いくつかの一意のIDフィールドが必要です。次に、これらのIDをファイル内の位置にマップするマップを作成します。次に、このマップを使用して、データを読み取るための正しいファイルの場所にすばやくジャンプできます。このアプローチは、ファイル内のデータを変更する必要がない限り、うまく機能するはずです。この方法でファイルに新しいオブジェクトを追加することは問題なく機能するはずですが、オブジェクトを変更したり、ファイルの途中からオブジェクトを削除したりすると、さらに作業が必要になります。

于 2012-11-28T03:29:47.010 に答える
0

Pathとの些細で冗長な使用を除けば、ここにはNIOはまったくありませんFiles。そのため、あなたの質問が実際に何であるかを理解するのは困難です。しかし、私は次のようにコメントします:

  1. このcreate()方法は冗長です。クラスのインスタンスを作成するときにターゲットファイルが作成されます。そうしないと、例外がスローされます。

  2. このdelete()方法は冗長でFile.delete()あり、Files.delete()すでに存在しています。

  3. 割り当て全体が無駄です。オブジェクトストリームはランダムアクセスではありません。それらは厳密にストリームです。どこを探すべきかを知らない限り、それらを探すことはできません。また、その情報を取得するためのAPIは提供されていません。

于 2012-12-04T09:01:24.600 に答える