Использование сканера для чтения файла

Я использую Scanner для чтения текстового файла, который содержит *, пробелы и алфавиты. Два или более пробела могут стоять один за другим. Например:

****  AAAAA* *    ****
    *******    AAAAAA*** *

Я написал следующий код:

lineTokenizer = new Scanner(s.nextLine());
int i=0;
if (lineTokenizer.hasNext()) {
    //lineTokenizer.useDelimiter("\\s");
    System.out.println(lineTokenizer.next());
    //maze[0][i]=lineTokenizer.next();
    i++;
}

LineTokenizer не читает дальше * из входного файла, а символы не сохраняются в массиве лабиринта. Можете ли вы сказать мне, где я ошибаюсь? Спасибо!


person P R    schedule 21.02.2013    source источник
comment
Чего вы хотите достичь? Не могу понять по вашему описанию.   -  person    schedule 21.02.2013
comment
@RomainSertelon Я пытаюсь прочитать файл и поместить его в двумерный массив. Строки в файле могут иметь 2 и более пробелов.   -  person P R    schedule 21.02.2013


Ответы (4)


Вы также можете использовать FileInputStreams для чтения файла с расширением BufferedReader.

Я лично использую Scanner только для ввода с консоли.

person Community    schedule 21.02.2013
comment
Спасибо! Я попробую это. - person P R; 21.02.2013

Я думаю, вы должны использовать циклы, а не только если.

Попробуйте изменить 3-ю строку на:

while (lineTokenizer.hasNext())
person Lloyd Santos    schedule 21.02.2013
comment
Но разве lineTokenizer.hasNext() не должен читать символы в ОДНОЙ строке? Может быть, я должен поставить s.nextLine() через некоторое время. Но как я могу прочитать ДВА пробела один за другим?? - person P R; 21.02.2013
comment
lineTokenizer.hasNext() проверяет, остались ли еще токены. Он не переходит к следующему токену. Чего бы вы хотели добиться, используя первую строку ввода? Хотите получить ****, ААААА* и т.д.? - person Lloyd Santos; 21.02.2013
comment
Я тоже хочу получить места. В коде, который я написал, чтение останавливается после того, как встречаются пробелы. - person P R; 21.02.2013

Поскольку вы используете условие if, указатель не движется вперед. Вы должны использовать цикл для непрерывного чтения данных со сканера. Надеюсь, это поможет.

person geekgugi    schedule 21.02.2013
comment
Да, пытался добавить время, но оно не выходит за рамки, когда встречается с пробелом. - person P R; 21.02.2013
comment
Ну, это зависит от условий, которые вы используете внутри. - person geekgugi; 12.03.2013

Я предполагаю, что код менялся много раз, пока вы пробовали разные вещи. Я не знаю, как вы справляетесь с инициализацией лабиринта, но чтобы избежать любых ArrayIndexOutOfBounds, я бы вместо этого использовал список в списке. Я сделал некоторые предположения о том, что вы хотели, и предлагаю следующее:

List<List<String>> maze = new ArrayList<>();        
Scanner s = new Scanner("****  AAAAA* *    ****\n    *******    AAAAAA*** *");
while (s.hasNextLine()) {
    List<String> line = new ArrayList<>();
    Scanner lineTokenizer = new Scanner(s.nextLine());
    lineTokenizer.useDelimiter("\\s+");
    while (lineTokenizer.hasNext()) {
        String data = lineTokenizer.next();
        System.out.println(data);
        line.add(data);
    }
    lineTokenizer.close();
    maze.add(line);
}
s.close();

Я не совсем понял ваши цели. Делает ли это то, что вы хотите? Приведенный выше код даст вам следующий список: [[****, AAAAA*, *, ****], [*******, AAAAAA***, *]]

person faern    schedule 21.02.2013
comment
Спасибо. Но я хочу прочитать последовательные пробелы из файла (char by char) и сохранить их в отдельных ячейках 2D-массива. - person P R; 21.02.2013