File, xử lý đầu vào ra (I/O) trong Java

Gói java.io chứa hầu như tất cả các lớp mà bạn cần để thực hiện đầu vào, đầu ra (I/O) trong Java. Tất cả những stream này biểu diễn nguồn đầu vào và đích đầu ra. Stream trong gói java.io hỗ trợ nhiều kiểu dữ liệu khác nhau như kiểu dữ liệu gốc, đối tượng các ký tự nội bộ,...

File, xử lý đầu vào ra (I/O) trong Java

Stream trong Java

Stream trong Java có thể được định nghĩa là một dãy dữ liệu. Có 2 loại Stream trong Java, bao gồm:

- InPutStream: InPutStream được sử dụng để đọc dữ liệu từ một nguồn.
- OutPutStream: OutPutStream được sử dụng để ghi dữ liệu vào đích.

Java cung cấp hỗ trợ I/O liên quan đến các file và mạng mạnh mẽ nhưng linh hoạt. Trong bài viết này Taimienphi.vn chỉ giới thiệu các tính năng cơ bản liên quan tới Stream và I/O.

Byte Stream trong Java

Byte Stream trong Java được sử dụng để thực hiện đầu vào và đầu ra của các byte (8 bit). Mặc dù có nhiều lớp liên quan đến byte stream, trong đó các lớp được sử dụng thường xuyên nhất phải kể đến là FileInputStream và FileOutputStream.

Dưới đây là ví dụ sử dụng hai lớp này để sao chép một file đầu vào vào file đầu ra:

Bây giờ bạn sẽ có 1 file input.txt có nội dung:

This is test for copy file.

Bước tiếp theo là biên dịch chương trình trên và thực thi nó, kết quả là tạo ra file là output.txt có cùng nội dung như trong file input.txt. Vì thế, bạn đặt mã trên vào file CopyFile.java và làm như dưới đây:

$javac CopyFile.java
$java CopyFile
Character Stream trong Java

By Stream trong Java được sử dụng để thực hiện đầu vào và đầu ra của các byte (8-bit), còn Character stream trong Java được sử dụng để thực hiện đầu vào và đầu ra của Unicode 16 bit.

Mặc dù có nhiều lớp liên quan đến character stream, nhưng các lớp được sử dụng nhiều nhất phải kể đến là FileReader và FileWriter. Mặc dù FileReader sử dụng FileInputStream và FileWriter sử dụng FileOutputStream, nhưng có một điểm khác ở đây là FileReader đọc 2byte cùng lúc và FileWriter ghi 2 byte cùng một lúc.

Có thể viết lại ví dụ trên để sử dụng 2 lớp này sao chép 1 file đầu vào (có các ký tự Unicode) vào 1 file đầu ra:

Bây giờ bạn sẽ có 1 file input.txt có nội dung:

This is test for copy file.

Bước tiếp theo là biên dịch chương trình trên và thực thi nó, kết quả là tạo ra file là output.txt có cùng nội dung như trong file input.txt. Vì thế, bạn đặt mã trên vào file CopyFile.java và làm như dưới đây:

$javac CopyFile.java
$java CopyFile
Standard Stream trong Java

Tất cả các ngôn ngữ lập trình cung cấp hỗ trợ chuẩn I/O, tại đây các chương trình của người dùng có thể lấy dữ liệu từ bàn phím, sau đó tạo đầu ra trên màn hình máy tính.

Nếu đã biết về các ngôn ngữ lập trình C hoặc C++, chắc hẳn bạn đã biết 3 thiết bị chuẩn STDIN, STDOUT và STDERR. Tương tự, Java cũng cung cấp 3 Standard Stream, bao gồm:

- Standard Input (chuẩn đầu vào): Chuẩn này được sử dụng để nhập dữ liệu cho chương trình người dùng và thường thì bàn phím được sử dụng để làm chuẩn đầu vào và được biểu diễn là System.in.
- Standard Output (chuẩn đầu ra): Được sử dụng để xuất dữ liệu được tạo bởi chương trình người dùng và thường thì màn hình máy tính được sử dụng làm chuẩn đầu ra và được biểu diễn là System.out.
- Standard Error (lỗi chuẩn): Được sử dụng để xuất dữ liệu lỗi do chương trình tạo ra và màn hình máy tính được sử dụng để làm lỗi chuẩn và được biểu diễn dưới dạng System.err.

Dưới đây là chương trình đơn giản tạo InputStreamReader để đọc đầu vào chuẩn của stream cho đến khi người dùng nhập ký tự "q":

Lưu đoạn mã trong ví dụ trên vào file ReadConsole.java, sau đó thử biên dịch và thực thi nó như dưới đây. Chương trình này tiếp tục đọc và xuất cùng một ký tự cho đến khi nhập ký tự "q":

Đọc và ghi file trong Java

Như đã đề cập ở trên, một stream có thể được định nghĩa là một dãy dữ liệu. InputStream được sử dụng để đọc dữ liệu từ một nguồn và OutputStream được sử dụng để ghi dữ liệu vào đích.

Dưới đây là cấu trúc phân tầng các lớp để xử lý các luồng đầu vào và đầu ra (I/O):

2 luồng quan trọng nhất là FileInputStream và FileOutputStream, Taimienphi.vn sẽ đề cập trong phần dưới đây.

