读取文本文件(~90,000个单词)并尝试将每个单词添加到字符串的ArrayList中

时间:2017-05-03 00:43:43

标签: java string arraylist filereader tokenize

我的方法读取并打印文件,但我在将每个单词添加到ArrayList dict时遇到问题。

读者一次读取一个字符的文件,所以我写的内容将每个字符添加到dict:[c,a,t,d,o,g]当我想要[cat,dog] 。文本文件各有单词;我该如何区分它们呢?

到目前为止我的代码:

public static List Dictionary() {
    ArrayList <String> dict = new ArrayList <String>(); 

    File inFile = new File("C:/Users/Aidan/Desktop/fua.txt");   
    FileReader ins = null;

    try {
        ins = new FileReader(inFile);

        int ch;

        while ((ch = ins.read()) != -1) {
            System.out.print((char) ch);

            dict.add((char) ch + "");
        }
    } catch (Exception e) {
        System.out.println(e);
    } finally {
        try {
            ins.close();
        } catch (Exception e) {
        }
    }
    return dict;
}

4 个答案:

答案 0 :(得分:0)

查看此处的答案,其中显示了如何使用扫描程序从文件中获取文字:Read next word in java

您不想打印出单词,而是将它们附加到ArrayList。

答案 1 :(得分:0)

由于read的{​​{1}}方法一次只能读取一个字符且你想要什么,我建议你使用FileReader来读取文件。

Scanner

答案 2 :(得分:0)

您可以将FileReader包裹在BufferedReader中,readLine()具有readLine()方法,可以一次为您提供整行(字)。当没有更多行要阅读时,null会返回{{1}}。

答案 3 :(得分:0)

请遵守Java命名约定,因此readDictionary代替Dictionary(类似于类名)。接下来,我将fileName传递给方法(而不是在方法中对路径进行硬编码)。我会使用Scanner而不是重新发明轮子。您也可以在此使用try-with-resources代替finally(以及菱形运算符)。像,

public static List<String> readDictionary(String fileName) {
    List<String> dict = new ArrayList<>();

    try (Scanner scan = new Scanner(new File(fileName))) {
        while (scan.hasNext()) {
            dict.add(scan.next());
        }
    } catch (Exception e) {
        System.out.printf("Caught Exception: %s%n", e.getMessage());
        e.printStackTrace();
    }
    return dict;
}

或者,自己使用BufferedReadersplit每个单词。像,

public static List<String> readDictionary(String fileName) {
    List<String> dict = new ArrayList<>();

    try (BufferedReader br = new BufferedReader(new FileReader(
                new File(fileName)))) {
        String line;
        while ((line = br.readLine()) != null) {
            if (!line.isEmpty()) {
                Stream.of(line.split("\\s+"))
                        .forEachOrdered(word -> dict.add(word));
            }
        }
    } catch (Exception e) {
        System.out.printf("Caught Exception: %s%n", e.getMessage());
        e.printStackTrace();
    }
    return dict;
}

但这基本上就是第一个例子。