4

我在用 java 读取文件时遇到了一些问题。它绝对是巨大的(2,5G),调整我的记忆也无济于事。数据都在一行上,所以我不能一次读取一行。我想做的是读取文件,直到找到某个字符串,例如“<|start|>”或“<|end|>”,然后在这些字符串之间打印数据,这样内存就被清除了,我可以继续阅读文件的其余部分。所以我基本上在寻找一种阅读器,它从某个起始字符串开始阅读,并在一个停止字符串处停止阅读。谁能帮我?

4

3 回答 3

9

您需要打开 a Reader(例如,BufferedReader包装InputStreamReadera 包装 a )并使用orFileInputStream一次读取块。由您负责查找令牌 - 包括它以一个块开始并以另一个块结束的情况。还要注意可能不会填满缓冲区;您需要使用返回值来查看它实际写入数组的数据量。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 回答