Gói java.io chứa hầu hết các lớp cần thiết để thực hiện đầu vào và đầu ra (I/O) trong Java. Tất cả những luồng này đại diện cho nguồn đầu vào và đích đầu ra. Các luồng trong gói java.io hỗ trợ nhiều loại dữ liệu như dữ liệu gốc, đối tượng ký tự nội bộ,...
Tệp Tin và Xử Lý Đầu Vào/Ra (I/O) trong Java
Luồng trong Java
Luồng trong Java có thể được mô tả như một chuỗi dữ liệu. Có 2 loại Luồng chính trong Java bao gồm:
- Luồng Nhập: Luồng Nhập được sử dụng để đọc dữ liệu từ một nguồn.
- Luồng Xuất: Luồng Xuất được sử dụng để ghi dữ liệu vào đích.
Java hỗ trợ mạnh mẽ và linh hoạt trong việc xử lý đầu vào/ra (I/O) liên quan đến các tệp và mạng. Trong bài viết này, Mytour chỉ giới thiệu các tính năng cơ bản liên quan đến Luồng và I/O.
Luồng Byte trong Java
Luồng Byte trong Java được dùng để thực hiện đầu vào và đầu ra của các byte (8 bit). Trong số nhiều lớp liên quan đến luồng byte, hai lớp phổ biến nhất là FileInputStream và FileOutputStream.
Dưới đây là một ví dụ sử dụng hai lớp này để sao chép nội dung từ một file đầu vào sang file đầu ra:
Bây giờ, bạn sẽ có một tệp tin input.txt với nội dung sau:
Đây là bài kiểm tra để sao chép tệp tin.
Bước tiếp theo là biên dịch chương trình và thực thi nó, kết quả là tạo ra tệp tin output.txt có nội dung giống như trong tệp tin input.txt. Vì thế, bạn đặt mã trong tệp tin CopyFile.java và thực hiện như sau:
$javac CopyFile.java
$java CopyFile
Luồng Ký tự trong Java
Luồng Byte 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 Luồng Ký tự 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 luồng ký tự, nhưng lớp được ưa chuộng nhất phải kể đến là FileReader và FileWriter. Mặc dù FileReader sử dụng FileInputStream và FileWriter sử dụng FileOutputStream, tuy nhiên, điểm đặc biệt ở đây là FileReader đọc 2 byte cùng lúc và FileWriter ghi 2 byte cùng một lúc.
Có thể viết lại ví dụ trước để sử dụng 2 lớp này sao chép 1 file đầu vào (chứa các ký tự Unicode) vào 1 file đầu ra:
Bây giờ bạn sẽ có 1 file input.txt với nội dung sau:
Đây là bài kiểm tra để sao chép tệp tin.
Tiếp theo, hãy biên dịch chương trình và chạy nó. Kết quả sẽ tạo ra tệp tin là output.txt với nội dung tương tự như trong tệp tin input.txt. Để thực hiện điều này, hãy đặt mã vào tệp tin CopyFile.java và thực hiện các bước sau:
$javac CopyFile.java
$java CopyFile
Standard Stream trong Java
Mọi ngôn ngữ lập trình đều hỗ trợ chuẩn I/O, nơi chương trình có thể nhận dữ liệu từ bàn phím và hiển thị đầu ra trên màn hình máy tính.
Nếu bạn đã quen với ngôn ngữ lập trình C hoặc C++, bạn sẽ biết về 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:
- Chuẩn Đầu vào (Standard Input): Sử dụng để nhập dữ liệu cho chương trình người dùng, thường là từ bàn phím và được biểu diễn bởi System.in.
- Chuẩn Đầu ra (Standard Output): Sử dụng để xuất dữ liệu được tạo ra bởi chương trình người dùng, thường là trên màn hình máy tính và được biểu diễn bởi System.out.
- Lỗi Chuẩn (Standard Error): Sử dụng để xuất dữ liệu lỗi do chương trình tạo ra, thường là trên màn hình máy tính và được biểu diễn bởi System.err.
Dưới đây là một đoạn mã đơn giản sử dụng InputStreamReader để đọc đầu vào chuẩn cho đến khi người dùng nhập ký tự 'q':
Đặt mã trong ví dụ trên vào tệp tin ReadConsole.java, sau đó thực hiện biên dịch và thực thi như sau. Chương trình sẽ tiếp tục đọc và xuất ra cùng một ký tự cho đến khi người dùng nhập ký tự 'q':
Đọc và ghi tệp tin trong Java
Như đã đề cập trước đó, một stream có thể được hiểu như là một chuỗi dữ liệu. InputStream được sử dụng để đọc dữ liệu từ một nguồn, trong khi 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ủa các lớp để xử lý đầu vào và đầu ra (I/O):
Trong số các luồng quan trọng, FileInputStream và FileOutputStream là hai lớp quan trọng mà Mytour sẽ giới thiệu chi tiết trong phần tiếp theo.
FileInputStream trong Java
Lớp FileInputStream trong Java được sử dụng để đọc dữ liệu từ các tệp tin. Bạn có thể tạo các đối tượng của lớp này bằng cách sử dụng từ khóa new và một số kiểu constructor khác nhau.
Dưới đây là một constructor sử dụng tên tệp tin dưới dạng chuỗi để tạo đối tượng đầu vào để đọc tệp tin:
InputStream f = new FileInputStream('C:/java/hello');
Dưới đây là một constructor sử dụng một đối tượng tệp tin để tạo đối tượng đầu vào để đọc tệp tin. Đầu tiên, tạo một đối tượng tệp tin bằng cách sử dụng phương thức File() như sau:
Tệp tin f = new Tệp tin('C:/java/hello');
InputStream f = new FileInputStream(f);
Khi đã có đối tượng InputStream, dưới đây là danh sách các phương thức có sẵn để đọc stream hoặc thực hiện các thao tác khác trên stream:
Ngoài ra, còn 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 đó. Trong trường hợp 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:
- Sử dụng constructor với tên file dưới dạng chuỗi để tạo đối tượng output stream để ghi file:
OutputStream f = new FileOutputStream('C:/java/hello')
- Dưới đây là constructor để sử dụng đối tượng file và tạo đối tượng output stream để ghi các file. Bạn có thể 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 phương thức để ghi stream hoặc thực hiện các thao tác khác:
Bên cạnh đó, còn 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 Mytour như sử dụng điều kiện IF Else trong Java. Chúc các bạn thành công.
