1

我有一个 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

但是输出文件还是空白

4

5 回答 5

1

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

作者应该将单词写入输出文件src/newwordlist.txt不是控制台。如果您希望您的程序将单词输出到控制台,请在System.out.println(word)后面添加附加writer.write("hi");

希望这可以帮助...

于 2013-09-03T15:31:14.223 回答
1

为我工作。这是您的确切课程,您在粘贴之前是否对其进行了编辑?

词汇表;



坐在 垫子 上_
_

新词表.txt;

猫垫

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

}
于 2013-09-03T15:32:08.747 回答
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();
    }
}

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

于 2013-09-03T15:32:38.867 回答
1

根据Java文档,您需要使用 BufferedWriter.write() 如下:

write(string,offset,length);

所以试试:

writer.write(stem,0,stem.length());
于 2013-09-03T15:33:27.153 回答
0

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

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

正如预期的那样。

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

           if(!db.contains(word)){
                db.add(word);
                writer.write(word);
                writer.write("\n");
            }
于 2013-09-03T15:31:25.753 回答