"Chào, Amigo. Đã lâu không gặp."

"Chào, Bilaabo. Anh định nói về chuyện gì vậy?"

"Hôm nay tôi sẽ nói với bạn về cách làm việc với tệp.  Java có một lớp đặc biệt (Tệp) mà bạn có thể sử dụng để quản lý tệp trên ổ cứng. Để quản lý nội dung tệp, có các lớp khác: FileInputStream, FileOutputStream, v.v. "

Tệp, Tệp, Đường dẫn - 1

"Thật thú vị. Nhưng khi bạn nói 'quản lý tệp', ý bạn là gì?"

"Đó chính là điều tôi sẽ giải thích ngay bây giờ. Các tệp có thể được tạo, xóa, đổi tên, v.v. Bạn có thể truyền một đối tượng Tệp cho hầu hết mọi lớp làm việc với (đọc, viết, thay đổi) nội dung của một tệp . Ví dụ:"

Bạn có thể chuyển tên tệp trực tiếp tới FileInputStream
FileInputStream input = new FileInputStream("c:/path/a.txt");
Hoặc bạn có thể tạo một đối tượng Tệp riêng biệt, sau đó chuyển nó tới FileInputStrea
File file = new File("c:/path/a.txt");
FileInputStream input = new FileInputStream(file);

"Nhưng tùy chọn thứ hai dài hơn. Tôi vẫn không hiểu tại sao chúng ta cần những đối tượng tệp này."

"Đối với ví dụ cụ thể này, bạn đúng. "Đây không phải là một ví dụ về cách bạn phải làm điều đó, mà là cách bạn có thể làm điều đó.
Nhưng hãy tưởng tượng rằng bạn cần hiển thị danh sách tất cả các tệp nằm trong một thư mục cụ thể. Đây là cách có thể thực hiện điều này bằng cách sử dụng các đối tượng Tệp:"

Mã số
File folder = new File("c:/path/");
for (File file : folder.listFiles())
{
 System.out.println(file.getName());
}

" listFiles() có phải là phương thức trả về danh sách các tệp trong thư mục được chỉ định bởi «c:/path/» không?"

"Vâng. Nhưng các lập trình viên thường nói 'thư mục'. Thuật ngữ 'thư mục' được sử dụng tương đối gần đây, nhưng về nguyên tắc, cả hai thuật ngữ đều đúng và bạn có thể nói bất kỳ từ nào bạn thích."

"OK. Và getName () làm gì? Trả về tên của tệp? Tên chính xác bao gồm những gì? Tên đầy đủ bao gồm cả đường dẫn hay chỉ tên của chính tệp đó?"

"Chỉ có tên của tệp. Để biết đường dẫn đầy đủ, có file.getAbsolutePath()."

"Vậy lớp File có những phương thức nào khác?"

"Hãy xem này:"

