2011-11-10 29 views
14

Tôi đang sử dụng FileOutputStream với PrintStream như thế này:Tôi có phải đóng FileOutputStream được gói bởi PrintStream không?

class PrintStreamDemo { 
    public static void main(String args[]){ 
    FileOutputStream out; 
    PrintStream ps; // declare a print stream object 
    try { 
    // Create a new file output stream 
    out = new FileOutputStream("myfile.txt"); 

    // Connect print stream to the output stream 
    ps = new PrintStream(out); 

    ps.println ("This data is written to a file:"); 
    System.err.println ("Write successfully"); 
    ps.close(); 
    } 
    catch (Exception e){ 
    System.err.println ("Error in writing to file"); 
    } 
    } 
} 

Im đóng cửa chỉ PrintStream. Tôi có cần đóng tất cả FileOutputStream (out.close();) không?

+0

Kiểm tra mã nguồn: http://www.docjar.com/html/api/java/io/PrintStream.java.html – jtoberon

+0

Nhân tiện, vẻ đẹp của PrintStream là thực tế bạn có thể sử dụng nó chỉ với một String (cho tên tập tin) hoặc một đối tượng File. Bạn không cần phải mở một FOStream chỉ để sử dụng nó trong PrintStream. – Mechkov

Trả lời

22

Không, bạn chỉ cần đóng luồng ngoài cùng. Nó sẽ đại diện cho tất cả các cách để các dòng bao bọc.

Tuy nhiên, mã của bạn chứa một lỗi khái niệm, việc đóng sẽ xảy ra trong finally, nếu không mã sẽ không bao giờ đóng khi mã này ném ngoại lệ giữa mở và đóng.

Ví dụ:

public static void main(String args[]) throws IOException { 
    PrintStream ps = null; 

    try { 
     ps = new PrintStream(new FileOutputStream("myfile.txt")); 
     ps.println("This data is written to a file:"); 
     System.out.println("Write successfully"); 
    } catch (IOException e) { 
     System.err.println("Error in writing to file"); 
     throw e; 
    } finally { 
     if (ps != null) ps.close(); 
    } 
} 

(lưu ý rằng tôi đã thay đổi mã để ném ngoại trừ để bạn hiểu được lý do của vấn đề, ngoại trừ đó là có chứa thông tin chi tiết về nguyên nhân của vấn đề)

Hoặc , khi bạn đã sử dụng Java 7, bạn cũng có thể sử dụng ARM (Quản lý tài nguyên tự động; còn được gọi là try-with-resources) để bạn không cần phải đóng bất kỳ điều gì:

public static void main(String args[]) throws IOException { 
    try (PrintStream ps = new PrintStream(new FileOutputStream("myfile.txt"))) { 
     ps.println("This data is written to a file:"); 
     System.out.println("Write successfully"); 
    } catch (IOException e) { 
     System.err.println("Error in writing to file"); 
     throw e; 
    } 
} 
+0

Khi tôi thêm cuối cùng khối và cố gắng làm 'ps.close()' trong đó tôi nhận được lỗi: 'biến ps có thể không có được khởi tạo' – hs2d

+0

Bạn cần phải khởi tạo nó với' null'. – BalusC

+0

Ah, không nghĩ về điều đó, cảm ơn! – hs2d

3

Không, theo javadoc, phương thức đóng sẽ close luồng cơ bản cho bạn.

5

Không, đây là việc thực hiện các phương pháp close()PrintStream 's:

public void close() { 
    synchronized (this) { 
     if (! closing) { 
     closing = true; 
     try { 
      textOut.close(); 
      out.close(); 
     } 
     catch (IOException x) { 
      trouble = true; 
     } 
     textOut = null; 
     charOut = null; 
     out = null; 
     } 
    } 

Bạn có thể thấy out.close(); mà đóng dòng đầu ra.

Các vấn đề liên quan