Sử dụng Tập tin Văn bản
Đã giới thiệu| English | Ý nghĩa |
|---|---|
| text file/tekst faɪl/ | tệp văn bản |
Một dòng trống không phải là token hợp lệ
- Một tập tin văn bản chứa một dòng trống theo sau bởi
12. Ở thời điểm bắt đầu, cảhasNextLine()vàhasNextInt()đều đúng: việc kiểm tra token số nguyên bỏ qua khoảng trắng, bao gồm cả dòng trống, để tìm 12. - So sánh một tập tin chứa
oopstheo sau bởi12: nó có một dòng khác, nhưng token tiếp theo của nó không phải là số nguyên. Việc kiểm tra sự hiện diện của dòng không thể xác định định dạng số nguyên; hãy chọn một điều kiện bảo vệ phù hợp với phép đọc.
Với ký tự ngăn cách mặc định, một Scanner chứa một dòng trống theo sau 12 sẽ trả về true cho hasNextInt() ngay từ đầu.
Độ khó 1/5 · 100 xu + một phần thưởng nhỏ cho lần hoàn thành đầu tiên trong ngày
Kiểm tra token số nguyên bỏ qua khoảng trắng, bao gồm cả dòng trống, và tìm thấy token số nguyên 12.
Gắn bộ đọc vào nguồn gốc của nó
new Scanner(new File("scores.txt"))đọc tập tin có tên, trong khinew Scanner(System.in)đọc đầu vào từ bàn phím. Cả hai đều cung cấp các phương thức Scanner giống nhau; nguồn gốc và tính khả dụng của chúng thì khác nhau.- Mở một file bị thiếu có thể ném ra
FileNotFoundException. Ví dụ hoàn chỉnh dưới đây khai báo nó trênmain; một ứng dụng thực tế có thể thay thế bằng cách bắt (catch) nó và báo cáo lỗi hữu ích. Không lựa chọn nào trong hai lựa chọn này tạo ra dữ liệu bị mất.
Để đọc tập tin văn bản, bạn gắn Scanner vào một...
Độ khó 1/5 · 100 xu + một phần thưởng nhỏ cho lần hoàn thành đầu tiên trong ngày
new Scanner(new File("...")) đọc tập tin.
Các phương thức Scanner giống nhau (nextInt, nextLine) hoạt động cho cả input bàn phím và file.
Độ khó 1/5 · 100 xu + một phần thưởng nhỏ cho lần hoàn thành đầu tiên trong ngày
Chỉ nguồn (source) khác nhau (System.in vs File).
Đọc các dòng hoàn chỉnh
hasNextLine()kiểm tra xem có dòng tiếp theo hay không mà không tiêu thụ nó;nextLine()tiêu thụ phần còn lại của dòng đó và ký tự xuống dòng của nó. Một dòng trống có thể tạo ra chuỗi rỗng"".- Đối với các bản ghi dựa trên dòng, hãy sử dụng
while (in.hasNextLine()) { String line = in.nextLine(); ... }. Quyết định rõ ràng xem một bản ghi rỗng có ý nghĩa, có nên bị bỏ qua, hay có nên được báo cáo là không hợp lệ.
Đọc tập tin văn bản
Làm theo các bước chương trình thực hiện để đọc file dòng theo dòng.
Phương thức nào kiểm tra xem còn dòng nào để đọc nữa không?
Độ khó 1/5 · 100 xu + một phần thưởng nhỏ cho lần hoàn thành đầu tiên trong ngày
hasNextLine() bảo vệ việc đọc nextLine().
Bạn nên kiểm tra hasNextLine() trước mỗi lần gọi nextLine().
Độ khó 1/5 · 100 xu + một phần thưởng nhỏ cho lần hoàn thành đầu tiên trong ngày
Đọc vượt quá cuối file sẽ gây exception.
Đọc các token với các kiểm tra tương ứng
- Delimiter mặc định của Scanner là khoảng trắng.
hasNext()kiểm tra xem có token hay không;next()tiêu thụ token đó.hasNextInt()kiểm tra xem token tiếp theo có thể đọc thành số nguyên hay không;nextInt()tiêu thụ số nguyên đó. while (in.hasNextInt())dừng lại ởoops, ngay cả khi 12 xuất hiện sau đó. Nếu chính sách là bỏ qua các token bất hợp lệ và giữ lại các số nguyên sau đó, hãy lặp lại vớihasNext(), kiểm trahasNextInt(), và tiêu thụ một token bất hợp lệ bằngnext().
Chương trình hoàn chỉnh này cộng tổng các token số nguyên hợp lệ và báo cáo mọi token bị bỏ qua. Đối với một tập tin chứa oops theo sau bởi 12, chương trình sẽ in Skipped: oops rồi đến Total: 12. Ví dụ giả định rằng tổng nằm vừa trong một int.
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
public class ReadScores {
public static void main(String[] args) throws FileNotFoundException {
int total = 0;
try (Scanner in = new Scanner(new File("scores.txt"))) {
while (in.hasNext()) {
if (in.hasNextInt()) {
total += in.nextInt();
} else {
System.out.println("Skipped: " + in.next());
}
}
}
System.out.println("Total: " + total);
}
}
Match each read to the guard that checks that kind of input.
Độ khó 2/5 · 140 xu + một phần thưởng nhỏ cho lần hoàn thành đầu tiên trong ngày
A line-presence check is not an integer-format check.
Tiêu thụ đầu vào và giải phóng tập tin
- Mỗi nhánh trong vòng lặp token đều tiêu thụ một token. Việc liên tục kiểm tra một token không hợp lệ mà không tiêu thụ nó sẽ khiến Scanner ở lại vị trí cũ và có thể làm cho vòng lặp chạy mãi mãi.
- Khối try-with-resources đóng Scanner của tập tin này khi thoát, bao gồm cả khi thoát do ngoại lệ. Khi quản lý thủ công, hãy gọi
close()khi đã xong; các kiểm tra không thay thế việc đóng tài nguyên.
hasNextLine() theo sau bởi nextInt() không phải là một bộ lọc khớp. Một token không phải số nguyên có thể gây ra InputMismatchException, và việc đọc số nguyên thất bại đó để lại token còn sẵn sàng. Hãy chọn cách từ chối tập tin, báo cáo bản ghi, hoặc bỏ qua token một cách chủ động.
Khi kết thúc đọc file, bạn nên...
Độ khó 1/5 · 100 xu + một phần thưởng nhỏ cho lần hoàn thành đầu tiên trong ngày
in.close() giải phóng file.
Kiểm tra chính sách dữ liệu trước vòng lặp
- Đối với đầu vào
8 oops 12, một vòng lặp chỉ đọc trong khihasNextInt()tổng cộng 8 và dừng tạioops. Chính sách bỏ qua và báo cáo được hiển thị ở đây tổng cộng 20. Một token bất ngờ không nhất thiết có nghĩa là tập tin đã kết thúc. - Các chính sách này trả lời những câu hỏi khác nhau. Đối với điểm số bắt buộc của mỗi học sinh, việc bỏ qua âm thầm một token sai có thể làm lệch thứ tự bản ghi; nên ưu tiên báo cáo và từ chối bản ghi đó hơn là coi tất cả các token sau đó như những điểm số hoán đổi được cho nhau.
Chọn đọc dòng hay đọc token dựa trên định dạng tập tin. Các phép kiểm tra xem trước đầu vào mà không tiêu thụ nó; các phép đọc khớp sẽ tiêu thụ nó. Xử lý dữ liệu không hợp lệ một cách rõ ràng, tiến hành qua mọi nhánh vòng lặp, và đóng bộ đọc tập tin.
Với đầu vào 8 oops 12, chương trình skip-and-report được hiển thị sẽ in tổng là gì?
Độ khó 2/5 · 140 xu + một phần thưởng nhỏ cho lần hoàn thành đầu tiên trong ngày
Nó tiêu thụ và thêm 8, tiêu thụ và báo lỗi oops, sau đó tiêu thụ và thêm 12. Tổng là 20.