2013-11-14 63 views
5

出于某种原因,我的字符串部分由PrintWriter写入。因此我在文件中获得了部分文本。这里的方法: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,它的工作......我无能..

回答

5

在放弃打开的流之前,您应始终使用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(); 
    } 
} 
2

尝试将线out.print(text);

这里后马上用out.flush();是在一个文件中写入有道:

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(); 
    } 
} 
+1

...或在'finally'块中,以及'out.close()'! –

0

应关闭文件:

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

你必须始终关闭您的流(这也将刷新他们),在最后块,或使用Java 7的try-与资源设施:

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

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

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

1

我测试了你的代码。您忘记关闭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); 
    }