我有一个很大的文件,里面有一些数据,比如说水果和有关它们的信息。
我将寻找关键字(例如Apple) 那么我想阅读以下与苹果相关的2行信息并将其添加到苹果。问题是某些水果后面紧跟着三行,我想默认读取三行,如果只有两行,我想向后走(因为我将读取下一个水果并且不会晃动)再次向其添加信息)
我正在用Java编程。
答案 0 :(得分:0)
您可以像这样在while
循环中读取它并进行处理:
// will contain active fruit
String currentFruit = null;
while (true) {
if (currentFruit == null) {// only read to fruit if there is no active fruit
currentFruit = reader.readLine();
if (currentFruit == null) // end of file
break;
}
if (currentFruit != null && isFruit(currentFruit)) {
// read first line
String line1 = reader.readLine();
// check for end of file
if (line1 == null)
break;
// read second line
String line2 = reader.readLine();
// check for end of file
if (line2 == null)
break;
// read third line
String line3 = reader.readLine();
if (line3 == null || isFruit(line3)) {
// third line was actually a fruit, so set currentFruit to line3
// and clear line 3
currentFruit = line3;
line3 = null;
} else {
// clear fruit
currentFruit = null;
}
// process fruit
processFruit(currentFruit, line1, line2, line3);
}
};
答案 1 :(得分:0)
我假设您正在用Java阅读流中的文件,在这种情况下,我们可以使用Mark,reset函数来实现这一点。
https://docs.oracle.com/javase/7/docs/api/java/io/BufferedInputStream.html#mark%28int%29
来自文档:
标记 公共无效标记(int readlimit) 请参见InputStream的mark方法的常规协定。 覆写: 类FilterInputStream中的标记 参数: readlimit-标记位置变为无效之前可以读取的最大字节数限制。 也可以看看: 重启() 重置
public void reset() 引发IOException 请参见InputStream的reset方法的常规协定。 如果markpos为-1(未设置标记或标记无效),则抛出IOException。否则,将pos设置为等于markpos。
答案 2 :(得分:0)
这不是OP的确切答案,而是一项建议。您无需向后退文件。我只是缓冲行并继续处理。这是我的意思是伪的(对于您的情况,100应该足够):
unprocessedLines = EMPTY_ARRAY_OF_STRING;
till end of file: {
read 100 lines + unprocessedLines in the buffer
unprocessedLines = process() // maybe the last 2 lines needs more info
}
// so on..