FileInputStream trong Java

FileInputStream trong Java được sử dụng để đọc dữ liệu từ các file. Các đối tượng có thể được tạo bằng cách sử dụng từ khóa new và một số kiểu constructor có sẵn.

Dưới đây là construtor lấy tên file dưới dạng chuỗi để tạo đối tượng input stream để đọc file:

InputStream f = new FileInputStream("C:/java/hello");

Dưới đây là constructor lấy 1 đối tượng file để tạo đối tượng input stream để đọc các file. Đầu tiên tạo một đối tượng file bằng cách sử dụng phương thức File() như dưới đây:

File f = new File("C:/java/hello");

InputStream f = new FileInputStream(f);

Sau khi đã có đối tượng InputStream, dưới đây là danh sách các phương thức có thể sử dụng để đọc stream hoặc để thực hiện các thao tác khác trên stream:

Ngoài ra còn có một số input stream quan trọng khác, bao gồm:

- ByteArrayInputStream
- DataInputStream

FileOutputStream trong Java

FileOutputStream trong Java được sử dụng để tạo file và ghi dữ liệu vào file đó. Nếu file chưa tồn tại, luồng này sẽ tạo một file trước khi mở file cho đầu ra.

Dưới đây là 2 constructor được sử dụng để tạo đối tượng FileOutputStream:

- Constructor lấy tên file dưới dạng chuỗi để tạo đối tượng input stream để ghi file:

OutputStream f = new FileOutputStream("C:/java/hello")

- Dưới đây là constructor để lấy đối tượng file để tạo đối tượng output stream để ghi các file. Đầu tiên tạo một đối tượng file bằng cách sử dụng phương thức File () như dưới đây:

File f = new File("C:/java/hello");
OutputStream f = new FileOutputStream(f);

Sau khi đã có đối tượng OutputStream, dưới đây là danh sách các phương thức có thể sử dụng để ghi stream hoặc để thực hiện các thao tác khác trên stream:

Ngoài ra còn có một số output stream quan trọng khác, bao gồm:

- ByteArrayOutputStream
- DataOutputStream

Ví dụ:

Dưới đây là ví dụ về InputStream và OutputStream trong Java:

Đoạn mã trên sẽ tạo ra file test.txt và ghi các số đã cho dưới định dạng nhị phân. Kết quả đầu ra tương tự trên màn hình stdout.

Điều hướng file và I/O (đầu vào/ra) trong Java

Để tìm hiểu các thông tin cơ bản về điều hướng file và I/O (đầu vào/ra) trong Java, dưới đây là một số lớp bạn cần biết:

- Lớp File.
- Lớp FileReader.
- Lớp FileWriter.

Thư mục trong Java

Thư mục trong Java là một File có chứa danh sách các file và thư mục khác. Bạn có thể sử dụng đối tượng File để tạo các thư mục, liệt kê các file có sẵn trong thư mục.

Tạo thư mục trong Java

Có 2 phương thức File hữu ích, có thể sử dụng để tạo các thư mục:

- Phương thức mkdir( ) tạo một thư mục, trả về True nếu thành công và False nếu thất bại. Thất bại là do đường dẫn được chỉ định trong đối tượng File đã tồn tại, hoặc do thư mục không thể tạo vì toàn bộ đường dẫn không tồn tại.
- Phương thức mkdirs() tạo cả thư mục và tất cả các thư mục cha của thư mục đó.

Ví dụ dưới đây tạo thư mục "/tmp/user/java/bin":

Biên dịch và thực thi đoạn mã trên để tạo "/tmp/user/java/bin".

Lưu ý: Java tự động quan tâm đến dấu phân cách đường dẫn trên UNIX và Windows theo quy ước tương ứng. Nếu sử dụng dấu gạch chéo (/) trên phiên bản Windows của Java, đường truyền sẽ vẫn giải quyết một cách chính xác.
Liệt kê các thư mục trong Java

Bạn có thể sử dụng phương thức list( ) mà đối tượng File cung cấp để liệt kê tất cả các file và thư mục có sẵn trong thư mục như trong ví dụ dưới đây:

Ví dụ trên sẽ trả về kết quả đầu ra là các thư mục và các file có sẵn trong thư mục /tmp:

Trên đây là các thông tin hữ ích liên quan đến File, xử lý đầu vào / ra I/O trên Java. Ngoài ra bạn đọc có thể tham khảo thêm một số bài viết khác trên Taimienphi.vn như sử dụng điều kiện IF Else trong Java. Chúc các bạn thành công.

Các bài viết trước Taimienphi.vn đã giới thiệu cho bạn các thông tin về Java như các cú pháp cơ bản, lớp và đối tượng trong Java cũng như cách khai báo biến, mảng và các toán tử trong Java. Bài viết này Taimienphi.vn sẽ giới thiệu tiếp cho bạn về File, xử lý đầu vào ra (I/O) trong Java.
Sử dụng điều kiện IF Else trong Java
Ngày tháng (Date & Time) trong Java
Java - Khai báo, sử dụng mảng
Cú pháp cơ bản của Java
Hướng dẫn tạo hàm Daemon Threads trong Java
Sửa lỗi "Java Runtime Environment not found" trong Minecraft

ĐỌC NHIỀU