Mục lục
Chúng ta có rất nhiều cách để đọc một file text trong java. Chúng ta có thể sử dụng hầu hết các subclass của InputStream như FileInputStream, BufferedInputStream, ObjectInputStream etc hoặc các subclass của InputStreamReader như FileReader, BufferedReader etc.
Dưới đây mình sẽ tổng hợp một số cách thường được sử dụng để tối ưu tốc độ đọc file nhờ các kỹ thuật bên dưới của chúng.
Đọc file text với FileInputStream
FileInputStream đọc dữ liệu theo luồng byte có thứ tự. Chúng ta có thể chuyển dữ liệu kiểu byte sang char để được văn bản trong file text.
Ví dụ 1: Đọc từng ký tự trong file text với FileInputStream
import java.io.FileInputStream; import java.io.IOException; class ReadFile { public static void main(String args[]) { FileInputStream fin = null; try { fin = new FileInputStream("/Users/nguyenthanhhai/Desktop/test.txt"); System.out.println("FileContents :"); //read characters from FileInputStream and write them int ch; while ((ch = fin.read()) != -1) System.out.print((char) ch); } catch (IOException e) { e.printStackTrace(); } finally { try { if (fin != null) fin.close(); } catch (IOException e) { e.printStackTrace(); } } } }
Ví dụ 2: Đọc một mảng ký tự trong file text với FileInputStream
import java.io.FileInputStream; import java.io.IOException; class ReadFile { public static void main(String args[]) { FileInputStream fin = null; try { fin = new FileInputStream("/Users/nguyenthanhhai/Desktop/test.txt"); System.out.println("FileContents :"); //read characters from FileInputStream and write them byte[] bytes = new byte[5]; // So byte doc duoc tu FileInputStream int bytesReaded = fin.read(bytes); while (bytesReaded != -1) { for (int i = 0; i < bytesReaded; i++) { System.out.print((char) bytes[i]); } bytesReaded = fin.read(bytes); } } catch (IOException e) { e.printStackTrace(); } finally { try { if (fin != null) fin.close(); } catch (IOException e) { e.printStackTrace(); } } } }
Ví dụ 3: Đọc tất cả nội dung file vào mảng với FileInputStream
Note: Lưu ý nếu dữ liệu file quá lớn thì chúng ta nên đọc từng ký tự hoặc một mảng ký tự với kích thước vừa phải để tránh tràn bộ nhớ
import java.io.FileInputStream; import java.io.IOException; class ReadFile { public static void main(String args[]) { FileInputStream fin = null; try { fin = new FileInputStream("/Users/nguyenthanhhai/Desktop/test.txt"); System.out.println("FileContents :"); //read characters from FileInputStream and write them byte[] bytes = new byte[fin.available()]; fin.read(bytes); for (byte b : bytes) System.out.print((char) b); } catch (IOException e) { e.printStackTrace(); } finally { try { if (fin != null) fin.close(); } catch (IOException e) { e.printStackTrace(); } } } }
Ví dụ 4: Đọc từng dòng trong file text với FileInputStream
import java.io.FileInputStream; import java.io.IOException; class ReadFile { public static void main(String args[]) { FileInputStream fin = null; try { fin = new FileInputStream("/Users/nguyenthanhhai/Desktop/test.txt"); int data = fin.read(); StringBuilder line = new StringBuilder(); while (data != -1) { if (((char) data == '\n') || ((char) data == '\r')) { System.out.println("New line: " + line.toString()); line.delete(0, line.length()); data = fin.read(); continue; } line.append((char) data); data = fin.read(); } System.out.println("New line: " + line.toString()); } catch (IOException e) { e.printStackTrace(); } finally { try { if (fin != null) fin.close(); } catch (IOException e) { e.printStackTrace(); } } } }
Đọc file text với BufferedInputStream
BufferedInputStream tăng tốc độ đọc file với cơ chế sử dụng bộ nhớ đệm. BufferedInputStream sẽ đọc một khối dữ liệu vào bộ nhớ đệm của nó, khi chúng ta tiến hành đọc dữ liệu thì nó sẽ lấy từ bộ nhớ đệm để trả về. Kỹ thuật này giúp giảm đáng kể các thao tác I/O.
Ví dụ 1: Đọc từng ký tự trong file text với BufferedInputStream
import java.io.BufferedInputStream; import java.io.FileInputStream; import java.io.IOException; class BufferedInputStreamDemo { public static void main(String args[]) { FileInputStream fin = null; try { fin = new FileInputStream("/Users/nguyenthanhhai/Desktop/test.txt"); BufferedInputStream bin = new BufferedInputStream(fin); int ch; while ((ch = bin.read()) != -1) System.out.print((char) ch); } catch (IOException e) { e.printStackTrace(); } finally { try { if (fin != null) fin.close(); } catch (IOException e) { e.printStackTrace(); } } } }
Ví dụ 2: Đọc một mảng ký tự trong file text với BufferedInputStream
import java.io.BufferedInputStream; import java.io.FileInputStream; import java.io.IOException; class ReadFile { public static void main(String args[]) { FileInputStream fin = null; try { fin = new FileInputStream("/Users/nguyenthanhhai/Desktop/test.txt"); BufferedInputStream bis = new BufferedInputStream(fin); System.out.println("FileContents :"); //read characters from FileInputStream and write them byte[] bytes = new byte[5]; // So byte doc duoc tu FileInputStream int bytesReaded = bis.read(bytes); while (bytesReaded != -1) { for (int i = 0; i < bytesReaded; i++) { System.out.print((char) bytes[i]); } bytesReaded = bis.read(bytes); } } catch (IOException e) { e.printStackTrace(); } finally { try { if (fin != null) fin.close(); } catch (IOException e) { e.printStackTrace(); } } } }
Ví dụ 3: Đọc từng dòng trong file text với BufferedInputStream
import java.io.*; class ReadFile { public static void main(String args[]) { FileInputStream fin = null; try { fin = new FileInputStream("/Users/nguyenthanhhai/Desktop/test.txt"); BufferedInputStream bis = new BufferedInputStream(fin); int data = bis.read(); StringBuilder line = new StringBuilder(); while (data != -1) { if (((char) data == '\n') || ((char) data == '\r')) { System.out.println("New line: " + line.toString()); line.delete(0, line.length()); data = bis.read(); continue; } line.append((char) data); data = bis.read(); } System.out.println("New line: " + line.toString()); } catch (IOException e) { e.printStackTrace(); } finally { try { if (fin != null) fin.close(); } catch (IOException e) { e.printStackTrace(); } } } }
Đọc file text với FileReader
FileReader đọc dữ liệu theo luồng ký tự vì vậy FileReader được khuyến khích sử dụng hơn FileInputStream khi đọc các file text.
Ví dụ 1: Đọc từng ký tự trong file text với FileReader
import java.io.File; import java.io.FileReader; 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(); } } } }
Ví dụ 2: Đọc một mảng các ký tự trong FileReader
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(); } } }
Ví dụ 3: Đọc từng dòng trong FileReader
import java.io.FileReader; import java.io.IOException; class ReadFile { public static void main(String args[]) { try (FileReader fin = new FileReader("/Users/nguyenthanhhai/Desktop/test.txt")) { int data = fin.read(); StringBuilder line = new StringBuilder(); while (data != -1) { if (((char)data == '\n') || ((char)data == '\r')) { System.out.println("New line: " + line.toString()); line.delete(0, line.length()); data = fin.read(); continue; } line.append((char)data); data = fin.read(); } System.out.println("New line: " + line.toString()); } catch (IOException e) { e.printStackTrace(); } } }
Đọc file text sử dụng BufferedReader
Sử dụng BufferedReader với FileReader nhầm tối ưu tốc độ đọc file với cơ chế sử dụng bộ nhớ đệm. Trong đa số trường hợp chúng ta nên sử dụng BufferedReader với FileReader.
Ví dụ 1: Đọc từng ký tự trong file text với BufferedReader
import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; class BufferedReaderExample { public static void main(String[] args) { try (BufferedReader bufferedReader = new BufferedReader(new FileReader("/Users/nguyenthanhhai/Desktop/test.txt"))) { int data = bufferedReader.read(); while (data != -1) { System.out.print((char) data); data = bufferedReader.read(); } } catch (IOException e) { e.printStackTrace(); } } }
Ví dụ 2: Đọc từng dòng trong file text với BufferedReader
import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; class BufferedReaderExample { public static void main(String[] args) { try (BufferedReader bufferedReader = new BufferedReader(new FileReader("/Users/nguyenthanhhai/Desktop/test.txt"))) { String line = bufferedReader.readLine(); while (line != null) { System.out.println(line); line = bufferedReader.readLine(); } } catch (IOException e) { e.printStackTrace(); } } }
Tóm lược
Chúng ta có rất nhiều cách để đọc một file text. Thế nhưng mỗi cách có một ưu nhược điểm khác nhau. Mình thì thường sử dụng BufferedReader để đọc file text vì nó vừa tối ưu để đọc file text mà lại còn có cơ chế sử dụng bộ nhớ đệm để tăng tốc độ độc ghi file.