Các luồng byte được định nghĩa dùng hai lớp phân cấp. Mức trên cùng là hai lớp trừu tượng InputStream và OutputStream. InputStream định nghĩa những đặc điểm chung cho những luồng nhập byte. OutputStream mô tả cách xử lý của các luồng xuất byte.

Các lớp con dẫn xuất từ hai lớp InputStream và OutputStream sẽ hỗ trợ chi tiết tương ứng với việc đọc ghi dữ liệu trên những thiết bị khác nhau. Đừng choáng ngợp với hàng loạt rất nhiều các lớp khác nhau. Đừng quá lo lắng, mỗi khi bạn nắm vững, sử dụng thành thạo một luồng byte nào đó thì bạn dễ dàng làm việc với những luồng còn lại.










Lớp luồng byte

Ý nghĩa


1

BufferedInputStream

Buffered input stream


2

BufferedOutputStream

Buffered output stream


3

ByteArrayInputStream

Input stream đọc dữ liệu từ một mảng Byte


4

ByteArrayOutputStream

Output stream ghi dữ liệu đến một Byte


5

DataInputStream

Luồng nhập có những phương thức đọc những kiểu dữ liệu chuẩn trong java


6

DataOutputStream

Luồng xuất có những phương thức ghi những kiểu dữ liệu chuẩn trong java


7

FileInputStream

Luồng nhập cho phép đọc dữ liệu từ file


8

FileOutputStream

Luồng xuất cho phép ghi dữ liệu xuống file


9

FilterInputStream

Hiện thực lớp trừu tượng InputStream


10

FilterOutputStream

Hiện thực lớp trừu tượng OutputStream


11

InputStream

Lớp trừu tượng, là lớp cha của tất cả các lớp luồng nhập kiểu Byte


12

OutputStream

Lớp trừu tượng, là lớp cha của tất cả các lớp xuất nhập kiểu Byte


13

PipedInputStream

Luồng nhập byte kiểu ống (piped) thường phải được gắn với một luồng xuất kiểu ống.


14

PipedOutputStream

Luồng nhập byte kiểu ống (piped) thường phải được gắn với một luồng nhập kiểu ống để tạo nên một kết nối trao đổi dữ liệu kiểu ống.


15

PrintStream

Luồng xuất có chứa phương thức print() và println()


16

PushbackInputStream

Là một luồng nhập kiểu Byte mà hỗ trợ thao tác trả lại (push back) và phục hồi thao tác đọc một byte (unread)


17

RandomAccessFile

Hỗ trợ các thao tác đọc, ghi đối với file truy cập ngẫu nhiên.


18

SequenceInputStream

Là một luồng nhập được tạo nên bằng cách nối kết logic các luồng nhập khác.





1. Đọc và ghi ký tự từ luồng Byte




Tạo một luồng Byte gắn với file chỉ định dùng FileInputStream và FileOutputStream. Để mở một file, đơn giản chỉ cần tạo một đối tượng của những lớp này, tên file cần mở là thông số trong constructor. Khi file mở, việc đọc và ghi dữ liệu trên file được thực hiện một cách bình thường thông qua các phương thức cung cấp trong luồng.




1.1. Đọc dữ liệu từ file




- Mở một file để đọc dữ liệu

FileInputStream(String fileName) throws FileNotFoundException

Nếu file không tồn tại: thì ném ra FileNotFoundException

- Đọc dữ liệu: dùng phương thức read()

int read( ) throws IOException: đọc từng byte từ file và

trả về giá trị của byte đọc được. Trả về -1 khi hết file, và

ném ra IOException khi có lỗi đọc.

- Đóng file: dùng phương thức close()

void close( ) throws IOException: sau khi làm việc xongcần đóng file để giải phóng tài nguyên hệ thống đã cấp phát cho file.




1.2. Ghi dữ liệu xuống file




- Mở một file để ghi dữ liệu


FileOutputStream(String fileName) throws FileNotFoundException

Nếu file không tạo được: thì ném ra FileNotFoundException

- Ghi dữ liệu xuống: dùng phương thức write()


void write(int byteval) throws IOException: ghi một byte xác định bởi tham số byteval xuống file, và ném ra IOException khi có lỗi ghi.

- Đóng file: dùng phương thức close()


void close( ) throws IOException: sau khi làm việc xong cần đóng file để giải phóng tài nguyên hệ thống đã cấp phát cho file.

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class CopyFile {
    public static void main(String arg[]) throws IOException{
        FileInputStream in = new FileInputStream("D:\\source.txt");
        FileOutputStream out = new FileOutputStream("D:\\dest.txt");
        int c;
        while((c = in.read()) != -1){
            out.write(c);
        }
        in.close();
        out.close();
    }
}


2. Đọc và ghi dữ liệu nhị phân




Phần trên chúng ta đã đọc và ghi các bytes dữ liệu là các ký tự mã ASCII. Để đọc và ghi những giá trị nhị phân của các kiểu dữ liệu trong java, chúng ta sử dụng DataInputStream và DataOutputStream.




DataInputStream: hiện thực interface DataInput. Interface DataInput có các phương thức cho phép đọc tất cả những kiểu dữ liệu cơ sở của java (theo định dạng nhị phân).







Phương thức

Ý nghĩa


boolean readBoolean( )

Đọc một giá trị boolean


Byte readByte( )

Đọc một byte


char readChar( )

Đọc một char


double readDouble( )

Đọc một giá trị Double


float readFloat( )

Đọc một giá trị float


int readInt( )

Đọc một giá trị int


Long readLong( )

Đọc một giá trị long


short readShort( )

short








DataOutputStream: hiện thực interface DataOuput. Interface DataOutput có các phương thức cho phép ghi tất cả những kiểu dữ liệu cơ sở của java đến luồng (theo định dạng nhị phân).







Phương thức

Ý nghĩa


void writeBoolean (boolean val)

Ghi xuống luồng một giá trị boolean được xác định bởi val.


void writeByte (int val)

Ghi xuống luồng một byte được xác định bởi val.


void writeChar (int val)

Ghi xuống luồng một Char được xác định bởi val.


void writeDouble (double val)

Ghi xuống luồng một giá trị Double được xác định bởi val.


void writeFloat (float val)

Ghi xuống luồng một giá trị float được xác định bởi val.


void writeInt (int val)

Ghi xuống luồng một giá trị int được xác định bởi val.


void writeLong (long val)

Ghi xuống luồng một giá trị long được xác định bởi val.


void writeShort (int val)

Ghi xuống luồng một giá trị short được xác định bởi val.





Ví dụ:


import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class RWData {
    public static void main(String arg[]) throws IOException{
        DataOutputStream out = new DataOutputStream(new FileOutputStream("output.txt"));
        DataInputStream in = new DataInputStream(new FileInputStream("output.txt"));
        int i = 10;
        double d = 123.456;
        boolean b = true;
        System.out.println("Writing " + i);
        out.writeInt(i);
        System.out.println("Writing " + d);
        out.writeDouble(d);
        System.out.println("Writing " + i);
        out.writeBoolean(b);
        out.close();
        System.out.println("");
        
        //Read file
        
        i = in.readInt();
        d = in.readDouble();
        b = in.readBoolean();
        System.out.println("File: " + i + ", " + d + ", " + b);
        in.close();
    }
}