0

次のコードがありますが、ポインターを開始位置にリセットする方法がわかりません。

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();

結果なし。

4

3 に答える 3

1

ポール、

この古いスレッドを読むことをお勧めします: Java BufferedReader back to the top of a text file? .

個人的には、Jon Skeet の応答が好きです。これは、「気にしないでください [必要でない限り]」に要約されます。

乾杯。キース。


編集:また、例外に遭遇した場合でも、常にその入力ファイルを閉じる必要があります。ブロックはこれfinallyに最適です。


EDIT2:

あなたがまだ私たちと一緒にいることを願っています。

ここに私の試みがあります.FWIW、入力ファイルをリセットする必要はありません.andループ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 年代です。Map の「デフォルト」実装はHashMapクラスです...デフォルトでは、Map が必要なときはいつでも HashMap を使用することを意味します。HashMap は、一般的に最高のオールラウンド パフォーマーです。

于 2011-04-30T10:40:50.910 に答える
0

次の 2 つのオプションがあります。

  • 代わりにFileReader ( FieldReader.reset) をリセットし、新しい bufferedreader を作成します。
  • マーク機能を使用する (試してみるBufferedReader.markSupported)

あなたが試みたのは、入力を読んだ後にマークを呼び出すことだと思います。代わりに、次のようにします。

inp.mark(readAheadLimit);    
// .... all your code processing input
inp.reset();
于 2011-04-30T10:41:55.703 に答える
0

mark(int readAheadLimit)パラメータを取りreadAheadLimitます。

を 0 に設定しないでreadAheadLimitください。反復で読み取るバイト数よりも大きい意味のある数値を使用してみてください。

于 2011-04-30T10:42:47.203 に答える