Tags:

Sử dụng FileReader đọc file txt thay thế FileInputStream

Điểm khác nhau cơ bản giữa FileReader và FileInputStream là FileReader đọc file dưới dạng luồng ký tự khác với FileInputStream đọc file theo luồng byte. Vì vậy FileReader được khuyến khích cho sử dụng đọc file text hơn so với FileInputStream.

FileReader-Class-Hierarchy

Khởi tạo FileReader

Để khởi tạo FileReader chúng ra sẽ thông qua 3 constructor sau

  • FileReader(File file) – Khởi tạo FileReader object dựa trên File object.
  • FileReader(FileDescriptor fd) – Khởi tạo FileReader object dựa trên FileDescriptor.
  • FileReader(String pathName) – Khởi tạo FileReader object theo đường dẫn chỉ định.

Ví dụ đọc file text trong FileReader

Giả sử mình có file file.txt tại đường dẫn /Users/nguyenthanhhai/Desktop/test.txt với nội dung hello.

Sử dụng read() method để đọc từng byte dữ liệu. read() trả về -1 nếu đã đọc đến cuối file.

public class FileReaderReadExample {

	public static void main(String[] args) {
		File file = null;
		FileReader reader = null;
		try {
			file = new File("/Users/nguyenthanhhai/Desktop/test.txt");
			reader = new FileReader(file);
			int i;
			while ((i=reader.read())!= -1) {
				System.out.print((char)i);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			try {
				if (reader != null) {
					reader.close();
				}
			} catch (Exception e2) {
				e2.printStackTrace();
			}
		}
	}
}

Output: hello

Sử dụng read(char[] cbuf) để đọc vào một mảng ký tự thay vì đọc từng byte như ví dụ trên. Nếu mảng truyền vào có kích thước lớn hơn số ký tự char đọc được thì phần còn lại sẽ rỗng(mang giá trị mặc định là 0)

Parameter: cbuf: Mảng chứa ký tự đọc được

Return: số byte đọc được hoặc -1 nếu đã đọc hết dữ liệu từ file.

import java.io.File;
import java.io.FileReader;

class ReadFileUsingFileReader {

    public static void main(String[] args) {
        File file = new File("/Users/nguyenthanhhai/Desktop/test.txt");
        try (FileReader reader = new FileReader(file)){
            char[] cs = new char[5];
            int bytes = reader.read(cs);
            while (bytes != -1) {
                for (int i = 0; i < bytes; i++) {
                    System.out.print(cs[i]);
                }
                bytes = reader.read(cs);
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Output: hello

Ngoài ra chúng ta cũng có thể chỉ định rằng các ký tự được ghi vào vị trí đầu tiên ở đâu và đọc tối đa bao nhiêu ký tự bằng read(char[] cbuf, int off, int len)

Parameter:

  • cbuf: Mảng chứa ký tự đọc được
  • off: Vị trí bắt đầu ghi vào mảng cbuf
  • len: Số ký tự tối đa có thể đọc được

Return: số byte đọc được hoặc -1 nếu đã đọc hết dữ liệu từ file.

import java.io.File;
import java.io.FileReader;

class ReadFileUsingFileReader {

    public static void main(String[] args) {
        File file = new File("/Users/nguyenthanhhai/Desktop/test.txt");
        try (FileReader reader = new FileReader(file)){
            char[] cs = new char[5];
            int bytes = reader.read(cs, 0, 5);
            while (bytes != -1) {
                for (int i = 0; i < bytes; i++) {
                    System.out.print(cs[i]);
                }
                bytes = reader.read(cs, 0, 5);
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Output: hello

read(CharBuffer target) cũng được dùng để đọc dữ liệu trong FileReader vào CharBuffer.

Parameter: target chứa ký tự đọc được

Return: số byte đọc được hoặc -1 nếu đã đọc hết dữ liệu từ file.

import java.io.File;
import java.io.FileReader;
import java.nio.CharBuffer;

class ReadFileUsingFileReader {
    public static void main(String[] args) {
        File file = new File("/Users/nguyenthanhhai/Desktop/test.txt");
        try (FileReader reader = new FileReader(file);){
            //create char buffer with the capacity of 50
            CharBuffer cs = CharBuffer.allocate(50);
            //read characters into char buffer
            reader.read(cs);
            //flip char buffer
            cs.flip();
            System.out.println(cs.toString());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Output: hello

Bỏ qua n ký tự trong FileReader

Sử dụng skip(long n) để bỏ qua n ký tự trong FileReader

import java.io.File;
import java.io.FileReader;
import java.nio.CharBuffer;

class ReadFileUsingFileReader {
    public static void main(String[] args) {
        File file = new File("/Users/nguyenthanhhai/Desktop/test.txt");
        try (FileReader reader = new FileReader(file);){
            //create char buffer with the capacity of 50
            CharBuffer cs = CharBuffer.allocate(50);
            //read characters into char buffer
            reader.skip(2);
            reader.read(cs);
            //flip char buffer
            cs.flip();
            System.out.println(cs.toString());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Output: llo

Đóng kết nối FileReader

Lưu ý rằng sau khi mọi thao tác với file đã hoàn tất bạn cần phải ngắt kết nối đến chúng, nếu không một trong những lỗi phổ biến là ứng dụng sử dụng file trong thời gian dài trong khi mọi thao tác đã hoàn tất bạn muốn xoá, di chuyển file đó là điều không thể etc. Sử dụng close() method để ngắt kết nối trong FileReader.

fileReader.close();

Tối ưu hiệu xuất trong FileReader

Việc đọc từng ký tự sẽ chậm hơn rất nhiều so với việc đọc một mảng ký tự tại một thời điểm. Thế nên nếu có thể hãy đọc theo một mảng byte ở mỗi lần đọc nhé.

FileReader thườmg được sử dụng với BufferedReader để tối ưu hoá hiệu bằng việc sử dụng bộ nhớ đệm cho các lần đọc dữ liệu.

Kết

Nếu bạn đang muốn đọc một file text thì mình quyên là nên sử dụng FileReader thay vì FileInputStream, vì những lợi thể mà mình nêu ở trên.

Nguồn tham khảo

Java FileReader

http://tutorials.jenkov.com/java-io/filereader.html

0 0 votes
Article Rating
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x