2015-06-11 3 views
1

Привет, ребята, я в настоящее время использую BufferedReader для чтения файлов. У меня есть что-то вроде:Пропустить строку, используя BufferedReader (пропустить, но не читать)

br.readLine() != null 

для каждого цикла вызова.

А теперь что мне делать, если я хочу пропустить строку. Здесь я прочитал несколько аналогичных вопросов, опубликованных другими людьми, большинство из которых предложило использовать readLine().

Я знаю, что вызов readLine() один раз приведет к указателю на следующую строку. Но это не является предпочтительным, поскольку я рассматриваю производительность чтения здесь. Хотя вы, кажется, пропустите линию, система действительно прочитала ее уже, так что это не время-эффективность. Я хочу переместить указатель на следующую строку, не читая ее.

Любая хорошая идея?

+0

Также приветствуются любые хорошие предложения для пропусков без использования BufferedReader! И – fTTTTT

+0

Вы не можете просто «пропустить» строку с «BufferedReader», она должна прочитать данные, чтобы найти, где заканчивается строка. – Kayaman

+0

Зачем вам нужно пропустить строку? Возможно, у вас есть другие варианты, кроме «BufferedReader» – mustangDC

ответ

0

Если вы заботитесь о памяти неиспользуемой в промежуточном StringBuffer, вы можете попробовать следующую реализацию:

public static void skipLine(BufferedReader br) throws IOException { 
    while(true) { 
     int c = br.read(); 
     if(c == -1 || c == '\n') 
      return; 
     if(c == '\r') { 
      br.mark(1); 
      c = br.read(); 
      if(c != '\n') 
       br.reset(); 
      return; 
     } 
    } 
} 

Кажется, что он отлично работает для всех EOL, поддерживаемых readLine ('\n', '\r', '\r\n').

В качестве альтернативы вы можете расширить класс BufferedReader, добавив этот метод как метод экземпляра внутри него.

2

Невозможно пропустить линию, не читая ее.

Чтобы узнать, где перейти, вы должны знать, где находится следующий новый символ линии, поэтому вы должны прочитать его.

P.S. Если у вас нет оснований, не нужно, BufferedReader должно быть хорошо для вас - это довольно эффективно

+0

Это разумно, вы не знаете, пока не прочитаете \ n – fTTTTT

0

В общем, это невозможно на любом языке и с любым API.

Чтобы пропустить линию, вам необходимо знать смещение следующей линии. Либо у вас есть формат файла, который предоставляет вам эту информацию, вам даны смещения строк в качестве входных данных, либо вам нужно читать каждый байт, чтобы знать, когда заканчивается строка, и начинается следующее.

0

Вы прочитали код readLine()? Он читает символы один за другим, пока не найдет \ r или a \ n и добавит их в StringBuffer. То, что вы хотите, это такое поведение без нагрузки создания StringBuffer. Просто переопределите класс BufferedReader и предоставите свою собственную реализацию, которая juste читает символы до/r или/n, не создавая бесполезную String.

Единственная проблема, которую я вижу, что многие поля являются частными ...

Смежные вопросы