Java: интерфейс для получения строк из файла или строки? - PullRequest
3 голосов
/ 22 марта 2011

У меня есть метод, который перебирает строки файла.В настоящее время он выполняет весь процесс открытия файла и его закрытия.

Теперь я хочу изменить метод, чтобы я мог передать экземпляр некоторого интерфейса, возможно, Iterator<String>, чтобы я мог либо для чтения из файла, или просто получите строки из List<String>, если я хочу предоставить ввод напрямую.

Есть ли удобный способ сделатьэтот?Написание моего собственного метода получения Iterator<String> из File кажется очень сложным, чтобы получить правильное значение.

Я думаю, что самый близкий способ, который я могу придумать, - это использовать файлы Guava.readLines () , но это не итератор, поэтому у него проблемы с очень большими файлами.

Ответы [ 5 ]

4 голосов
/ 22 марта 2011

java.io.Scanner реализует Iterator, так что я думаю, что это именно то, что вы хотите. Напишите свой метод, чтобы ожидать Итератор, и тогда вы могли бы передать Сканер, открытый в файле, или Итератор из списка Строк.

1 голос
/ 23 февраля 2014

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();
}
1 голос
/ 22 марта 2011

Мне не кажется слишком сложным написать реализацию Iterator, которая просто оборачивает BufferedReader (около FileReader или аналогичное).

Как это обычно происходит с самообращающимся итераторомреализации, вам может потребоваться сделать одноэлементный упреждающий просмотр, чтобы правильно реализовать hasNext(), но помимо этой складки вы можете более или менее просто делегировать BufferedReader.readLine().

Фактически, это неНе удивляюсь, когда узнаю, что уже существует сторонний класс, который делает это (хотя я не знаю ни одного в настоящее время).

0 голосов
/ 22 марта 2011

В итоге я написал свой собственный интерфейс и два легких класса, которые его реализуют, один из которых инкапсулирует 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);
    }
}
0 голосов
/ 22 марта 2011

попробуйте что-то вроде

interface ISourceOfLines
{
       List<String> getLines();
}

public class FileSource : ISourceOfLines
{
      public FileSource(String filename)
      {
          // store fileName
      }

      public List<String> getLines()
      {
         // open file and return lines
      }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...