0

マージソートを実行するために、ファイルから数値を読み取っています。マージ ソートは、数値の大きなリストであり、使用可能なメイン メモリがほとんどないため、外部ソートとして実行する必要があります。私は実用的な実装を持っています。これは BufferedOutputStream を使用して出力を高速化し、入力ストリームに対しても同じことをしたいと考えています。ただし、マージを実行するには、2 つの異なる場所から入力を読み取る必要があります。

基本的に、私が持っている場合:

RandomAccessFile File = new RandomAccessFile("File.dat", "rw");
BufferedInputStream Buffer = new BufferedInputStream(
   new FileInputStream(File.getFD()));
DataInputStream InputStream = new DataInputStream(Buffer);

を使用していくつかの整数を読み取りますが、ファイルの他の部分にアクセスするためにInputStream.readInt()も使用したいのですFile.seek(n)が、ファイルが次にいつ呼び出されてより多くのデータが求められるかをどのように知るのでしょうか。または、同じ基本ファイルに対して 2 つの RandomAccessFiles を持つことは可能ですか?

4

1 に答える 1

0

同じことをする必要がある他の人のために、2 つの異なる bufferedInputStreams と RandomAccessFiles を使用してストリームから読み取る例を次に示します。

        RandomAccessFile FileA = new RandomAccessFile("File.dat", "rw");
        System.out.println("Writing 100");
        for (int i = 0; i < 100; i++) {
            FileA.writeInt(i);
        }
        FileA = new RandomAccessFile("File.dat", "r");
        RandomAccessFile FileB = new RandomAccessFile("File.dat", "r");


        FileA.seek(0);
        DataInputStream InputStreamA = new DataInputStream(new BufferedInputStream(
                new FileInputStream(FileA.getFD())));

        FileB.seek(0);
        DataInputStream InputStreamB = new DataInputStream(new BufferedInputStream(
                new FileInputStream(FileB.getFD())));


        System.out.println("Read A");
        for (int i = 0; i < 10; i++) {
            System.out.println(InputStreamA.readInt());
        }

        System.out.println("Read B");
        for (int i = 0; i < 10; i++) {
            System.out.println(InputStreamB.readInt());
        }

        System.out.println("Run A");
        for (int i = 0; i < 10; i++) {
            System.out.println(InputStreamA.readInt());
        }

        System.out.println("Run B");
        for (int i = 0; i < 10; i++) {
            System.out.println(InputStreamB.readInt());
        }
于 2011-08-22T02:40:32.713 に答える