1. Một số cách đọc file trong Java

Đọc file trong Java là một kỹ thuật quan trọng cần phải nắm nếu muốn làm việc sâu hơn với Java. Trước kia, có thể ta đã quen thuộc với việc đọc dữ liệu từ console. Tuy nhiên đối với những file dữ liệu lớn, dài hàng nghìn – hàng triệu dòng thì sẽ xử lý ra sao? Java là một ngôn ngữ mạnh mẽ đã cung cấp cho ta rất nhiều tùy chọn cho từng trường hợp cụ thể.

Các phương thức hỗ trợ đọc file không chỉ trong Java mà hầu hết các ngôn ngữ lập trình khác đều có. Tuy nhiên, tùy vào mỗi ngôn ngữ mà nó lại có cách thức xử lý khác nhau. Đọc file trong Java có thể nói là khá đa dạng ở phương thức hỗ trợ.

Có nhiều lớp có sẵn trong API Java có thể được sử dụng để đọc và ghi tệp trong Java:

  • FileReader
  • BufferedReader
  • Files, Scanner
  • FileInputStream
  • FileWriter
  • BufferedWriter
  • FileOutputStream

Sử dụng lớp nào tùy thuộc vào phiên bản Java ta đang làm việc và liệu ta cần đọc byte hay ký tự, kích thước của tệp / dòng,…

2. Đọc file trong Java sử dụng Scanner

Cách sử dụng Scanner , xuất nhập trên màn hình console trước đây có lẽ đã quá quen thuộc. Khi sử dụng file, Scanner cung cấp 2 phương thức hasNextLine()nextLine() hỗ trợ đọc file rất đơn giản, gần gũi và dễ sử dụng.

Ví dụ: trước tiên hãy tạo một file text.txt với nội dung bất kỳ nhé

package file;

// Import package cần thiết
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Scanner;
import java.util.logging.Level;
import java.util.logging.Logger;

public class ReadFileWithScanner {
    public static void main(String args[]) throws FileNotFoundException {

        String url = "D:\\Java\\file-content.txt";
        // Đọc dữ liệu từ File với Scanner
        FileInputStream fileInputStream = new FileInputStream(url);
        Scanner scanner = new Scanner(fileInputStream);

        try {
            while (scanner.hasNextLine()) {
                System.out.println(scanner.nextLine());
            }
        } finally {
            try {
                scanner.close();
                fileInputStream.close();
            } catch (IOException ex) {
                Logger.getLogger(ReadFileWithBufferedReader.class.getName())
                                .log(Level.SEVERE, null, ex);
            }
        }
    }
}

Ở đây các bạn có thể đổi đường dẫn tới file đã lưu nhé! Các bạn có thể chỉnh sửa ở dòng code String url = "D:\\Java\\file-content.txt";

Hoặc một ví dụ khác

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;

public class ReadFile {  
  public static void main(String[] args) {  
    try {
      File myObj = new File("filename.txt");
      Scanner myReader = new Scanner(myObj);  
      while (myReader.hasNextLine()) {
        String data = myReader.nextLine();
        System.out.println(data);
      }
      myReader.close();
    } catch (FileNotFoundException e) {
      System.out.println("Đã xảy ra lỗi.");
      e.printStackTrace();
    } 
  }  
}

3. Đọc file trong Java sử dụng BufferedReader

Cách sử dụng BufferedReader trong Java để đọc file có thể xem là phương pháp dễ sử dụng nhất. BufferedReader là một lớp Java để đọc văn bản từ luồng đầu vào (như tệp) bằng cách đệm và đọc liền mạch các ký tự, mảng hoặc dòng. Để làm việc với BufferedReader trong Java chúng ta có nhiều phương thức:

  • void close() : Đóng luồng và giải phóng bất kỳ tài nguyên hệ thống nào được liên kết với nó
  • void mark(int readAheadLimit) : Đánh dấu vị trí hiện tại trong luồng. Các lời gọi tiếp theo đến reset() sẽ cố gắng định vị lại luồng đến điểm này.
  • boolean markSupported() : Nó được sử dụng để kiểm tra input stream có hỗ trợ các phương thức mark()reset() không.
  • int read() : Đọc một ký tự duy nhất.
  • int read(char[] cbuf, int off, int len) : Đọc các phần tử của một mảng.

Khi sử dụng class BufferedReader trong Java để đọc nội dung một file text thì chúng ta có hai cách khác nhau đó là sử dụng phương thức readLine() hoặc read() của class này.

Ví dụ:

package file;

// Import package cần thiết
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Scanner;
import java.util.logging.Level;
import java.util.logging.Logger;

public class ReadFileWithScanner {
    public static void main(String args[]) throws FileNotFoundException {

        String url = "D:\\Java\\file-content.txt";
        // Đọc dữ liệu từ File với Scanner
        FileInputStream fileInputStream = new FileInputStream(url);
        Scanner scanner = new Scanner(fileInputStream);

        try {
            while (scanner.hasNextLine()) {
                System.out.println(scanner.nextLine());
            }
        } finally {
            try {
                scanner.close();
                fileInputStream.close();
            } catch (IOException ex) {
                Logger.getLogger(ReadFileWithBufferedReader.class.getName())
                                .log(Level.SEVERE, null, ex);
            }
        }
    }
}

4. Sử dụng File và FileReader để đọc file trong Java

Phương pháp này tương tự như việc sử dụng BufferedReader nhưng có phần đơn giản hơn một chút.

Ví dụ:

package file;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;

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

        String url = "D:\\Java\\file-content.txt";

        // Đọc dữ liệu từ File với File và FileReader
        File file = new File(url);
        BufferedReader reader = new BufferedReader(new FileReader(file));

        try {
            String line = reader.readLine();
            while (line != null) {
                System.out.println(line);
                line = reader.readLine();
            }
        } catch (FileNotFoundException ex) {
            Logger.getLogger(ReadFileWithBufferedReader.class.getName())
                            .log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(ReadFileWithBufferedReader.class.getName())
                            .log(Level.SEVERE, null, ex);
        } finally {
            try {
                reader.close();
                // file.close();
            } catch (IOException ex) {
                Logger.getLogger(ReadFileWithBufferedReader.class.getName())
                                .log(Level.SEVERE, null, ex);
            }
        }
    }
}