我在使用java读取文件时遇到了一些问题。这绝对是巨大的(2,5G),调整我的记忆并没有帮助。数据全部在一行上,所以我不能一次读取一行。我想要做的是读取文件,直到找到某个字符串,例如“< | start |>”或“< | end |>”然后在这些字符串之间打印数据,以便清除内存,我可以继续读取文件的其余部分。所以我基本上正在寻找的是一种读取器,它开始读取某个起始字符串并停止读取停止字符串。任何人都可以帮助我吗?
答案 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 ) ;
}
}
想法是读取,直到找到令牌并举起一个标志,当标志打开时,打印该值,如果找到结束令牌,则关闭该标志。
应该有很多方法来编码以前的伪代码。我稍后会更新这个答案。