Search code examples
javastringarraylistfilereadertokenize

Reading a text file (~90,000 words) and trying to add each word into an ArrayList of strings


My method read and prints the file, but I am having trouble adding each word to the ArrayList dict.

The reader reads the file one char at a time, so what I have written adds each char to dict: [c,a,t,d,o,g] when I want [cat,dog]. The text file has the words on their own line; how can I distinguish them?

My code so far:

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;
}

Solution

  • Please observe Java naming conventions, so readDictionary instead of Dictionary (which looks like a class name). Next, I would pass the fileName into the method (instead of hard-coding the path in your method). Instead of reinventing the wheel, I would use a Scanner. You can also use the try-with-resources instead of finally here (and the diamond operator). Like,

    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;
    }
    

    Alternatively, use a BufferedReader and split each word yourself. Like,

    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;
    }
    

    But that is basically what the first example does.