читать до определенного индекса в файле с RandomAccessFile java

Я пытался читать из файла между двумя конкретными индексами, используя RandomAccessFile.

Я знаю, что могу перейти к индексу с помощью функции seek(), но я не смог найти ответ, как читать текст из файла до определенного индекса.

Например, у меня есть огромный файл, и я хочу прочитать текст от индекса 100 до индекса 500, я бы начал так:

public String get_text(){
   raf.seek(100) //raf= my RandomAccessFile
   String txt=raf.read(500) //read until index 500 which i don't know how to do
   return txt;
}

Пожалуйста помогите :)


person Sophia Marie    schedule 17.01.2019    source источник


Ответы (1)


Вот как я решил свою проблему:

try {
    int index = 100;
    raf.seek(index); //index = 100
    int counter = 0;
    int length = 400;
    while (counter < length) { //want to read the characters 400 times
       char c = (char) raf.read();
       if (!(c == '\n')) {   //don't append the newline character to my result
           sb.append(c);    //sb is a StringBuilder
           counter++;
       }
    }
} catch (IOException e) {
    e.printStackTrace();
}

Я также видел другое решение, в котором readFully() использовалось с массивом байтов, которое также работало хорошо.

try {
    raf.seek(index);
    byte[] bytes = raf.readFully(new byte[(int) length]); //length of the charactersequence to be read
    String str = bytes.toString();
} catch (IOException e){
    e.printStackTrace();
}

В этом решении длина массива байтов должна учитываться в символе новой строки, поэтому вы должны вычислить это с учетом длины строки. -> Начало в файле с разрывами строк и конец индекса в файле с разрывами строк. длина = конец в файле-начало в файле +1;

person Sophia Marie    schedule 21.03.2019
comment
Второе решение должно использовать readFully(). В противном случае нет гарантии, что буфер был заполнен. - person user207421; 22.03.2019
comment
хм, я не вижу этого, если я смотрю JavaDocs docs.oracle.com/javase/7/docs/api/java/io/ read() имеет больше перехватов исключений... можете ли вы объяснить, почему буфер не может быть заполненный? - person Sophia Marie; 22.03.2019
comment
Потому что в контракте read() ничего не говорится о том, что он будет заполнен. Вот почему он возвращает счет. readFully(), с другой стороны, гарантированно либо заполнит буфер, либо выбросит EOFException, либо другое IOException, либо заблокирует до тех пор, пока не произойдет одно из этих событий. Метод read() в вашем ответе не является ни тем, ни другим и не предоставляется, что делает ваш ответ в лучшем случае неполным. - person user207421; 22.03.2019
comment
@ user207421 теперь понятно, спасибо, исправлю. read() не генерирует исключение EOFException, но генерирует исключения IOException: IOException — если первый байт не может быть прочитан по какой-либо причине, кроме конца файла, или если файл с произвольным доступом был закрыт, или если произошла какая-либо другая ошибка ввода-вывода. - person Sophia Marie; 22.03.2019
comment
Я не знаю, почему ты говоришь мне это. Я знаю это. Это то, что я говорю вам. Он возвращает счетчик вместо выбрасывания EOFException. В этом суть. Особенно, когда вы игнорируете счет. - person user207421; 22.03.2019
comment
Прости, я не хотел тебя расстраивать, я просто хотел понять, что ты имеешь в виду. Чего я не упомянул, так это того, что у меня был индексный файл для файла, в котором я должен был считывать последовательность РНК, поэтому длина буфера рассчитывается для длины последовательности РНК. В файле была вся последовательность геномной РНК, если бы у меня была длина для чтения больше, чем файл, я бы вычислил что-то неправильно, для моей цели не было необходимости проверять конец файла. - person Sophia Marie; 22.03.2019