我有一个迭代文件行的方法。目前它完成了打开文件并关闭它的整个舞蹈。
现在我想更改方法,以便我可以传入某个接口的实例,可能是Iterator<String>
,这样我就可以 从文件中读取或如果我想直接提供输入,只需从List<String>
获取行。
有没有方便的方法呢?编写我自己从Iterator<String>
派生File
的方法似乎很难弄清楚。
我想我能想到的最接近的方法是使用Guava的Files.readLines(),但这不是迭代器,所以它对于非常大的文件有问题。
答案 0 :(得分:4)
java.io.Scanner实现了Iterator,所以我认为这正是你想要的。编写您的方法以期望迭代器,然后您可以传递在文件上打开的扫描程序,或从字符串列表中传递迭代器。
答案 1 :(得分:1)
编写一个只包含Iterator
(约BufferedReader
或类似)FileReader
的{{1}}实现方式并不会让我感到困难。
正如自卷式迭代器实现一样,您可能需要执行单元素预测才能正确实现hasNext()
,但除了皱纹之外,您可以或多或少地委托给{{ 1}}。
事实上,我不会感到惊讶的是,已经有第三方课程这样做了(尽管我目前还不知道)。
答案 2 :(得分:1)
Apache Commons IO有LineIterator
个班级。来自Javadoc:
推荐的使用模式是:
LineIterator it = FileUtils.lineIterator(file, "UTF-8"); try { while (it.hasNext()) { String line = it.nextLine(); // do something with line } } finally { it.close(); }
答案 3 :(得分:0)
尝试类似
的内容interface ISourceOfLines
{
List<String> getLines();
}
public class FileSource : ISourceOfLines
{
public FileSource(String filename)
{
// store fileName
}
public List<String> getLines()
{
// open file and return lines
}
}
答案 4 :(得分:0)
我最终编写了自己的接口和两个实现它的轻量级类,一个封装了Iterator<String>
,一个从文件中获取输入:
LineReader2.java:
import java.io.Closeable;
import java.io.IOException;
public interface LineReader2 extends Closeable
{
void close() throws IOException;
String readLine() throws IOException;
}
LineReaders2.java:
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
import java.util.Iterator;
public class LineReaders2
{
private LineReaders2() {}
static class FileLineReader implements LineReader2
{
final private BufferedReader br;
public FileLineReader(Reader in)
{
this.br = new BufferedReader(in);
}
@Override public void close() throws IOException {
this.br.close();
}
@Override public String readLine() throws IOException {
return this.br.readLine();
}
}
static class StringIteratorReader implements LineReader2
{
final private Iterator<String> it;
public StringIteratorReader(Iterator<String> it) {
this.it = it;
}
@Override public void close() {}
@Override public String readLine() {
return this.it.hasNext() ? this.it.next() : null;
}
}
static public LineReader2 createReader(File f) throws IOException
{
return new FileLineReader(new FileReader(f));
}
static public LineReader2 createReader(Iterable<String> iterable)
{
return new StringIteratorReader(iterable.iterator());
}
static public LineReader2 createReader(Iterator<String> iterator)
{
return new StringIteratorReader(iterator);
}
}