Java BufferedWriter 不工作

标签 java bufferedwriter

我在使用 BufferedWriter 时遇到问题。我正在阅读一个 50,000 个单词的单词列表,使用词干提取算法并创建一个仅包含单词词干的新单词列表。而不是这个包含任何词干的新文件,但它实际上只包含:

-

这是我的代码:

public static void main(String[] args) {
    BufferedReader reader=null;
    BufferedWriter writer=null;
    try {
        writer = new BufferedWriter(new FileWriter(new File("src/newwordlist.txt")));
        HashSet<String> db = new HashSet<String>();
        reader = new BufferedReader(new InputStreamReader(new FileInputStream("src/wordlist"),"UTF-8"));
        String word;
        int i=0;
        while ((word=reader.readLine())!=null) {
            i++;
            Stemmer s= new Stemmer();
            s.addword(word);
            s.stem();
            String stem =s.toString();
            if(!db.contains(stem)){
                db.add(stem);
                writer.write(stem);
                //System.out.println(stem);
            }
        }
        System.out.println("Reduced file from " + i + " words to " + db.size());
        reader.close();
        writer.close();
    } catch (IOException e1) {
        e1.printStackTrace();
    }
}

我在控制台上得到的输出是:

Reduced file from 58110 words to 28201

所以我知道它的工作原理。我还尝试将 writer.write(stem); 更改为 writer.write("hi"); 我仍然在 newwordlist.txt< 中得到相同的输出。 我知道这不是 Stemmer 类的错,我已经尝试输出主干字符串(我在其中注释了代码)并向控制台生成了正确的输出,所以错误一定出在作者身上,但我不明白是什么。


编辑 1

我将代码简化为:

        BufferedReader reader=null;
        BufferedWriter writer=null;
        try {
            writer = new BufferedWriter(new FileWriter(new File("src/newwordlist.txt")));
            HashSet<String> db = new HashSet<String>();
            reader = new BufferedReader(new InputStreamReader(new FileInputStream("src/wordlist.txt"),"UTF-8"));
            String word;
            int i=0;
            while ((word=reader.readLine())!=null) {
                i++;
                if(!db.contains(word)){
                    db.add(word);
                    writer.write("hi");
                }
            }
            System.out.println("Reduced file from " + i + " words to " + db.size());
            reader.close();
            writer.close();
        } catch (IOException e1) {
            e1.printStackTrace();
        }

现在我得到控制台输出:

Reduced file from 58110 words to 58109

但是输出文件还是空白

最佳答案

我希望问题中给出的代码生成一个由一行组成的文件,该文件由所有串联的“词干”组成。 (或者在“hi”版本中,一行“hihihi....”重复了很多次。)

可以想象,无论您使用什么来查看文件,都无法处理由数千个字符组成的输入文件……而且没有行尾。

改变

    writer.write(stem);

    writer.write(stem);
    writer.write(EOL);

其中 EOL 是平台特定的行尾序列。


假设您使用的是 Java 7,最好使用 try-with-resource 来确保输出流始终关闭/刷新,即使出现错误也是如此:

public static void main(String[] args) {
    try (BufferedReader reader = new BufferedReader(
             new InputStreamReader(new FileInputStream("src/wordlist"), "UTF-8"));
         BufferedWriter writer = new BufferedWriter(new FileWriter(
             new File("src/newwordlist.txt")));
        HashSet<String> db = new HashSet<>();
        String EOL = System.getProperty("line.separator");
        String word;
        int i = 0;
        while ((word = reader.readLine()) != null) {
            i++;
            Stemmer s = new Stemmer();
            s.addword(word);
            s.stem();
            String stem = s.toString();
            if (db.add(stem)) {
                writer.write(stem);
                writer.write(EOL);
            }
        }
        System.out.println("Reduced file from " + i + " words to " + db.size());
    } catch (IOException e1) {
        e1.printStackTrace();
    }
}

(我也整理了一些其他的东西......)

关于Java BufferedWriter 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18595856/

相关文章:

java - 带窗口的 KTable 会产生错误的类型

java - 并非所有字段都由 toJson() 序列化

java - BufferedWriter - 程序执行期间流过早关闭

java - 交替使用 OutputStream、Output Stream Writer 和 BufferedWriter

Java - 将 ArrayList 打印到文本文件中

java - amazon s3 get 请求的多线程问题

java - 多次调用 Button 的 OnClickListener

java - 运行用户创建的 Java 类

java - 不关闭 BufferedWriter 的后果是什么

java - 在 Java 中使用 BufferedWriter 格式化双输出