12/08/2018, 15:59

Different ways of Reading a text file in Java

Đọc, ghi file là một phần cần thiết trong các ứng dụng. Hôm nay mình xin chia sẻ một số cách đọc dữ liệu từ file text sử dụng ngôn ngữ java mà mình biết. Có một vài cách để đọc file văn bản thuần túy trong java như : BufferedReader, FileReader, Scanner. Mỗi tiện ích này lại có những khả năng khác ...

Đọc, ghi file là một phần cần thiết trong các ứng dụng. Hôm nay mình xin chia sẻ một số cách đọc dữ liệu từ file text sử dụng ngôn ngữ java mà mình biết. Có một vài cách để đọc file văn bản thuần túy trong java như : BufferedReader, FileReader, Scanner. Mỗi tiện ích này lại có những khả năng khác nhau. Như BufferedReader thì cung cấp bộ đệm giúp khả năng đọc ghi nhanh, Scanner cung cấp nhiều hàm tiện ích hơn và khả năng phân tích cú pháp. Trong một số trường hợp ta có thể kết hợp cả hai loại này. Ở Java SE 8 giới thiệu lớp java.util.stream.Stream đọc file hiệu quả hơn.

Một vài cách đọc file

Sử dụng BufferedReader

Đây có thể nói là phương pháp dễ nhất, nó cung cấp hàm readLine() để đọc dữ liệu từ file (đọc file theo dòng). BufferedReader cần dùng một InputStream để mở và đọc file. Kích thước bộ đệm của BufferedReader có thể được chỉ định hoặc sử dụng kích thước mặc định. Thông thường kích thước bộ đệm mặc định cũng đủ sử dụng trong hầu hết các trường hợp.

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.logging.Level;
import java.util.logging.Logger;

public class ReadFileWithBufferedReader {
    public static void main(String args[]) throws IOException {
 
        // đọc dữ liệu theo dòng với BufferedReader
        FileInputStream fis = null;
        BufferedReader reader = null;
 
        try {
            fis = new FileInputStream("C:/sample.txt");
            reader = new BufferedReader(new InputStreamReader(fis));
 
            System.out.println("đọc dữ liệu theo dòng với BufferedReader");
 
            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();
                fis.close();
            } catch (IOException ex) {
                Logger.getLogger(ReadFileWithBufferedReader.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }
}

hoặc dùng với (File và FileReader) như bên dưới

public static void main(String args[]) throws IOException {
    try {
        File file = new File("C:/sample.txt");
        BufferedReader reader = new BufferedReader(new FileReader(file));

        System.out.println("đọc dữ liệu theo dòng với BufferedReader");

        String line = reader.readLine();
        while(line != null){
            System.out.println(line);
            line = reader.readLine();
        }
    } catch (FileNotFoundException ex) {
       ...
    } catch (IOException ex) {
       ...
    } finally {
        try {
            reader.close();
            file.close();
        } catch (IOException ex) {
           ...
        }
    }
}

Khi sử dụng FileInputStream hoặc IOReader đừng quên đóng stream trong đoạn finally để file descriptor được giải phóng. Nếu bạn không đóng thì có thể gây lỗi cho file descriptor, và trong trường hợp xấu nhất thì nó không thể đọc thêm một file mới nào nữa. Nếu bạn sử dụng Java 7 thì bạn có thể sử dụng tính năng tự quản lý tài nguyên để giải phóng tài nguyên cách tự động.

Sử dụng Scanner

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

public class ReadFileWithScanner {
    public static void main(String args[]) throws FileNotFoundException  {
        try {
            FileInputStream fis = new FileInputStream("C:/sample.txt");
            Scanner scanner = new Scanner(fis);
            System.out.println("Đọc file sử dụng  Scanner");
            while(scanner.hasNextLine()){
                System.out.println(scanner.nextLine());
            }
        } catch (FileNotFoundException ex) {
           ...
        } catch (IOException ex) {
           ...
        } finally {
            try {
                scanner.close();
                fis.close();
            } catch (IOException ex) {
               ...
            }
        }
    }
}

Sử dụng Scanner đọc đến cuối file mà không sử dụng vòng lặp ``` import java.io.File; import java.io.FileNotFoundException; import java.util.Scanner;

public class ReadingEntireFileWithoutLoop { public static void main(String[] args) throws FileNotFoundException { File file = new File("C:/sample.txt"); Scanner sc = new Scanner(file);

// cần sử dụng  như dấu phân cách (delimiter)
sc.useDelimiter("");

System.out.println(sc.next());

} }

<br>
#### Đọc tất cả các dòng trong file vào một list kiểu String

import java.util.; import java.nio.charset.StandardCharsets; import java.nio.file.; import java.io.*; public class ReadFileIntoList { public static List<String> readFileInList(String fileName) { List<String> lines = Collections.emptyList(); try { lines = Files.readAllLines(Paths.get(fileName), StandardCharsets.UTF_8); } catch (IOException e) { // do something e.printStackTrace(); } return lines; } public static void main(String[] args) { List l = readFileInList("C:/sample.txt"); Iterator<String> itr = l.iterator(); while (itr.hasNext()) System.out.println(itr.next()); } }

<br>

Còn một cách bên dưới, nhưng hầu như mình không sử dụng cách này.

package io; import java.nio.file.*;; public class ReadTextAsString { public static String readFileAsString(String fileName)throws Exception { String data = ""; data = new String(Files.readAllBytes(Paths.get(fileName))); return data; }

public static void main(String[] args) throws Exception { String data = readFileAsString("C:/sample.txt"); System.out.println(data); } }

<br>
#### Sử dụng Stream

import java.io.IOException; import java.nio.file.Files; import java.nio.file.Paths; import java.util.stream.Stream;

public class TestReadFile { public static void main(String args[]) { String fileName = "C:/sample.txt"; try (Stream<String> stream = Files.lines(Paths.get(fileName))) { stream.forEach(System.out::println); } catch (IOException e) { e.printStackTrace(); } } }

Trên đây là một vài cách đọc file, tùy vào từng thói quen và vào trường hợp cụ thể mọi người sẽ có cách tùy biến khác nhau. Hi vọng sẽ có ích ít nhiều với mọi người. :)
0