Giới thiệu về Java IO
Java IO (Java Input and Output) là một phần trong Java SE, cung cấp những công cụ cần thiết để xử lý dữ liệu từ bên ngoài ứng dụng Java. Cũng như con người có thể cảm nhận và giao tiếp với thế giới xung quanh qua các giác quan, Java IO giúp các ứng dụng Java tương tác với các nguồn dữ liệu bên ngoài.
Nguồn Dữ Liệu Bên Ngoài Ứng Dụng Java
Các nguồn dữ liệu bên ngoài có thể bao gồm:
- File: Các tệp được lưu trữ trên ổ cứng.
- Console: Nhập và hiển thị thông tin qua ứng dụng Console hoặc Terminal.
- Socket: Đọc ghi dữ liệu thông qua kết nối TCP hoặc UDP.
Khái Niệm Stream Trong Java IO
Java IO sử dụng khái niệm Stream để thực hiện các thao tác với dữ liệu. Stream có thể được hiểu như một dòng chảy liên tục dữ liệu. Các dữ liệu khi được xử lý lần lượt theo thứ tự từ đầu vào (InputStream) đến đầu ra (OutputStream). Bạn có thể hình dung như một dòng suối, nơi mà dữ liệu được chuyền đi giống như các khúc gỗ trôi theo dòng nước. Mỗi cây gỗ tương ứng với một byte và mỗi khúc gỗ là một bit.
InputStream và OutputStream
InputStream và OutputStream là hai lớp cơ sở cho mọi loại stream khác trong Java. Chúng cung cấp các phương thức để bạn đọc và ghi dữ liệu:
java
public abstract class InputStream implements Closeable {
public abstract int read() throws IOException;
public int read(byte b[]) throws IOException;
// Các phương thức khác...
}
java
public abstract class OutputStream implements Closeable, Flushable {
public abstract void write(int b) throws IOException;
public void write(byte b[]) throws IOException;
// Các phương thức khác...
}
Mặc dù cả hai lớp đều đọc và ghi dữ liệu, nhưng InputStream trả về dữ liệu dưới dạng byte, trong khi OutputStream cho phép ghi ra dữ liệu qua các phương thức khác nhau.
Ví Dụ Cơ Bản Với InputStream và OutputStream
Dưới đây là một ví dụ đơn giản về việc đọc dữ liệu từ tệp input.txt
và ghi dữ liệu vào tệp output.txt
.
java
import java.io.*;
public class CopyBytes {
public static void main(String[] args) throws IOException {
InputStream in = null;
OutputStream out = null;
try {
in = new FileInputStream("input.txt");
out = new FileOutputStream("output.txt");
int c;
while ((c = in.read()) != -1) {
out.write(c);
}
} finally {
if (in != null) in.close();
if (out != null) out.close();
}
}
}
Buffered Stream
Khi làm việc với các tệp lớn, việc đọc từng byte một sẽ rất tốn thời gian. Để tối ưu hóa, Java cung cấp BufferedInputStream và BufferedOutputStream, cho phép ghi và đọc nhiều byte cùng một lúc.
java
BufferedInputStream in = new BufferedInputStream(new FileInputStream("input.txt"));
BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream("output.txt"));
Khám Phá Reader và Writer
Khi làm việc với văn bản, chúng ta thường cần xử lý nhiều định dạng ký tự khác nhau, như UTF-8, UTF-16, hay ASCII. Với mỗi định dạng, Reader và Writer sẽ giúp bạn dễ dàng hơn khi làm việc với các ký tự, thay vì byte.
java
public abstract class Reader implements Readable, Closeable {
public int read() throws IOException;
// Các phương thức khác...
}
Để so sánh, InputStream bao gồm cách đọc data dưới dạng byte, trong khi Reader giúp chuyển đổi byte thành ký tự theo định dạng đã cho.
Kết Luận
Thông qua bài viết này, bạn đã cùng tôi khám phá những kiến thức cơ bản về Java IO: stream, buffer, reader và writer. Việc hiểu rõ cách hoạt động của Java IO sẽ giúp bạn phát triển ứng dụng tốt hơn. Ở bài viết tiếp theo, chúng ta sẽ kết hợp Java IO với Java Networking để xây dựng một Server. Hãy chuẩn bị tinh thần cho hành trình thú vị sắp tới nhé!
source: viblo