我如何逐渐阅读大文件?

时间:2010-01-27 15:45:11

标签: java large-files

我在使用java读取文件时遇到了一些问题。这绝对是巨大的(2,5G),调整我的记忆并没有帮助。数据全部在一行上,所以我不能一次读取一行。我想要做的是读取文件,直到找到某个字符串,例如“< | start |>”或“< | end |>”然后在这些字符串之间打印数据,以便清除内存,我可以继续读取文件的其余部分。所以我基本上正在寻找的是一种读取器,它开始读取某个起始字符串并停止读取停止字符串。任何人都可以帮助我吗?

3 个答案:

答案 0 :(得分:9)

您需要打开Reader(例如BufferedReader包裹InputStreamReader包裹FileInputStream)并一次读取read(char[], int, int)read(char[])。由你来负责寻找令牌 - 包括在一个块中开始并在另一个块上结束的情况。还要注意read()可能无法填充缓冲区;你需要使用返回值来查看它实际写入数组的数据量。

答案 1 :(得分:2)

我想看看Scanner是否适合您的数据。您可以使用useDelimiter方法更改用于标记输入的模式。

答案 2 :(得分:-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 ) ;
      }
 }

想法是读取,直到找到令牌并举起一个标志,当标志打开时,打印该值,如果找到结束令牌,则关闭该标志。

应该有很多方法来编码以前的伪代码。我稍后会更新这个答案。