2014-07-18 5 views
-1

Я создал метод под названием readFileAsScanner. Он создает файл и Scanner, который прикрепляется к файлу. Затем возвращает Scanner.Почему сканер нельзя использовать повторно?

Тем не менее, я использую его. Scanner может использоваться только один раз. Зачем? Могу ли я сбросить его методом reset()Scanner, чтобы сделать его многоразовым?

import java.io.*; 
import java.util.*; 
public class Lab10{ 
    public static void main(String[] args)throws FileNotFoundException{ 
     String[] words = readWords(); 
     int i; 
     for(i=0;i<words.length;i++) 
      System.out.println(words[i]); 
     System.out.println(words.length); 
    } 

    public static String[] readWords()throws FileNotFoundException{ 
     Scanner data = readFileAsScanner(); 
     String[] words = new String[estimateWords(data)]; 
     int i=0; 
     while(data.hasNext()){ 
      System.out.println(data.next());  
     } 
     return words; 
    } 
    public static Scanner readFileAsScanner() throws FileNotFoundException{ 
     Scanner input = new Scanner(System.in); 
     System.out.println("Input file name:"); 
     //String fileName = input.next(); 
     String fileName = "unsorted.txt"; 
     Scanner data = new Scanner(new File(fileName)); 
     return data;  
    } 
    public static int estimateWords(Scanner data){ 
     int estimatedSize = 0; 
     while(data.hasNext()){ 
      data.next();  
      estimatedSize++;  
     } 
     return estimatedSize; 
    } 

} 
+1

Ваш сканер, похоже, прикреплен к 'System.in'; а не файл. –

+0

У меня есть два сканера. Второй - тот, который я прошу. – Fan

ответ

1

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

Вы можете исправить это одним из двух способов:

  • Откройте файл дважды с Scanner, например, в каждом вызове метода и передать имя файла, или
  • Откройте файл один раз, выполнить как на подсчет и чтение данных только одним способом.

Я бы выбрал последнее, так как это было бы более просто и лучше (обычно вы не видите Scanner экземпляров).

+0

Нет способа сбросить сканер с самого начала? – Fan

+0

Нет. Не позволяйте 'reset()' обманывать вас; он не сбрасывает позицию последнего пятна считывания «Сканера». – Makoto

0

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

Смежные вопросы