printwriter只写部分文本

dvtswwa3  于 2021-07-11  发布在  Java
关注(0)|答案(5)|浏览(472)

由于某些原因,我的字符串部分是由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();
        }
    }

在我把文本打印到控制台的地方,我可以看到所有的数据都在那里,没有任何东西丢失,但是很明显,当printwriter完成它的工作时,部分文本丢失了。。。我不知所措。。

ryhaxcpt

ryhaxcpt1#

你应该一直 Writer#close 在你丢弃你打开的溪流之前。这将释放一些相当昂贵的系统资源,jvm在文件系统上打开文件时必须使用这些资源。如果不想关闭流,可以使用 Writer#flush . 这将使您的更改在文件系统上可见,而无需关闭流。关闭流时,隐式地刷新所有数据。
流总是缓冲数据,以便只有在有足够的数据要写入时才写入文件系统。当流以某种方式认为数据值得写入时,它会时不时地自动刷新数据。写入文件系统是一项昂贵的操作(需要花费时间和系统资源),因此只有在确实必要时才应该执行。因此,如果希望立即写入,则需要手动刷新流的缓存。
通常,请确保始终关闭流,因为它们使用了相当多的系统资源。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();
    }
}
t40tm48m

t40tm48m2#

尝试使用 out.flush(); 就在队伍后面 out.print(text); 以下是写入文件的正确方法:

public void new_file_with_text(String text, String fname) {
    try (FileWriter f = new FileWriter(fname)) {
        f.write(text);
        f.flush();
    } catch (IOException e) {
       e.printStackTrace();
    }
}
n3ipq98p

n3ipq98p3#

我测试了你的代码。您忘记关闭printwriter对象,即out.close

try {
        f = new File(fname);
        f.createNewFile();
        System.out.println(text);           
        PrintWriter out = new PrintWriter(f, "UTF-8");
        out.print(text);
        out.close(); // <--------------
    } catch (IOException e) {
        System.out.println(e);
    }
vsikbqxv

vsikbqxv4#

必须始终在finally块中或使用java 7 try with resources工具关闭流(这也将刷新流):

PrintWriter out = null;
try {
    ...
}
finally {
    if (out != null) {
        out.close();
    }
}

try (PrintWriter out = new PrintWriter(...)) {
    ...
}

如果不关闭流,不仅不会将所有内容都刷新到文件中,而且在某个时候,您的操作系统将没有可用的文件描述符。

dgenwo3n

dgenwo3n5#

您应该关闭文件:

PrintWriter out = new PrintWriter(f, "UTF-8");
try
{
        out.print(text);
}
finally
{
    try
    {
        out.close();
    }
    catch(Throwable t)
    {
        t.printStackTrace();
    }
}

相关问题