PrintWriter只写入部分文本

cas*_*per 5 java printwriter

由于某种原因,我的String部分由PrintWriter编写.结果我在我的文件中得到了部分文本.这是方法:

    public void new_file_with_text(String text, String fname) {
        File f = null;
        try {
            f = new File(fname);
            f.createNewFile();
            System.out.println(text);           
            PrintWriter out = new PrintWriter(f, "UTF-8");
            out.print(text);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
Run Code Online (Sandbox Code Playgroud)

在我将文本打印到控制台的地方,我可以看到数据全部存在,没有任何遗失,但是当PrintWriter完成其工作时,显然部分文本会丢失...我很无能为力......

Raf*_*ter 5

Writer#close在丢弃打开的流之前,您应始终使用流.这将释放JVM在文件系统上打开文件时必须要求的一些相当昂贵的系统资源.如果您不想关闭流,可以使用Writer#flush.这将使您的更改在文件系统上可见,而不关闭流.关闭流时,将隐式刷新所有数据.

Streams总是缓冲数据,以便在有足够的数据写入时只写入文件系统.当流以某种方式考虑数据值得写时,流会不时地自动刷新其数据.写入文件系统是一项昂贵的操作(它需要时间和系统资源),因此只有在确实需要时才应该这样做.因此,如果您希望立即写入,则需要手动刷新流的缓存.

通常,请确保始终关闭流,因为它们使用了相当多的系统资源.Java有一些关闭垃圾收集流的机制,但这些机制应该只被视为最后的手段,因为流可以在实际垃圾收集之前存活很长时间.因此,始终使用try {} finally {}以确保流被关闭,即使在打开流之后的异常也是如此.如果您不注意这一点,最终会发出一条IOException信号,表明您打开了太多文件.

您想要像这样更改代码:

public void new_file_with_text(String text, String fname) {
    File f = null;
    try {
        f = new File(fname);
        f.createNewFile();
        System.out.println(text);           
        PrintWriter out = new PrintWriter(f, "UTF-8");
        try {
            out.print(text);
        } finally {
            out.close();
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}
Run Code Online (Sandbox Code Playgroud)