Java BufferedWriter无法正常工作

时间:2013-09-03 15:17:27

标签: 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();
    }
}

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

  

将文件从58110减少到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

但输出文件仍为空白

5 个答案:

答案 0 :(得分:1)

你获得Reduced file from 58110 words to 58109控制台输出的原因是你在循环后只有一个System.out.println语句。

作者应将字词写入输出文件src/newwordlist.txt,将写入控制台。如果您希望程序向控制台输出单词,请在System.out.println(word)

之后添加其他writer.write("hi");

希望这会有所帮助......

答案 1 :(得分:1)

适合我。这是你的完全类,是否在粘贴之前编辑了它?

单词表;

  


  猫
  SAT
  在
  该
  垫

newwordlist.txt;

  

thecatsatonmat

我的Stemmer只会返回您提供的字词。

public class Stemmer {

    private String word;

    public void addword(String word) {
        this.word = word;
    }

    public void stem() {
        // TODO Auto-generated method stub

    }

    @Override
    public String toString() {
        return word;
    }

}

答案 2 :(得分:1)

我希望问题中给出的代码生成一个由一行组成的文件,该文件由连接的所有“词干”组成。 (或者在“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();
    }
}

(我还整理了其他几件事......)

答案 3 :(得分:1)

根据Java documentation你需要使用BufferedWriter.write(),如下所示:

write(string,offset,length);

所以试试:

writer.write(stem,0,stem.length());

答案 4 :(得分:0)

当我运行您编辑的代码时,我得到一行

hihihihihihihihihihihihihi ............

正如所料。

也许您打算在此添加换行符。

           if(!db.contains(word)){
                db.add(word);
                writer.write(word);
                writer.write("\n");
            }