java:从File或String获取行的接口?

时间:2011-03-22 15:17:09

标签: java file iterator

我有一个迭代文件行的方法。目前它完成了打开文件并关闭它的整个舞蹈。

现在我想更改方法,以便我可以传入某个接口的实例,可能是Iterator<String>,这样我就可以 从文件中读取如果我想直接提供输入,只需从List<String>获取行。

有没有方便的方法呢?编写我自己从Iterator<String>派生File的方法似乎很难弄清楚。

我想我能想到的最接近的方法是使用Guava的Files.readLines(),但这不是迭代器,所以它对于非常大的文件有问题。

5 个答案:

答案 0 :(得分:4)

java.io.Scanner实现了Iterator,所以我认为这正是你想要的。编写您的方法以期望迭代器,然后您可以传递在文件上打开的扫描程序,或从字符串列表中传递迭代器。

答案 1 :(得分:1)

编写一个只包含Iterator(约BufferedReader或类似)FileReader的{​​{1}}实现方式并不会让我感到困难。

正如自卷式迭代器实现一样,您可能需要执行单元素预测才能正确实现hasNext(),但除了皱纹之外,您可以或多或少地委托给{{ 1}}。

事实上,我不会感到惊讶的是,已经有第三方课程这样做了(尽管我目前还不知道)。

答案 2 :(得分:1)

Apache Commons IOLineIterator个班级。来自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);
    }
}