Как сбросить сканер?

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

    FileReader read = null;

    try {
        read = new FileReader("ModulesIn.txt");
        //scan through it and make array of strings - for each line
        Scanner scan = new Scanner(read);
        while(scan.hasNextLine()){
            numOfMods++;
            scan.nextLine();
        }

        scan.reset();

        lines = new String[numOfMods];

        for(int i = 0; i < numOfMods; i++)
            lines[i] = scan.nextLine();

Это фрагмент кода, который имеет отношение.


person Seif    schedule 16.01.2016    source источник
comment
Возможный дубликат сброса сканера .nextLine()   -  person Whymarrh    schedule 16.01.2016


Ответы (2)


Пропустите использование стандартного массива... пустая трата времени на сканирование файла, а затем повторное сканирование. Вместо этого используйте arraylist, который имеет динамический размер, а затем преобразуйте его в стандартный массив.

 BufferedReader in = new BufferedReader(new FileReader("path/of/text"));
        String str;

        List<String> list = new ArrayList<String>();
        while((str = in.readLine()) != null){
            list.add(str);
        }

        String[] stringArr = list.toArray(new String[0]);
person Exziled    schedule 16.01.2016

"Однако это требует сканирования файла дважды..." ...

Нет, это не так. См. ответ @Exziled для лучшего (более простого и эффективного) способа, который не сканирует файл дважды.

Но чтобы ответить на ваш вопрос, нет способа сбросить Scanner до начала потока. Вам нужно будет сбросить базовый поток, а затем создать новый Scanner. (И, конечно же, некоторые виды потоков не поддерживают сброс.)

Для записи метод Scanner.reset() сбрасывает разделитель сканера, локаль и состояние системы счисления. Он не меняет положение сканера.

person Stephen C    schedule 16.01.2016