我应该如何在不获取 FileNotFoundException 的情况下读取文本文件?

How should I read a text file without getting FileNotFoundException?

我正在为我的计算机科学的期末作业编写一个单词搜索生成器程序 class。

我创建了一个名为 "Words" 的文本文件,其中包含字母表中 26 个字母中每个字母的 10 个单词。我指的是通过读取此文本文件并将单词存储在数组列表中。

我使用了我在此处获得的反馈并进行了一些更改。我已经定义了 fileName 是什么,并且我已经插入了我的文本文件的确切位置。

这是我更新后的代码:

public static List<String> readWords () throws IOException {

        String fileName = ("C:\Users\Dell\workspace\Final Summative\src\Words.txt");

        int maxLength = Math.max(rows, cols);

        List<String> words = new ArrayList<>(); // The words from the Words text file will be stored in this array list

        try (Scanner sc = new Scanner(new FileReader(fileName))) {      

            while (sc.hasNextLine()) {

                String s = sc.next().trim().toLowerCase();

                if (s.matches("^[a-z]{3," + maxLength + "}$")) { // We will pick only words with length = 3 and max. length, and [a-z] inside

                    words.add(s.toUpperCase());

                }//end of if

            }//end of while loop

        } catch (IOException e) {

            // Manage the error!

            e.printStackTrace();

        }//end of catch

        return words;

    }//end of readWords(fileName)

当我 运行 我现在的代码时,我得到一个 FileNotFoundException。我仔细检查了我的文本文件是否在正确的文件夹中,但我仍然遇到此错误。它是这样说的:

java.io.FileNotFoundException: C:\Users\Dell\workspace\Final Summative\src\Words.txt (The system cannot find the file specified)
    at java.io.FileInputStream.open0(Native Method)
    at java.io.FileInputStream.open(Unknown Source)
    at java.io.FileInputStream.<init>(Unknown Source)
    at java.io.FileInputStream.<init>(Unknown Source)
    at java.io.FileReader.<init>(Unknown Source)
    at WordSearch.readWords(WordSearch.java:76)

首先,您没有在 s.matches("^[a-z]{3," + maxLength + "]$".
中正确地关闭括号 { } 很可能文件名没有正确给出。
检查它是否类似于:readWords("C:/Users/Username/Desktop/words.txt") 如果您的文本文件在桌面上。

如果您真正需要做的只是阅读文件中的所有行,那么在更现代的 Java 版本中有一个快捷方式:Files.lines

事实上,如果您有一个匹配单词的模式,那么您可以使用 Matcher.resultsMatchResult.group 一次性完成所有操作:

Files.lines(path)
    .map(pattern::matcher)
    .flatMap(Matcher::results)
    .map(MatchResult::group)
    .collect(Collector.toList());

但是我不确定您是否已经研究过流或者您可以使用哪些库。

请注意,我已在此处收集到列表,但收集到集合(假设您不需要了解重复项)或地图(如果是,则以首字母作为键)可能更有意义对单词的使用很重要)。