0

我正在从文件中读取数字以执行合并排序。归并排序必须作为外部排序执行,因为它是一个很大的数字列表并且可用的主内存非常少。我有一个有效的实现,它使用 BufferedOutputStream 来加速输出,我想对输入流做同样的事情。但是,必须从两个不同的位置读取输入才能执行合并。

本质上,如果我有:

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)来访问文件的其他部分,我怎么知道下次何时调用文件以获取更多数据,因此在被要求获取更多数据之前回溯。或者,对于同一个底层文件,是否可以有两个 RandomAccessFiles?

4

1 回答 1

0

对于需要做同样事情的其他人,这里有一个使用两个不同的 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 回答