Computer >> Máy Tính >  >> Lập trình >> Java

Cách đọc tệp trong Java

Java cung cấp một số phương pháp để đọc tệp. Mỗi phương pháp này thích hợp để đọc các loại tệp khác nhau trong các tình huống khác nhau. Một số tốt hơn để đọc các tệp dài hơn, một số khác tốt hơn để đọc các tệp ngắn hơn, v.v.

Trong hướng dẫn này, chúng tôi sẽ sử dụng các lớp Java sau để đọc tệp

  • BufferedReader
  • Tệp
  • Máy quét

Trong suốt hướng dẫn, chúng tôi đang sử dụng một tệp được lưu trữ trong src thư mục chứa đường dẫn đến tệp là src/file.txt .

Lưu trữ một vài dòng văn bản trong tệp này trước khi tiếp tục.

Lưu ý:Bạn phải xử lý đúng các lỗi khi sử dụng các triển khai này để tuân thủ các phương pháp mã hóa tốt nhất.

Đọc tệp văn bản trong Java với BufferedReader

BufferedReader lớp đọc một luồng nhập ký tự. Nó đệm các ký tự trong bộ đệm với kích thước mặc định là 8 KB để làm cho quá trình đọc hiệu quả hơn. Nếu bạn muốn đọc từng dòng một tệp, sử dụng BufferedReader là một lựa chọn tốt.

BufferedReader hiệu quả trong việc đọc các tệp lớn.

import java.io.*;

public class FileReaderWithBufferedReader {

    public static void main(String[] args) throws IOException{We
        String file = "src/file.txt";
        BufferedReader bufferedReader = new BufferedReader(new FileReader(file));

        String curLine;
        while ((curLine = bufferedReader.readLine()) != null){
            //process the line as required
            System.out.println(curLine);
        }
        bufferedReader.close();
    }
}

readline() phương thức trả về null khi đến cuối tệp.

Lưu ý:Đừng quên đóng tệp khi đọc xong.

Đọc tệp được mã hóa UTF-8 trong Java bằng BufferedReader

Chúng ta có thể sử dụng BufferedReader lớp để đọc tệp được mã hóa UTF-8.

Lần này, chúng tôi chuyển một InputStreamReader khi tạo BufferedReader ví dụ.

import java.io.*;

public class EncodedFileReaderWithBufferedReader {

    public static void main(String[] args) throws IOException {
        String file = "src/fileUtf8.txt";
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(file), "UTF-8"));

        String curLine;
        while ((curLine = bufferedReader.readLine()) != null){
            //process the line as you require
            System.out.println(curLine);
        }
    }
}

Sử dụng Lớp Tệp Java để Đọc Tệp

Java Files , được giới thiệu trong Java 7 trong Java NIO, bao gồm đầy đủ các phương thức tĩnh hoạt động trên tệp.

Sử dụng Files lớp, bạn có thể đọc toàn bộ nội dung của một tệp vào một mảng. Điều này làm cho nó trở thành một lựa chọn tốt để đọc các tệp nhỏ hơn.

Hãy xem cách chúng ta có thể sử dụng lớp Tệp trong cả hai trường hợp này.

Đọc các tệp nhỏ trong Java với lớp tệp

readAllLines() phương thức của Files lớp cho phép đọc toàn bộ nội dung của tệp và lưu trữ từng dòng trong một mảng dưới dạng chuỗi.

Bạn có thể sử dụng Path lớp để lấy đường dẫn đến tệp kể từ Files lớp chấp nhận Path đối tượng của tệp.

import java.io.IOException;
import java.nio.file.*;
import java.util.*;

public class SmallFileReaderWithFiles {

    public static void main(String[] args) throws IOException {
        String file = "src/file.txt";
        Path path = Paths.get(file);
        List<String> lines = Files.readAllLines(path);
    }
}

Bạn có thể sử dụng readAllBytes() để truy xuất dữ liệu được lưu trữ trong tệp sang mảng byte thay vì mảng chuỗi.

byte[] bytes = Files.readAllBytes(path);

Đọc Tệp Lớn trong Java với Lớp Tệp

Nếu bạn muốn đọc một tệp lớn với Files , bạn có thể sử dụng newBufferedReader() phương thức để lấy một bản sao của BufferedReader lớp và đọc từng dòng tệp bằng BufferedReader .

import java.io.*;
import java.nio.file.*;

public class LargeFileReaderWithFiles {

    public static void main(String[] args) throws IOException {
        String file = "src/file.txt";
        Path path = Paths.get(file);
        BufferedReader bufferedReader = Files.newBufferedReader(path);

        String curLine;
        while ((curLine = bufferedReader.readLine()) != null){
            System.out.println(curLine);
        }
        bufferedReader.close();
    }
}

Đọc tệp bằng Files.lines ()

Java 8 đã giới thiệu một phương pháp mới cho lớp Tệp để đọc toàn bộ tệp vào một Stream trong số các chuỗi.

import java.io.IOException;
import java.nio.file.*;
import java.util.stream.Stream;

public class FileReaderWithFilesLines {

    public static void main(String[] args) throws IOException {
        String file = "src/file.txt";
        Path path = Paths.get(file);
        Stream<String> lines = Files.lines(path);

        lines.forEach(s -> System.out.println(s));
        lines.close();
    }
}

Đọc Tệp Văn bản trong Java bằng Máy quét

Scanner lớp chia nội dung của một tệp thành các phần bằng cách sử dụng một dấu phân cách đã cho và đọc nó từng phần một. Cách tiếp cận này phù hợp nhất để đọc nội dung được phân tách bằng dấu phân cách.

Ví dụ:Scanner lớp lý tưởng để đọc danh sách các số nguyên được phân tách bằng khoảng trắng hoặc danh sách các chuỗi được phân tách bằng dấu phẩy.

Dấu phân cách mặc định của Scanner lớp là khoảng trắng. Nhưng bạn có thể đặt dấu phân cách thành một ký tự khác hoặc một biểu thức chính quy. Nó cũng có nhiều phương thức tiếp theo khác nhau, chẳng hạn như next() , nextInt() , nextLine()nextByte() , để chuyển đổi nội dung thành các loại khác nhau.

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

public class FileReaderWithScanner {

    public static void main(String[] args) throws IOException{
        String file = "src/file.txt";
        Scanner scanner = new Scanner(new File(file));
        scanner.useDelimiter(" ");

        while(scanner.hasNext()){
            String next = scanner.next();
            System.out.println(next);
        }
        scanner.close();
    }
}

Trong ví dụ trên, chúng tôi đặt dấu phân cách thành khoảng trắng và sử dụng next() để đọc phần tiếp theo của nội dung được phân tách bằng khoảng trắng.

Đọc Toàn bộ Tệp

Bạn có thể sử dụng Scanner lớp để đọc toàn bộ tệp cùng một lúc mà không cần chạy vòng lặp. Bạn phải chuyển “\\Z” làm dấu phân cách cho điều này.

scanner.useDelimiter("\\Z");
System.out.println(scanner.next());
scanner.close();
Lưu ý:Lớp Máy quét không được đồng bộ hóa và do đó, không an toàn cho luồng.

Kết luận

Như bạn đã thấy trong hướng dẫn này, Java cung cấp nhiều phương pháp mà bạn có thể chọn tùy theo bản chất của nhiệm vụ trong tầm tay của bạn để đọc các tệp văn bản. Bạn có thể sử dụng BufferedReader để đọc các tệp lớn từng dòng một.

Nếu bạn muốn đọc một tệp có nội dung của nó được phân tách bằng dấu phân cách, hãy sử dụng Scanner lớp học.

Ngoài ra, bạn có thể sử dụng Java NIO Files lớp để đọc cả tệp nhỏ và lớn.