2012-05-10 23 views
8

Tôi dự kiến ​​sẽ tìm thấy XMLStreamReaderAutoCloseable trong Java 7. Tuy nhiên, đó không phải là trường hợp. Có lý do kỹ thuật nào khiến giao diện người đọc/ghi STAX không (hoặc không nên) trang bị thêm để triển khai AutoCloseable? Họ đã có các phương pháp đóng, có ý định không khác với phương pháp đóng của AutoCloseable.Tại sao các lớp học StAX không được trang bị thêm cho ARM trong Java 7

Trả lời

8

Nếu bạn nhìn gần gũi hơn với các close() method of AutoCloseable:

Đóng cập khu vực này, từ bỏ bất kỳ tài nguyên cơ bản. Phương thức này được gọi tự động trên các đối tượng được quản lý bởi câu lệnh try-with-resources.

Hoặc thậm chí Closeableclose() method:

Đóng dòng này và phiên bản bất kỳ tài nguyên hệ thống liên kết với nó. Nếu luồng đã được đóng thì việc gọi phương thức này không có hiệu lực.

Trong khi close() method of XMLStreamReader nói:

Giải phóng bất kỳ tài nguyên liên quan đến đọc này. Phương pháp này không đóng nguồn đầu vào cơ bản.

Thật vậy, nguồn đầu vào được quản lý bởi Reader triển khai giao diện Closeable. Vì vậy, đó là người đọc có thể đóng trong số try-with-ressource.

Ví dụ:

XMLInputFactory factory = XMLInputFactory.newInstance(); 
    XMLStreamReader reader = null; 
    try (FileReader fr = new FileReader("file.xml")) { //Will close the FileReader 
     reader = factory.createXMLStreamReader(fr); 
     reader.close(); 
    } 
    catch (XMLStreamException ex) { 
     if(reader!=null)try { 
      reader.close(); 
     } catch (XMLStreamException ex1) { 
      Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex1); 
     } 
    } 
+0

Tôi sẽ tự cấu trúc lại mã đó. reader.close() phải ở trong một khối cuối cùng trong trường hợp ngoại lệ xảy ra (bắt của bạn chỉ dành cho XMLStreamException nhưng nó có thể ném một ngoại lệ không được kiểm soát.) Tôi cũng sẽ loại bỏ kiểm tra cho người đọc là rỗng và đơn giản là làm tổ cấp thứ hai cố gắng cuối cùng bên trong khối thử khác. – Trejkaz

0

Không có lý do kỹ thuật tại sao họ không thể làm những điều này AutoCloseable. Tôi tìm nó chỉ đi xuống để lười biếng hoặc không đủ thời gian tìm kiếm các phương pháp gọi là close().

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