Home > File > Đọc file trong Java

Đọc file trong Java

Trong Java, có nhiều cách để đọc 1 file, bạn có thể lựa chọn cách phù hợp tùy theo mục đích.

1 . Sử dụng java.nio.file.Files : Nếu bạn muốn đọc tất cả nội dung của một file thành một mảng byte hoặc đọc tất cả các dòng thành một list thì có thể sử dụng lớp Files. Lớp Files được gới thiệu trong Java 7 và nó là cách tốt nếu bạn muốn load tất cả nội dung của file. Bạn chỉ nên sử dụng phương thức này khi làm việc với file nhỏ và cần load tất cả nội dung vào memory.

2. Sử dụng java.io.FileReader : Bạn có thể sử dụng FileReader để nhận về BufferedReader và sau đó đọc file theo từng dòng một. FileReader không hỗ trợ mã hóa và làm việc với bảng mã mặc định của hệ thống, do đó nó không phải là một cách hữu hiệu để đọc file trong Java

3. Sử dụng java.io.BufferedReader : BufferedReader là cách tốt nếu bạn muốn đọc file theo từng dòng và xử lý trên chúng. Nó phù hợp cho việc xử lý file lớn và nó cũng hỗ trợ encoding. BufferedReader là đồng bộ ( synchronized  ), do đó thao tác đọc trên một BufferedReader có thể thực hiện an toàn từ nhiều thread . BufferedReader mặc định có bộ đệm ( buffer ) kích thước 8KB.

4. Sử dụng java.util.Scanner : Nếu bạn muốn đọc file theo từng dòng và dựa vào java regular expression, Scanner là một lớp phù hợp cho việc đó. Scanner tách đầu vào của nó thành các dấu hiệu (tokens) sử dụng một mẫu tách ( delimiter pattern ), cái mà mặc định so khớp với khoảng trắng. Các tokens kết quả sau đó có thể được chuyển đổi thành giá trị của các loại khác nhau sử dụng các phương thức khác nhau tiếp theo. Scanner là không đồng bộ và vì thế không an toàn khi sử dụng multi thread.

Ví dụ sau là minh họa cách sử dụng Files, BuferedReader, Scanner ( có hỗ trợ encoding ) và FileReader ( không hỗ trợ encoding ).

package quyetdv.java.javaio.file;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
import java.util.Scanner;
public class ReadFileExample {
    static final String fileName = "test1.txt";
    public static void main(String[] args) throws IOException {
        // using Java 7 Files class to process small files, get complete file data
        readUsingFiles(fileName);

        // using FileReader, no encoding support, not efficient
        readUsingFileReader(fileName);

        // using BufferedReader, to read line by line
        readUsingBufferedReader(fileName);
        readUsingBufferedReader(fileName, StandardCharsets.UTF_8);
        readUsingBufferedReaderJava7(fileName, StandardCharsets.UTF_8);

        // using Scanner class for larget files, to read line by line
        readUsingScanner(fileName);
    }

     private static void readUsingFiles(String fileName) throws IOException {
         Path path = Paths.get(fileName);
         // read file to byte array
         byte[] bytes = Files.readAllBytes(path);
         // read file to String list
         List<String> allLines = Files
             .readAllLines(path, StandardCharsets.UTF_8);
         for (String line : allLines) {
              System.out.println(line);
         }
    }
    private static void readUsingFileReader(String fileName) throws IOException {
        File file = new File(fileName);
        FileReader fr = new FileReader(file);
        BufferedReader br = new BufferedReader(fr);
        String line;
        while ((line = br.readLine()) != null) {
            // process the line
            System.out.println(line);
        }
        br.close();
        fr.close();
    }
    private static void readUsingBufferedReader(String fileName, Charset cs)
        throws IOException {
        File file = new File(fileName);
        FileInputStream fis = new FileInputStream(file);
        InputStreamReader isr = new InputStreamReader(fis, cs);
        BufferedReader br = new BufferedReader(isr);
        String line;
        while ((line = br.readLine()) != null) {
           // process the line
           System.out.println(line);
        }
        br.close();
    }
    private static void readUsingBufferedReaderJava7(String fileName, Charset cs)
        throws IOException {
        Path path = Paths.get(fileName);
        BufferedReader br = Files.newBufferedReader(path, cs);
        String line;
        while ((line = br.readLine()) != null) {
            // process the line
            System.out.println(line);
        }
        br.close();
    }
    private static void readUsingBufferedReader(String fileName)
        throws IOException {
        File file = new File(fileName);
        FileReader fr = new FileReader(file);
        BufferedReader br = new BufferedReader(fr);
        String line;
        while ((line = br.readLine()) != null) {
            // process the line
            System.out.println(line);
        }
        br.close();
        fr.close();
    }
    private static void readUsingScanner(String fileName) throws IOException {
        Path path = Paths.get(fileName);
        Scanner scanner = new Scanner(path);
        // read line by line
        while (scanner.hasNextLine()) {
            // process each line
            String line = scanner.nextLine();
        }
    }
}
Advertisements
Categories: File
  1. No comments yet.
  1. No trackbacks yet.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: