繁体   English   中英

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

[英]How do I read from two different places in a file using Buffered IO in Java

我正在从文件中读取数字以执行合并排序。 合并排序必须作为外部排序执行,因为它是一个很大的数字列表,并且可用内存很少。 我有一个有效的实现,它使用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?

对于需要执行相同操作的其他人,这是一个使用两个不同的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());
        }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM