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