我遇到了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
但输出文件仍为空白
答案 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");
}