Как мне прочитать из двух разных мест в файле, используя буферизованный ввод-вывод в Java - PullRequest
0 голосов
/ 22 августа 2011

Я читаю числа из файла, чтобы выполнить сортировку слиянием.Сортировка слиянием должна выполняться как внешняя сортировка, так как это большой список чисел и очень мало доступной основной памяти.У меня есть рабочая реализация, она использует 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 для одного и того же базового файла?

1 Ответ

0 голосов
/ 22 августа 2011

Для тех, кому нужно сделать то же самое, вот пример чтения из потока с использованием двух разных 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());
        }
...