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

Вот мой код:

import java.util.*;
import java.io.*;
import java.nio.*;

public class WordCounter
{
    private static Scanner input;

    public static void main(String[] args)
    {
        if (0 < args.length) {
        String filename = args[0];
        File file = new File(filename);
        }

    openFile();
    readRecords();
    closeFile();
    }

    public static void openFile()
   {
      try
      {
         input = new Scanner(new File(file)); 
      } 
      catch (IOException ioException)
      {
         System.err.println("Cannot open file.");
         System.exit(1);
      } 
  }

    public static void readRecords()
   {
        int total = 0;
        while (input.hasNext()) // while there is more to read
            {
                total += 1;
            }
        System.out.printf("The total number of word without duplication is: %d", total);
     }

    public static void closeFile()
   {
      if (input != null)
         input.close();
   }    
}

Каждый раз, когда я пробовал, я получаю разные ошибки, и наиболее последовательная из них - «не удается найти символ» для аргумента файла в

input = new Scanner(new File(file));

Я также до сих пор не совсем уверен, в чем разница между java.io и java.nio, поэтому я попытался использовать объекты из обоих. Я уверен, что это очевидная проблема, я просто не вижу ее. Я читал здесь много похожих постов, и отсюда часть моего кода.

Я получил программу для компиляции раньше, но затем она зависает в командной строке.

2
presence 26 Ноя 2016 в 22:58

2 ответа

Лучший ответ

java.nio - это новая улучшенная версия java.io. Вы можете использовать любой из них для этой задачи. Я протестировал следующий код в командной строке, и, похоже, он работает нормально. Сообщение об ошибке «не удается найти символ» разрешается в блоке try. Я думаю, вы запутали компилятор, дважды создавая экземпляр объекта File с именем file. Как ответил @dammina, вам нужно добавить input.next(); в цикл while, чтобы Сканер перешел к следующему слову.

import java.io.File;
import java.io.IOException;
import java.util.Scanner;

public class WordCounter {

    private static Scanner input;

    public static void main(String[] args) {

        if(args.length == 0) {
            System.out.println("File name not specified.");
            System.exit(1);
        }

        try {
            File file = new File(args[0]);
            input = new Scanner(file);
        } catch (IOException ioException) {
            System.err.println("Cannot open file.");
            System.exit(1);
        }

        int total = 0;
        while (input.hasNext()) {
            total += 1;
            input.next();
        }

        System.out.printf("The total number of words without duplication is: %d", total);

        input.close();
    }

}
1
PEF 26 Ноя 2016 в 21:17

Ваш код почти правильный. Дело в том, что в цикле while вы указали условие завершения следующим образом:

while (input.hasNext()) // пока есть что почитать

Однако, поскольку вы просто увеличиваете счетчик, не переходя к следующему слову, счетчик просто увеличивается, всегда считая первое слово. Чтобы заставить его работать, просто добавьте input.next () в цикл, чтобы переходить к следующему слову на каждой итерации.

while (input.hasNext()) // while there is more to read
{
total += 1;
input.next();
}
1
dammina 26 Ноя 2016 в 20:47