Tại sao java.io.File không có phương thức close ()?


123

Trong khi java.io.RandomAccessFilecó một close()phương pháp java.io.Filekhông. Tại sao vậy? Tệp có tự động đóng khi hoàn thành hay gì đó không?

Cảm ơn!


3
Nếu bạn nhìn vào Java API, bạn sẽ có thể nhận được câu trả lời ngay lập tức.
gigadot

43
Tôi đã học được rằng mọi người hữu ích hơn những thông số Java tuyệt vời khác.
Albus Dumbledore

6
b / c nó không thể mở được :)
bestsss

6
Bởi vì nó không mở bất cứ thứ gì. Và mọi người kém tin cậy hơn đáng kể so với đặc tả Java chính thức.
Marquis of Lorne

Câu trả lời:


141

Javadoc của Filelớp mô tả lớp là:

Một đại diện trừu tượng của tên đường dẫn tệp và thư mục.

Filechỉ là một đại diện của tên đường dẫn, với một số phương pháp liên quan đến hệ thống tệp (như exists()) và xử lý thư mục nhưng đầu vào và đầu ra trực tuyến thực tế được thực hiện ở nơi khác. Các luồng có thể được mở và đóng, các tệp không thể.

(Ý kiến ​​cá nhân của tôi là thật đáng tiếc khi Sun sau đó đã tiếp tục tạo ra RandomAccessFile, gây ra nhiều nhầm lẫn với cách đặt tên không nhất quán của nó.)


72

java.io.Filekhông đại diện cho một tệp đang mở , nó đại diện cho một đường dẫn trong hệ thống tệp. Do đó có closephương pháp trên nó không có ý nghĩa.

Trên thực tế, lớp học này đã được đặt tên sai bởi các tác giả thư viện, nó nên được gọi như thế nào Path.


Nhưng sau đó những gì về tất cả các phương pháp liệt kê thư mục? Chúng nên được tách ra khỏi Pathhoàn toàn.
biziclop

3
Đã đồng ý, nhưng trong mọi trường hợp, File hoặc RandomAccessFile bị đặt tên sai. Một cái gì đó như RandomAccessFileStream có thể tốt hơn, nhưng bây giờ đã quá muộn nhiều năm.
maaartinus

7
"Thực ra, lớp học này đã được các tác giả thư viện đặt tên sai, nó nên được gọi là một cái gì đó giống như Path" -> Họ nghe thấy bạn. Trong gói nio (I / O mới), classe tương tự hiện được đặt tên là Path. docs.oracle.com/javase/7/docs/api/java/nio/file/Path.html
phút

6

Về cơ bản, tệp truy cập ngẫu nhiên bao bọc các luồng đầu vào và đầu ra để quản lý quyền truy cập ngẫu nhiên. Bạn không mở và đóng một tệp, bạn mở và đóng các luồng vào một tệp.


1
Đúng. Tôi chưa bao giờ tìm hiểu nhiều về java.io.RandomAccessFile. Tôi luôn cho rằng nó ghi đè java.io.File nhưng nó không !. Tệp đại diện cho một đường dẫn. RandomAccessFile là một đối tượng có thể thực hiện I / O đĩa như các luồng có thể, mặc dù với cách triển khai khác nhiều, để cho phép truy cập ngẫu nhiên chứ không phải theo luồng.
Steve Cohen

6

Một BufferedReader có thể được mở và đóng nhưng một Tệp không bao giờ được mở, nó chỉ đại diện cho một đường dẫn trong hệ thống tệp.


4

Giả sử, bạn có

File f  = new File("SomeFile");
f.length();

Bạn không cần phải đóng các Files, bởi vì nó chỉ là đại diện của một đường dẫn.

Bạn luôn nên cân nhắc để chỉ đóng người đọc / người viết và trên thực tế là các luồng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.