我在使用 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/