Java FileWriter未附加到现有文件
我正在编写一个方法,该方法将TwitterJava FileWriter未附加到现有文件,java,file,filewriter,bufferedwriter,Java,File,Filewriter,Bufferedwriter,我正在编写一个方法,该方法将Twitter状态对象的列表作为参数,打开一个包含tweet的字符串表示的日志文件,检查状态对象的字符串表示是否已写入该文件-如果是,它将从列表中删除它们,如果没有,则将状态添加到文件中 在我尝试写入文件之前,一切都正常。什么也没写。我相信这是由于在两个不同的地方打开文件的方法:newfile(“tweets.txt”)和newfilewriter(“tweets.txt,true) 以下是我的方法: private List<Status> re
状态对象的列表
作为参数,打开一个包含tweet的字符串
表示的日志文件,检查状态
对象的字符串
表示是否已写入该文件-如果是,它将从列表中删除它们,如果没有,则将状态添加到文件中
在我尝试写入文件之前,一切都正常。什么也没写。我相信这是由于在两个不同的地方打开文件的方法:newfile(“tweets.txt”)
和newfilewriter(“tweets.txt,true)
以下是我的方法:
private List<Status> removeDuplicates(List<Status> mentions) {
File mentionsFile = new File("tweets.txt");
try {
mentionsFile.createNewFile();
} catch (IOException e1) {
// Print error + stacktrace
}
List<String> fileLines = new ArrayList<>();
try {
Scanner scanner = new Scanner(mentionsFile);
while (scanner.hasNextLine()) {
fileLines.add(scanner.nextLine());
}
scanner.close();
} catch (FileNotFoundException e) {
// Print error + stacktrace
}
List<Status> duplicates = new ArrayList<>();
for (Status mention : mentions) {
String mentionString = "@" + mention.getUser().getScreenName() + " \"" + mention.getText() + "\" (" + mention.getCreatedAt() + "\")";
if (fileLines.contains(mentionString)) {
duplicates.add(mention);
} else {
try {
Writer writer = new BufferedWriter(new FileWriter("tweets.txt", true));
writer.write(mentionString);
} catch (IOException e) {
// Print error + stacktrace
}
}
}
mentions.removeAll(duplicates);
return mentions;
}
私人列表移除副本(列表提及){
文件提及文件=新文件(“tweets.txt”);
试一试{
提及file.createNewFile();
}捕获(IOE1异常){
//打印错误+堆栈跟踪
}
List fileLines=new ArrayList();
试一试{
扫描仪=新的扫描仪(文件);
while(scanner.hasNextLine()){
添加(scanner.nextLine());
}
scanner.close();
}catch(filenotfounde异常){
//打印错误+堆栈跟踪
}
列表重复项=新建ArrayList();
对于(状态提及:提及){
字符串提及字符串=“@”+提及.getUser().getScreenName()+“\”+提及.getText()+“\”(“+提及.getCreatedAt()+“\”);
if(fileLines.contains(字符串)){
副本。添加(提及);
}否则{
试一试{
Writer-Writer=newbufferedwriter(newfilewriter(“tweets.txt”,true));
writer.write(字符串);
}捕获(IOE异常){
//打印错误+堆栈跟踪
}
}
}
提及。移除所有(副本);
回复提及;
}
我在这里写了一些关于查看代码的想法
请记住始终关闭对象读卡器
和写卡器
看看:
要读取列表中的整个文件
:
List lines=Files.readAllLines(path.get(“tweets.txt”)、StandardCharsets.UTF_8);
再说一次,我认为在你读的同一个文件中写是一种糟糕的做法
如果你没有特别的限制,我建议你写一个不同的文件
但如果你真的想有这种行为,几乎没有其他选择
创建一个临时文件作为输出,并在处理成功完成后,使用文件将其移动到旧文件。移动(从、到)
为了测试这是否是导致问题的原因,我将其更改为Writer-Writer=new-BufferedWriter(new-FileWriter(“tweets2.txt”,true))代码>并创建tweets2.txt
,但仍然没有向其中写入任何内容。您没有刷新并关闭writer,所以使用try with resources
语句我不需要显式关闭资源,它是自动完成的?那法拉盛呢?我认为仍然必须手动完成?不。只有在特定情况下,您需要确保在特定时刻进行物理写入,但通常不需要手动刷新。
try (Writer writer = new BufferedWriter(new FileWriter("tweets.txt", true))) {
writer.write(mentionString);
} catch (IOException e) {
// Print error + stacktrace
}
List<String> lines = Files.readAllLines(Paths.get("tweets.txt"), StandardCharsets.UTF_8);