如何读取文件然后向后退?

时间:2019-06-19 09:12:50

标签: java file

我有一个很大的文件,里面有一些数据,比如说水果和有关它们的信息。

我将寻找关键字(例如Apple) 那么我想阅读以下与苹果相关的2行信息并将其添加到苹果。问题是某些水果后面紧跟着三行,我想默认读取三行,如果只有两行,我想向后走(因为我将读取下一个水果并且不会晃动)再次向其添加信息)

我正在用Java编程。

3 个答案:

答案 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..