繁体   English   中英

Java:多行文件读取迭代器

[英]Java: Multi-line File Read Iterator

我试图覆盖LineIterator类(org.apache.commons.io)中的next()nextLine()方法。 基本上,我想为每次调用指定从文本文件读取的最大行数(基类的默认当然是1)。

这是我想出的派生类。 不幸的是,它引发了StackOverflowError异常。

import java.io.File;
import java.io.FileReader;
import java.io.Reader;

import org.apache.commons.io.LineIterator;

public class MultiLineIterator extends LineIterator{
    int maxLines = 1;

    public static void main(String[] args) throws Exception {
        File file = new File ("/path/to/inputfile.txt");

        LineIterator iterator = new MultiLineIterator(new FileReader(file), 3);

        while(iterator.hasNext()) {
            System.out.println(iterator.next());
        }
    }


    public MultiLineIterator(Reader reader, int maxLines) {
        super(reader);
        this.maxLines = maxLines;
    }

    @Override
    public String next() {
        String retVal = null;
        if(hasNext()) {
            retVal = "";
        }

        String nextFragment = "";
        for(int i = 1; i <= maxLines; i++) {
            if(hasNext()) {
                nextFragment = super.next();
                retVal += (nextFragment + " ");
            }
            else
                break;
        }
        return retVal;
    }


    @Override
    public String nextLine() {
        return next();
    }
}

要修复StackOverflowError,您应该删除:

@Override
public String nextLine() {
    return next();
}

,因为您具有无限递归:

this:next() -> super:next() -> this:nextLine() -> this:next() -> ... and so on

我也建议不要以这种方式覆盖next()方法,这会导致结果不一致。 我建议使用简单的计数器。 在下一行增加它,并检查hasNext上的计数器:

public class MultiLineIterator extends LineIterator {
    private int maxLines = 1;
    private int cursor = 0;

    public static void main(String[] args) throws Exception {
        File file = new File("/path/inputfile.txt");

        LineIterator iterator = new MultiLineIterator(new FileReader(file), 3);

        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }
    }

    public MultiLineIterator(Reader reader, int maxLines) {
        super(reader);
        this.maxLines = maxLines;
    }

    @Override
    public boolean hasNext() {
        return (cursor < maxLines) && super.hasNext();
    }

    @Override
    public String next() {
        String next = super.next();
        cursor++;
        return next;
    }
}

在此实现中,我们不连接行,而仅限制行数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM