Возможно, вы забыли расширение файла при вводе, но есть гораздо более простой способ сделать это.Вы также упоминаете, что не знаете, как считать персонажей.Вы можете попробовать что-то вроде этого:
import java.util.Scanner;
import java.util.StringTokenizer;
import java.io.*;
import java.util.stream.*;
public class WordCount
{
public static void main(String[] args)
{
Scanner userInput = new Scanner(System.in);
try {
// Input file
System.out.println("Please enter the name of the file.");
String content = Files.readString(Path.of("C:/Users/garre/OneDrive/Desktop/" + userInput.next()));
System.out.printf("Lines: %d\nWords: %d\nCharacters: %d",content.split("\n").length,Stream.of(content.split("[^A-Za-z]")).filter(x -> !x.isEmpty()).count(),content.length());
}
catch (IOException ex1) {
System.out.println("Error.");
System.exit(0);
}
}
}
Проходя по коду
import java.util.stream.*;
Обратите внимание, что мы используем пакет streams для фильтрации пустых строк при поиске слов.Теперь давайте немного перейдем вперед.
String content = Files.readString(Path.of("C:/Users/garre/OneDrive/Desktop/" + userInput.next()));
Приведенная выше часть получает весь текст в файле и сохраняет его в виде строки.
System.out.printf("Lines: %d\nWords: %d\nCharacters: %d",content.split("\n").length,Stream.of(content.split("[^A-Za-z]")).filter(x -> !x.isEmpty()).count(),content.length());
Хорошо, это длинная строка,Давайте разберем его.
"Lines: %d\nWords: %d\nCharacters: %d"
- это строка формата, где каждый %d
заменяется соответствующим аргументом в функции printf
.Первый %d
будет заменен на content.split("\n").length
, который является количеством строк.Мы получаем количество строк, разбивая строку.
Второй %d
заменяется на Stream.of(content.split("[^A-Za-z]")).filter(x -> !x.isEmpty()).count()
.Stream.of
создает поток из массива, а массив представляет собой массив строк после того, как вы разбили все, что не алфавитно (вы сказали, что слова - это все, что не алфавитно).Далее мы отфильтровываем все пустые значения, так как String.split
сохраняет пустые значения..count()
говорит само за себя, принимает количество слов, оставшихся после фильтрации.
Третий и последний %d
является самым простым.Он заменяется длиной строки.content.length()
должно быть само за себя.
Я оставил ваш catch
блок без изменений, но я чувствую, что System.exit(0)
немного избыточен.