Lập trình Java cơ bản

Bài 24: Xử lý nhập xuất bằng Byte Stream và Character Stream

1. FileInputStream và FileOutputStream (Byte Stream)

Lớp FileInputStream trong java đọc được các byte từ một input file. Nó được sử dụng để đọc dữ liệu theo định dạng byte (các byte stream) như dữ liệu hình ảnh, âm thanh, video vv. Bạn cũng có thể đọc các dữ liệu có định dạng ký tự. Tuy nhiên, để đọc các dòng ký tự (các character stream), bạn nên sử dụng lớp FileReader.
Lớp FileOutputStream là một output stream được sử dụng để ghi dữ liệu vào một file theo định dạng byte (byte stream). Sử dụng lớp FileOutputStream trong java, nếu bạn phải ghi các giá trị nguyên thủy vào một file. Bạn có thể ghi dữ liệu theo định dạng byte hoặc định dạng ký tự thông qua lớp FileOutputStream. Tuy nhiên, đối với các dữ liệu được ghi theo ký tự, sử dụng FileWriter thích hợp hơn FileOutStream.
Ví dụ 1: Đọc và ghi lần lượt từng byte
package com.company;

import java.io.*;

public class Main {
    public static void main(String args[])throws IOException {
        
        FileInputStream fis = new FileInputStream("E:/bkitsoftware/input.txt");
        FileOutputStream fos = new FileOutputStream("E:/bkitsoftware/output.txt");
        int i = -1;
        // Đọc lần lượt các byte (8bit) trong luồng và lưu vào biến i
        // Khi đọc ra giá trị -1 nghĩa là kết thúc luồng.
        while ((i = fis.read()) != -1) {
            System.out.println((char) i);
            fos.write(i);
        }
        fis.close();
        fos.close();
    }
}
Kết quả thu được là file output.txt được tạo và có nội dung giống file input.txt. Trên màn hình console, có kí tự được in từng dòng một là do các byte được đọc 1 cách lần lượt.
B
k
i
t
S
o
f
t
w
a
r
e
Ví dụ 2: Đọc và ghi lần lượt từng byte
Cũng tương tự như ví dụ trên, nhưng lần này chúng ta sẽ đọc cùng lúc 10 byte
package com.company;

import java.io.*;

public class Main {
    public static void main(String args[])throws IOException {

        FileInputStream fis = new FileInputStream("E:/bkitsoftware/input.txt");
        FileOutputStream fos = new FileOutputStream("E:/bkitsoftware/output.txt");
        int i = -1;
        byte[] bytes = new byte[10];// Đọc 10 byte 1 thời điểm
        while ((i = fis.read(bytes)) != -1) {
            System.out.println(new String(bytes,0,i));
            fos.write(bytes,0,i);
        }
        fis.close();
        fos.close();
    }
}
Kết quả thu được đối với file là tương tự, còn đối với màn hình console kết quả là:
BkitSoftwa // 10 bytes đầu tiên
re

2. Sử dụng ByteArrayInputStream & ByteArrayOutputStream (Byte Stream)

Lớp ByteArrayInputStream cho phép một bộ đệm buffer trong bộ nhớ để được sử dụng như là một InputStream. Nguồn input này là một mảng byte.
Lớp ByteArrayOutputStream trong Java tạo một buffer trong bộ nhớ và tất cả dữ liệu được gửi tới stream này được lưu trong buffer.   
Ví dụ 1:  Sử dụng ByteArrayInputStream
package com.company;

import java.io.*;

public class Main {
    public static void main(String args[])throws IOException {

        byte[] buf = new byte[] { 'b', 'k', 'i', 't', 's', 'o', 'f', 't', 'w', 'a', 'r','e' };
        // Create the new byte array input stream
        ByteArrayInputStream byt = new ByteArrayInputStream(buf);
        int k = 0;
        while ((k = byt.read()) != -1) {
            // Conversion of a byte into character
            char ch = (char) k;
            System.out.println("ASCII value of Character is:" + k + " - Special character is: " + ch);
        }
    }
}
ASCII value of Character is:98 - Special character is: b
ASCII value of Character is:107 - Special character is: k
ASCII value of Character is:105 - Special character is: i
ASCII value of Character is:116 - Special character is: t
ASCII value of Character is:115 - Special character is: s
ASCII value of Character is:111 - Special character is: o
ASCII value of Character is:102 - Special character is: f
ASCII value of Character is:116 - Special character is: t
ASCII value of Character is:119 - Special character is: w
ASCII value of Character is:97 - Special character is: a
ASCII value of Character is:114 - Special character is: r
ASCII value of Character is:101 - Special character is: e
Ví dụ 2:  Sử dụng ByteArrayOutputStream  
package com.company;

import java.io.*;

public class Main {
    public static void main(String args[])throws IOException {

        FileOutputStream fout1 = new FileOutputStream("E:/bkitsoftware/input1.txt");
        FileOutputStream fout2 = new FileOutputStream("E:/bkitsoftware/input2.txt");

        ByteArrayOutputStream bout = new ByteArrayOutputStream();
        bout.writeTo(fout1);
        bout.writeTo(fout2);
        bout.flush();
        bout.close();
        System.out.printlnn");
    }
}
Success...

3. Sử dụng DataInputStream và DataOutputStream (Byte Stream)

Lớp DataInputStream trong java cho phép một ứng dụng đọc dữ liệu nguyên thủy từ luồng đầu vào một cách độc lập với máy.
Lớp DataOutputStream trong java cho phép một ứng dụng ghi các kiểu dữ liệu Java nguyên thủy đến output stream một cách độc lập với máy.
Ví dụ 1: Sử dụng DataInputStream
package com.company;

import java.io.*;

public class Main {
    public static void main(String args[])throws IOException {
        String name = "bkitsoftware";

        OutputStream file = new FileOutputStream("E:/bkitsoftware/test.txt");
        DataOutputStream data = new DataOutputStream(file);
        data.writeUTF(name);
        data.flush();
        data.close();
    }
}
Ta thu được file test.txt có nội dung là "bkitsoftware"
Ví dụ 2: Sử dụng DataOutputStream
package com.company;

import java.io.*;

public class Main {
    public static void main(String args[])throws IOException {
        InputStream input = new FileInputStream("E:/bkitsoftware/test.txt");
        DataInputStream inst = new DataInputStream(input);

        String content = inst.readUTF();

        System.out.println("Content: " + content);

        inst.close();
    }
}
Kết quả thu được:
Name: bkitsoftware
Trên đây là 3 stream thường dùng nhất trong Byte Stream, sang bài tiếp theo, chúng ta sẽ tìm hiểu về các stream thường dùng của Character Stream.

4. Sử dụng FileReader và FileWriter (Character Stream)

Lớp FileReader trong java được sử dụng để đọc các dữ liệu theo định dạng ký tự trong một file. Lớp FileWriter trong java được sử dụng để ghi các dữ liệu theo định dạng ký tự vào một file. Chúng ta nên sử dụng 2 lớp này khi thao tác với file ký tự.
Do là Character Stream nên khi sử dụng 2 lớp này, chúng ta không cần chuyển đổi về mảng byte để đọc/ghi.
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.
Trên đây, chúng ta đã tìm hiểu về những stream thường dùng nhất trong xử lý nhập xuất file trong Java, về cơ bản, để đọc file binary( file ảnh, phim...) nên dùng InputStream, còn đọc file text (txt) nên dùng FileReader.

Danh sách bài học