Чтение из RandomAccessFile

Я читаю 10 строк из простого RandomAccessFile и печатаю каждую строку. Точные строки в текстовом файле следующие одна за другой:

синий

зеленый

пузырь

сыр

рогалик

молния

конфеты

кит

обезьяна

диаграмма

При печати их по порядку, когда я читаю построчно, мой вывод таков:

зеленый

сыр

молния

кит

диаграмма

Я не могу понять, почему мой метод пропускает каждую вторую строку в файле. Я неправильно понимаю, как работает RandomAccessFile? Мой метод ниже:

RandomAccessFile file = new RandomAccessFile(FILEPATH, "rw");
    read(file);

public static void read(RandomAccessFile t) throws IOException{
    while (t.readLine()!=null) {
        System.out.println(t.readLine());
    }
}

person Branbron    schedule 10.03.2015    source источник
comment
когда вы используете readLine, указатель в файле переходит на следующую позицию, поэтому, когда вы используете его дважды, один раз во время, а также при печати, вы переходите во время и после того, как печатаете второе значение.   -  person Pedro Molina    schedule 27.03.2021


Ответы (3)


Вы звоните readLine() дважды

while (t.readLine()!=null) {
    System.out.println(t.readLine());
}

Вместо этого предварительно вычислите readLine();

String tmp;
while((tmp = t.readLine()) != null) {
    System.out.println(tmp);
}
person gtgaxiola    schedule 10.03.2015
comment
@bot :P Происходит постоянно - person gtgaxiola; 10.03.2015
comment
Ой! глупый я, я забывал каждый раз, когда этот метод называется движением позиции, спасибо. - person Branbron; 10.03.2015

Попробуй это:

   String line = null;
    while ((line = br.readLine()) != null) {
    System.out.println(line);
    }

Каждый раз, когда вы вызываете readlin(), он переходит на следующую строку, поэтому вы печатаете только четные строки.

person Dipen Adroja    schedule 10.03.2015

При использовании RandomAccessFile вы также можете читать в любой позиции поиска, а не переходить построчно для оптимизации производительности ввода-вывода.

RandomAccessFile raf = new RandomAccessFile("file","r");

raf.seek(info.getStartingIndex());//Maintain info while serializing obj
byte[] bytes = new byte[info.getRecordLength()];//length stored earlier similarly 
raf.read(bytes);
ByteArrayInputStream bis = new ByteArrayInputStream(bytes);
ObjectInputStream ois = new ObjectInputStream(bis);
obj = ois.readObject();
person Rahul Verma    schedule 31.10.2017