Сканер в текстовом файле hasNext () бесконечен - PullRequest
5 голосов
/ 02 декабря 2011

Я пишу простую программу на Java, и она требует чтения данных из текстового файла. Однако у меня проблемы с подсчетом строк. Эта проблема кажется достаточно общей для простого поиска в Google, но я, возможно, даже не ищу нужные вещи.

Учебник, из которого я учусь, предполагает, что для подсчета количества строк в текстовом файле вы должны сделать что-то вроде этого:

public static int[] sampleDataArray(String inputFile) throws IOException
{
        File file = new File(inputFile);
        Scanner inFile = new Scanner(file);

        int count = 0;

        while (inFile.hasNext())
            count++;

        int[] numbersArray = new int[count];

        inFile.reset();
        for (int i = 0; i < count; i++)
        {
            numbersArray[i] = inFile.nextInt();
        }

        inFile.close();
        return numbersArray;
}

Мне кажется, что проблема заключается в строке while (inFile.hasNext()). Я думаю, что hasNext() работает бесконечно. Файл данных, который я использую с кодом, определенно имеет конечное число строк данных.

Что мне делать?

Ответы [ 4 ]

12 голосов
/ 02 декабря 2011

После того, как вы позвоните hasNext(), в первый раз, если вы не прочитаете файл, hasNext() всегда вернет true. Потому что передняя часть ввода не меняется.

Представьте, что у вас есть файл с этой строкой:

это ввод

Если вы позвоните hasNext() для этого файла, он вернет true, поскольку в файле есть следующий токен, в данном случае слово this.

Если вы не читаете из файла после этого начального вызова, то «следующий» ввод, который нужно обработать, ЕЩЕ остается словом this. Следующий ввод не изменится, пока вы не прочитаете из файла.

TL; DR

Когда вы вызываете hasNext() чтение из файла, в противном случае вы всегда будете иметь бесконечный цикл.

Дополнительно

Если вы действительно хотите использовать hasNext() или хотели бы, вы можете создать еще один объект Scanner и прочитать файл, чтобы посчитать строки, тогда ваш цикл будет работать нормально. Кроме того, вы должны действительно использовать hasNextLine()

public int countLines(File inFile)
{
   int count = 0;
   Scanner fileScanner = new Scanner(inFile);

   while(fileScanner.hasNextLine()) //if you are trying to count lines
   {                                //you should use hasNextLine()
       fileScanner.nextLine() //advance the inputstream
       count++;
   }

   return count;
}

Надеюсь, это полезно.

8 голосов
/ 02 декабря 2011

inFile.hasNext() не перемещает указатель на следующую строку

попробуйте

String x=null;
while((x = inFile.next()) != null)
     count++;

описание hasNext ()

Возвращает true, еслисканер имеет другой токен на входе.Этот метод может блокироваться во время ожидания ввода для сканирования.Сканер не продвигается дальше любого ввода.

http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Scanner.html#hasNext%28%29

2 голосов
/ 02 декабря 2011

Для подсчета количества строк используйте hasNextLine() вместо hasNext().
В цикле while вы должны вызвать nextLine(), потому что в вашей текущей реализации сканер статичен в первой строке.Вызов этого метода заставит его переходить к следующей строке в каждой итерации цикла.

См. Следующий фрагмент кода:

while (inFile.hasNextLine()){
  inFile.nextLine()
  count++;
}
1 голос
/ 02 декабря 2011

Вы не можете использовать сканер для подсчета количества строк в файле, потому что по умолчанию сканер использует пробел для разделения токенов.Я бы предложил использовать BufferReader и метод readline.

http://docs.oracle.com/javase/6/docs/api/java/io/BufferedReader.html

private Integer getNoOfLines( String fileName) throws FileNotFoundException,
        IOException {
    FileInputStream fstream = new FileInputStream(fileName);
    DataInputStream in = new DataInputStream(fstream);
    BufferedReader br = new BufferedReader(new InputStreamReader(in));
    String strLine;
    List<String> lineList = new ArrayList<String>();
    while ((strLine = br.readLine()) != null) {
        lineList.add(strLine);
    }
    in.close();
    return lineList.size();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...