如何使用Java中的Buffered IO从文件中的两个不同位置读取

时间:2011-08-22 02:24:29

标签: java mergesort random-access bufferedinputstream

我正在从文件中读取数字以执行合并排序。合并排序必须作为外部排序执行,因为它是一个很大的数字列表,并且可用的主内存非常少。我有一个工作实现,它使用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)来访问文件的其他部分,我怎么知道下次调用File以获取更多数据的时间,从而寻求在被要求提供更多数据之前回来。或者,对于相同的底层文件,是否可以有两个RandomAccessFiles?

1 个答案:

答案 0 :(得分: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());
        }