Java 为什么不';文件中没有所有条目吗?

Java 为什么不';文件中没有所有条目吗?,java,file-io,Java,File Io,在下面的程序中,循环迭代1000次,我使用FileWriter将所有条目写入文件,但不幸的是,程序最终只在文件中写入510个条目(有时415个,有时692个,总是小于1000个),但循环迭代1000次 import java.io.* ; import java.util.*; public class DemoWriter { public static void main(String[] args) throws Exception { List<Str

在下面的程序中,循环迭代1000次,我使用FileWriter将所有条目写入文件,但不幸的是,程序最终只在文件中写入510个条目(有时415个,有时692个,总是小于1000个),但循环迭代1000次

import java.io.* ;
import java.util.*;

public class DemoWriter {

    public static void main(String[] args) throws Exception {

        List<String> receiverList = new ArrayList<String>() ;
        receiverList.add("abc@gmail.com") ;
        receiverList.add("pqr@ibibo.com") ;
        receiverList.add("xyz@gmail.com") ;

        FileWriter fw = new FileWriter("a.txt") ;
        BufferedWriter bw = new BufferedWriter(fw) ;

        int size = receiverList.size() ;

        String str ;
        int count = 0 ;
        for(int i = 1 ; i <= 1000 ; ++i){
            str = receiverList.get( (int) (Math.random() * size) ) + "\n" ;
            bw.write(++count + ".> " + str) ;
            System.out.print(count + ".> " + str) ;
        }
    }
}
import java.io.*;
导入java.util.*;
公共类DemoWriter{
公共静态void main(字符串[]args)引发异常{
List receiverList=新建ArrayList();
收款人名单。添加(“abc@gmail.com") ;
收款人名单。添加(“pqr@ibibo.com") ;
收款人名单。添加(“xyz@gmail.com") ;
FileWriter fw=新的FileWriter(“a.txt”);
BufferedWriter bw=新的BufferedWriter(fw);
int size=receiverList.size();
字符串str;
整数计数=0;

对于(int i=1;i您没有关闭和刷新写入程序。如果在代码末尾对写入程序调用
close()
方法,缓冲区将被刷新,写入程序将被关闭


正如Hank Gay在评论中指出的那样,
close()
方法可能会抛出异常(我相信是
IOException
)。这意味着您必须将要关闭的调用包装在一个
try
/
catch
块中。但是,我看到您的
main
方法抛出
异常
-这不是最佳做法,但它将防止您在此特定实例中需要
try
/
catch
块。

是否需要关闭BufferedWriter和FileWriter对象?可能会留下不完整的文件。

只需添加

    bw.flush();
    bw.close();

实际上,在方法结束时,您应该始终关闭资源以刷新所有内容并释放资源。显式刷新不是必需的,因为它通常在关闭过程中隐式完成。只需在try-catch-finally块的finally块内调用即可


另外,对
close()
的调用应该在
finally
块中。方法名称是小写的,我相信(需要仔细检查文档),但是调用close也会刷新缓冲区……我不确定。在C中肯定是这样。文档中说“public void close())抛出IOException\\Close流。“这是Java,不是C#。但是,这可能取决于编写器的类型。我知道“这是Java”,thx。这是关于这个特定编写器的Java文档,好吗?你不想调用Close()在try-catch块的最后一部分,它会抛出一个异常。那么?只需捕获它并进一步忽略它,或者出于日志记录的目的对它执行e.printStackTrace()。它当然需要在最后一块中执行,因为否则会泄漏资源。bw.close()应该传递close()。