Создание пользовательского итератора, который читает последовательные файлы - PullRequest
2 голосов
/ 03 февраля 2012

У нас есть

public class UKWacSentenceIterator implements SentenceIterator

, который явно Tterator, но у меня нет никакой информации о том, что в SentenceIterator. У этого класса есть это свойство: Scanner fileScanner.

Идея состоит в том, что конструктор принимает массив файлов:

public UKWacSentenceIterator() throws IOException {
    Properties p = new Properties();
    p.load(prop.class.getClassLoader()
           .getResourceAsStream("sources/ukwacdump.properties"));
    Enumeration<Object> keys = p.elements();  
    while (keys.hasMoreElements()) { 
        source.add(keys.nextElement());
    }
    fileScanner = new Scanner(new File((String) source.get(0)));
}

И в основном методе мы можем использовать цикл for:

public static void main(String[] args) throws IOException {
    for(String line : new UKWacSentenceIterator()) {
        System.out.println(line);   
    }
}

У него в настоящее время есть проблема с этим циклом for, потому что как только первый файл будет EOF, for просто останавливается. Поэтому он подумал, что будет хорошей идеей переопределить

@Override
public boolean hasNext() {
    if(tmp != null) {
        return true;
    }
    if (this.fileScanner.hasNext()) {
        try {
            this.skipToSequenceStart();
            String sent = this.scanSentence();
            this.tmp = sent;
            return true;
        } catch (Exception e) {
            return false;
        }
    } else {
        return advanceFileScanner();
    }
}

Но он не знает, как построить advanceFileScanner().

Моя идея состоит в том, чтобы просто присвоить переменной fileScanner новый Scanner со следующим именем файла, а затем просто скопировать

this.skipToSequenceStart();
String sent = this.scanSentence();
this.tmp = sent;
return true;

Я не знаю, пытался ли он еще. Мне было интересно, если вы думаете, это хорошая идея, и если вы можете предложить мне хороший учебник о том, как создать повторяемый объект. Потому что сейчас я просто догадываюсь, я не знаю, какой цикл for использует, кроме hasNext().

1 Ответ

0 голосов
/ 03 февраля 2012

Я не уверен, но это не ваша проблема, просто что ваш

fileScanner = new Scanner(new File((String) source.get(0)));

содержит только 1 файл

Я объясняю.Я использую для чтения во многих файлах заданный массив строк всех файлов, которые я должен прочитать.Я, я делаю это таким образом, я просто объявляю как [].Я даю вам пример моего кода.

BufferedReader[] reader = new BufferedReader[myArrayFiles.length];
for (int i = 0; i < myArrayFiles.length; i++) {
    reader[i] = new BufferedReader(new FileReader(myArrayFile[i]));
    //do my reading
    reader.close();
}

Это с буферизованным ридером, но я думаю, что вы можете применить его к своему коду.Не могли бы вы сделать что-то подобное (источник является массивом? Я полагаю, да, поэтому я использую длину. Возможно, это «size ()» в вашем случае).кода для обработки массива файловых сканеров

Надеюсь, это поможет

...