2015-03-02 3 views
0

Я хочу использовать mark() и reset() метод для чтения строки перед разделителем.mark & ​​reset in java BufferedReader

String line; 
    FileReader fr = new FileReader(PATH); 
    LineNumberReader br = new LineNumberReader(fr); 
    String DIVIDER = "================================"; 
    while ((line = br.readLine()) != null) { 
     boolean endOfObj = false; 
     while (!line.trim().contains(DIVIDER)) { 
      br.mark(line.length()); 
      line = br.readLine(); //return next line 
     } 
     br.reset();   
     line = br.readLine(); 

но значение переменной строки не является предыдущей линией разделителя. какой у меня проблема есть. спасибо

+1

Во-первых, вы «отмечаете» после того, как прочитали строку, так что знак после строки. – SJuan76

+1

Не лучший способ это сделать. Просто помните предыдущую строку каждый раз вокруг цикла и используйте ее, когда вы выходите из цикла. – EJP

+0

thx @EJP, по какой-то причине мне следовало вернуться к определенной строке снова и сохранить некоторые дополнительные данные в моем db, я хотел обработать его с помощью меток() и reset(), как я могу это сделать? – farhad

ответ

1

Не могли бы вы использовать следующий код? Я немного убрал ваш код и поместил его в метод под названием getPreviousLine(). У меня возникло ощущение, что вы повесили трубку, используя mark() и reset(), поэтому я просто полагался на чистую логику и состояние, чтобы найти линию перед делителем. Если делитель не найден, метод вернет null.

String getPreviousLine(String PATH) { 
    String line; 
    FileReader fr = new FileReader(PATH); 
    LineNumberReader br = new LineNumberReader(fr); 
    String DIVIDER = "================================"; 
    boolean endOfObj = false; 
    String previousLine = br.readLine(); 

    if (previousLine == null) { 
     return null; 
    } 

    while ((line = br.readLine()) != null) { 
     if (line.trim().contains(DIVIDER)) { 
      endOfObj = true; // found the divider; break 
      break; 
     } else { 
      previousLine = line; // advance your line pointer 
     } 
    } 

    if (endOfObj) { 
     return previousLine; 
    } else { 
     return null; 
    } 
} 
+0

спасибо, это действительно помогает. но в чем моя проблема? Как я могу вернуть указатель на определенную строку. Возможно ли это с помощью меток() и reset() или нет? – farhad

+0

Методы 'markNumberReader'' mark() 'и' reset() '' '' '' '' '' '' '' '' '' '' '' '' используются для установки указателя на файловый поток с целью возможности сброса в данную строку. Вам нужен указатель на ваш файл? –

+0

yes Мне нужно, я должен был переместить указатель в свой файл – farhad