![](/img/trans.png)
[英]How to read multi-line content between two words from a PDF file using 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.