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ộ,...
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: được sử dụng để đọc dữ liệu từ một nguồn.
- OutputStream: được sử dụng để ghi dữ liệu vào đích.
1. Byte Stream
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.
Ví dụ:
package com.company;
import java.io.*;
public class Main {
public static void main(String args[]) {
FileInputStream in = null;
FileOutputStream out = null;
try {
in = new FileInputStream("E:/input.txt");
out = new FileOutputStream("E:/output.txt");
int c;
while ((c = in.read()) != -1) {
out.write(c);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (in != null) {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (out != null) {
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
Trong ví dụ trên, giả sử ta có một file input.txt tại ổ E với nội dung "BkitSoftware". Ta sử dụng FileInputStream để đọc nội dung file input.txt, FileOutputStream để tạo và ghi nội dung "BkitSoftware" cho file output.txt.
2. Character Stream
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), 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.
Ví dụ:
package com.company;
import java.io.*;
public class Main {
public static void main(String args[]) {
FileReader in = null;
FileWriter out = null;
try {
in = new FileReader("E:/input.txt");
out = new FileWriter("E:/output.txt");
int c;
while ((c = in.read()) != -1) {
out.write(c);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (in != null) {
in.close();
}
if (out != null) {
out.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
Kết quả thu được là file output.txt có nội dung tương tự file input.txt.
3. Standard Stream
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.
Trong ngôn ngữ Java, người dùng được cùng cấp 3 phương thức:
- 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.
Ví dụ: Đọc dữ liệu nhập từ bàn phím, khi nhập kí tự 'k' thì kết thúc chương trình.
package com.company;
import java.io.*;
public class Main {
public static void main(String args[]) {
InputStreamReader cin = null;
try {
cin = new InputStreamReader(System.in);
System.out.println("Nhap cac ky tu, 'k' de thoat.");
char c;
do {
c = (char) cin.read();
System.out.print(c);
} while (c != 'k');
} catch (Exception e) {
} finally {
try {
if (cin != null) {
cin.close();
}
} catch (Exception e) {
}
}
}
}
Trong bài sau, chúng ta sẽ tìm hiểu cụ thể về xử lý xuất nhập bằng luồng byte và xử lý xuất nhập bằng luồng character.