Указатель BufferedReader

У меня есть следующий код, но я не понимаю, как сбросить указатель в исходное положение:

BufferedReader inp=new BufferedReader(new FileReader(file));
Scanner leggi=new Scanner(inp);
for(int i=0;i<nwords;i++){
  while(leggi.hasNext()) 
    if(leggi.next().equals(args[i+2])) 
      occorrenze[i]=occorrenze[i]+1;
}
inp.close();

Я старался

inp.mark(0);
inp.reset();

без результатов.


person paul_1991    schedule 30.04.2011    source источник
comment
возможный дубликат Java BufferedReader обратно в начало текста файл?   -  person jmj    schedule 30.04.2011
comment
Пожалуйста, смотрите мой пересмотренный ответ ниже. Я добавил некоторый код в свой ответ, но SOF не уведомляет вас об изменениях, но уведомляет вас о новых комментариях; отсюда и этот комментарий ;-)   -  person corlettk    schedule 30.04.2011


Ответы (3)


Павел,

Я предлагаю вам прочитать эту старую ветку: Java BufferedReader обратно в начало текстового файла?.

Лично я предпочитаю ответ Джона Скита, который сводится к «Не беспокойтесь [если только вы НЕ ДОЛЖНЫ]».

Ваше здоровье. Кейт.


EDIT: Также вы должны ВСЕГДА закрывать этот входной файл, даже если вы попали в исключение. Блок finally идеально подходит для этого.


EDIT2:

Надеюсь, ты все еще с нами.

Вот моя попытка, и FWIW, вам НЕ нужно сбрасывать входной файл, вам просто нужно переставить свои петли while и for.

package forums;

import java.util.Scanner;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class WordOccurrenceCount
{
  public static void main(String[] args) {
    try {
      String[] words = { "and", "is", "a", "the", "of", "as" };
      int[] occurrences = readOccurrences("C:/tmp/prose.txt", words);
      for ( int i=0; i<words.length; i++ ) {
        System.out.println(words[i] + " " + occurrences[i]);
      }
    } catch (Exception e) {
      e.printStackTrace();
    }
  }

  private static final int[] readOccurrences(String filename, String... words) 
    throws IOException
  {
    int[] occurrences = new int[words.length];
    BufferedReader reader = null;
    try {
      reader = new BufferedReader(new FileReader(filename));
      Scanner scanner = new Scanner(reader);
      while ( scanner.hasNext() ) {
        String word = scanner.next();
        for ( int i=0; i<words.length; i++ ) {
          if ( words[i].equals(word) ) {
            occurrences[i]++;
          }
        }
      }
    } finally {
      if(reader!=null) reader.close();
    }
    return occurrences;
  }
}

И кстати, java.util.Map идеально подходит для построения таблицы частот... Параллельные массивы — это просто ТАКОЕ 90-е. Реализация карты "по умолчанию" - это класс HashMap... По умолчанию я имею в виду использование HashMap всякий раз, когда вам нужна карта, если только у вас нет веских причин использовать что-то еще, что не будет часто. HashMap, как правило, является лучшим универсальным исполнителем.

person corlettk    schedule 30.04.2011
comment
for(int i=0;i‹nwords;i++){ BufferedReader inp=new BufferedReader(новый FileReader(файл)); Сканер leggi=новый сканер(inp); while(leggi.hasNext())if(leggi.next().equals(args[i+2])) occorrenze[i]=occorrenze[i]+1; вход.закрыть(); } Как это??? - person paul_1991; 30.04.2011
comment
Пол, нет, извините, у вас все та же проблема... Пожалуйста, смотрите мои правки выше. Как правило, производительность требует, чтобы мы не перечитывали файл больше, чем это необходимо, даже если он достаточно мал и помещается в кэш. Еще одно общее правило при работе с циклами внутри циклов — делать меньшую часть внутри. Это имеет для вас смысл? - person corlettk; 30.04.2011

У вас есть два варианта:

  • сбросьте FileReader (FieldReader.reset) вместо этого и создайте новый буферизованный читатель.
  • использовать функциональные возможности пометки (попробуйте BufferedReader.markSupported)

Я думаю, что вы пытались вызвать метку после того, как прочитали ввод. Вместо этого сделайте следующее:

inp.mark(readAheadLimit);    
// .... all your code processing input
inp.reset();
person Howard    schedule 30.04.2011

mark(int readAheadLimit) принимает readAheadLimit параметр.

Вы не должны устанавливать readAheadLimit в 0. Попробуйте использовать значимое число, которое больше, чем количество байтов, которые вы читаете в итерации.

person Peter Knego    schedule 30.04.2011