Phương pháp Sự miêu tả
boolean isDirectory() Đối tượng Tệp có phải là một thư mục không?
boolean isFile() Đối tượng có phải là tệp không?
long length() Trả về kích thước/độ dài tệp theo byte.
boolean createNewFile() Tạo một tệp mới, trống nếu tệp có tên này chưa tồn tại.
boolean mkdir() Tạo một thư mục. Tên «mkdir» xuất phát từ «tạo thư mục».
boolean mkdirs() Tạo một thư mục và tất cả các thư mục con của nó.
boolean delete() Xóa tệp được liên kết với đối tượng. Nếu đối tượng là một thư mục, thì thư mục đó chỉ bị xóa nếu không có tệp nào trong đó.
void deleteOnExit() Thêm tệp vào danh sách tệp đặc biệt sẽ tự động bị xóa khi thoát khỏi chương trình.
File createTempFile(
String prefix,
String suffix,
File directory)
Tạo một tệp tạm thời có tên duy nhất được tạo ngẫu nhiên, chẳng hạn như «dasd4d53sd».
Các tham số bổ sung là tiền tố tên và hậu tố. Nếu một thư mục không được chỉ định, thì tệp sẽ được tạo trong một thư mục OS đặc biệt dành cho các tệp tạm thời.
boolean exists() Trả về true nếu một tệp có cùng tên tồn tại trên ổ cứng.
String getAbsolutePath() Trả về đường dẫn đầy đủ của tệp với tất cả các thư mục con của nó.
String getCanonicalPath() Trả về đường dẫn tệp chuẩn.
Ví dụ: chuyển đổi đường dẫn «c:/dir/dir2/../a.txt» thành «c:/dir/a.txt»
String[] list() Trả về một mảng tên của các tệp có trong thư mục được đại diện bởi đối tượng hiện tại.
File[] listFiles() Trả về một mảng các tệp chứa trong thư mục được đại diện bởi đối tượng Tệp hiện tại.
long getTotalSpace() Trả về tổng dung lượng (số byte) trên đĩa chứa tệp.
long getFreeSpace() Trả về dung lượng trống (số byte) trên đĩa chứa tệp.
boolean renameTo(File) Đổi tên tệp, tức là nội dung của tệp thực sự có tên mới. Nói cách khác, bạn có thể đổi tên tệp «c:/dir/a.txt» thành «d:/out/text/b.doc».
String getName() Chỉ trả về tên tệp mà không có đường dẫn.
String getParent() Chỉ trả về đường dẫn (thư mục) đến tệp hiện tại, không có tên.
Path toPath() Trả về một đối tượng Đường dẫn tương ứng với đối tượng Tệp hiện tại.

"Chà! Một danh sách không nhỏ nhỉ? Và có vẻ như bạn có thể làm khá nhiều việc với nó: tạo và xóa các tập tin, đổi tên chúng,..."

"Vì vậy, để lấy thư mục của tệp hiện tại, tôi cần gọi hàm getParent()?"

"Đúng, nhưng nó trả về một Chuỗi ―đường dẫn tệp ―không phải là một đối tượng Tệp. Trên thực tế, lớp Tệp sao chép gần như tất cả các phương thức của nó: một phiên bản trả về một Chuỗi, phiên bản kia - một đối tượng Tệp. Hãy xem thử:"

File file = new File("c:/path/a.txt");
String directory = file.getParent();
File file = new File("c:/path/a.txt");
File directory = file.getParentFile();

Nếu bạn có một Chuỗi với đường dẫn tệp và bạn cần một đối tượng Tệp , thì hãy sử dụng hàm tạo. Nếu tình huống ngược lại (bạn có một đối tượng Tệp nhưng bạn cần một Chuỗi), thì hãy sử dụng getAbsolutePath (). Ví dụ:"

String path = "c:/a.txt";
File file = new File(path);
File file = new File("c:/a.txt");
String path = file.getAbsolutePath();

"Hiểu rồi."

"Tuyệt. Sau đây là một nhiệm vụ nhỏ dành cho bạn: hiển thị tên của tất cả các tệp nằm trong cùng thư mục với tệp hiện tại."

"Không có gì có thể dễ dàng hơn. Đây, nhìn này:"

Mã số
//Some file
File originalFile = new File("c:/path/dir2/a.txt");

//An object representing the directory
File folder = originalFile.getParentFile();

//Print the file list on screen
for (File file : folder.listFiles())
{
 System.out.println(file.getName());
}

"Hừm. Đúng."

"Nhưng hơi khó hiểu khi cùng một lớp ― Tệp ― được sử dụng cho cả tệp và thư mục. Điều đó có vẻ không logic lắm đối với tôi."

"Nó diễn ra theo cách đó vì những lý do lịch sử. Một thư mục từng là một tệp 'trống' đặc biệt trên đĩa. Tất nhiên, bây giờ nhiều thứ đã thay đổi, nhưng không phải tất cả. Đó là tất cả những gì tôi có ngày hôm nay."

"Cảm ơn vì bài học thú vị, Bilaabo."