4

Java でファイルを読み取る際に問題が発生しています。それは絶対に巨大で (2,5G)、メモリを調整しても役に立ちません。データはすべて 1 行にあるため、一度に 1 行ずつ読み取ることはできません。私がしたいのは、「<|start|>」や「<|end|>」などの特定の文字列が見つかるまでファイルを読み取り、これらの文字列の間にデータを出力してメモリをクリアし、ファイルの残りを読み続けることができます。したがって、私が基本的に探しているのは、特定の開始文字列で読み取りを開始し、停止文字列で読み取りを停止するタイプのリーダーです。誰でも私を助けることができますか?

4

3 に答える 3

9

a を開きReader(例: aBufferedReaderのラッピング a のラッピングInputStreamReader) 、 orを使用FileInputStreamして一度にチャンクを読み取る必要があります。あるチャンクで始まり、別のチャンクで終わる場合を含め、トークンを見つけるのはあなた次第です。また、バッファがいっぱいにならない可能性があることに注意してください。戻り値を使用して、実際に配列に書き込まれたデータの量を確認する必要があります。read(char[], int, int)read(char[])read()

于 2010-01-27T15:47:44.977 に答える
2

Scannerがあなたのデータに適しているかどうかを確認したいと思います。useDelimiterメソッドを使用して、入力のトークン化に使用するパターンを変更できます。

于 2010-01-27T15:59:25.947 に答える
-1

この擬似コードを試してください:

 char [] start = {'<','|','s','t','a','r','t','|','>' };

 char [] start = {'<','|','e','n','d','|','>' };

 char [] buff  = new char[9];

 while( true ) {
     char c = readChar();
     if( c  == '<' ) {
         buff = readChars( 9 ) ; 
         if( buff == start ) {
             inside = true ;
             skip( 9 ); // start
         } else if( buff == end )  {
             inside = false;
             skip(7); // end 
         }
      } 
      if( inside ) {
          print( char ) ;
      }
 }

トークンが見つかるまで読み取り、フラグを立てるという考え方です。フラグがオンになっているときに値を出力し、終了トークンが見つかった場合はフラグをシャットダウンします。

以前の擬似コードをコーディングするには、いくつかの方法が必要です。この回答は後で更新します。

于 2010-01-27T15:54:41.997 に答える