Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java FileWriter未附加到现有文件_Java_File_Filewriter_Bufferedwriter - Fatal编程技术网

Java FileWriter未附加到现有文件

Java FileWriter未附加到现有文件,java,file,filewriter,bufferedwriter,Java,File,Filewriter,Bufferedwriter,我正在编写一个方法,该方法将Twitter状态对象的列表作为参数,打开一个包含tweet的字符串表示的日志文件,检查状态对象的字符串表示是否已写入该文件-如果是,它将从列表中删除它们,如果没有,则将状态添加到文件中 在我尝试写入文件之前,一切都正常。什么也没写。我相信这是由于在两个不同的地方打开文件的方法:newfile(“tweets.txt”)和newfilewriter(“tweets.txt,true) 以下是我的方法: private List<Status> re

我正在编写一个方法,该方法将Twitter
状态对象的
列表
作为参数,打开一个包含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);