2010-10-04 67 views
6

Một trong các dòng trong tệp java mà tôi đang cố gắng hiểu là dưới đây.Đọc tệp bằng máy quét Java

return new Scanner(file).useDelimiter("\\Z").next(); 

Tệp được dự kiến ​​sẽ trở lại tối đa "Phần cuối của đầu vào nhưng đối với người kết thúc cuối cùng, nếu có" theo tài liệu java.util.regex.Pattern. Nhưng những gì xảy ra là nó chỉ trả lại 1024 ký tự đầu tiên từ tệp. Đây có phải là hạn chế được áp đặt bởi trình ghép mẫu regex không? Điều này có thể được khắc phục? Hiện tại tôi sẽ tiếp tục sử dụng trình xử lý phim. Nhưng tôi muốn biết lý do cho hành vi này.

+0

KHÔNG BAO GIỜ sử dụng Máy quét! Thực sự, bạn sẽ gặp rất nhiều rắc rối. –

+8

@Martijn Courteaux - chăm sóc để cung cấp ngay cả những gợi ý nhỏ nhất là tại sao Scanner là xấu? – whaley

Trả lời

2

Hãy thử gói các đối tượng file trong một FileInputStream

+0

Bạn có thể [sửa] câu trả lời của bạn để giải thích lý do tại sao điều này sẽ hữu ích và vấn đề cơ bản là gì? Khi nó đứng, điều này là ít hơn một bình luận. –

5

Bản thân tôi, tôi không thể tái tạo điều này. Nhưng tôi nghĩ tôi có thể làm sáng tỏ những gì đang xảy ra.

Nội bộ, Trình quét sử dụng bộ đệm ký tự gồm 1024 ký tự. Máy quét sẽ đọc từ các ký tự có thể đọc 1024 của bạn theo mặc định, nếu có thể, và sau đó áp dụng mẫu.

Sự cố trong mẫu của bạn ... nó sẽ luôn khớp với phần cuối của đầu vào, nhưng điều đó không có nghĩa là kết thúc luồng/dữ liệu đầu vào của bạn. Khi Java áp dụng mẫu của bạn cho dữ liệu đệm, nó cố gắng tìm sự xuất hiện đầu tiên của đầu vào. Vì 1024 ký tự nằm trong bộ đệm, công cụ kết hợp gọi vị trí 1024 là kết quả đầu tiên của dấu phân cách và mọi thứ trước khi nó được trả lại dưới dạng mã thông báo đầu tiên.

Tôi không nghĩ rằng neo kết thúc đầu vào hợp lệ để sử dụng trong Máy quét vì lý do đó. Nó có thể được đọc từ một dòng vô hạn, sau khi tất cả.

+0

Xin chào Mark, tôi nghĩ đó là lý do chính xác để máy quét không hoạt động. Tôi đang bỏ phiếu cho câu trả lời. Cách để làm cho nó hoạt động là một trong những đánh dấu đúng. Cảm ơn bạn vì câu trả lời. – Sharmila

1

Scanner được thiết kế để đọc nhiều nguyên thủy từ một tập tin. Nó thực sự không có ý định đọc toàn bộ tập tin.

Nếu bạn không muốn bao gồm thư viện của bên thứ ba, bạn nên lặp trên một BufferedReader bọc lấy một FileReader/InputStreamReader cho văn bản, hoặc lặp trên một FileInputStream cho dữ liệu nhị phân.

Nếu bạn OK sử dụng một thư viện của bên thứ ba, Apache commons-io có một lớp FileUtils có chứa các phương pháp tĩnh readFileToStringreadLines cho văn bản và readFileToByteArray cho dữ liệu nhị phân ..

0

Bạn có thể sử dụng lớp Scanner, chỉ cần chỉ định một charset khi mở máy quét, ví dụ:

Scanner sc = new Scanner(file, "ISO-8859-1"); 

Java chuyển đổi byte đọc từ tập tin vào các nhân vật bằng cách sử dụng charset quy định, đó là một mặc định (từ hệ điều hành cơ bản) nếu không có gì được đưa ra (source). Nó vẫn không rõ ràng với tôi tại sao Scanner chỉ đọc 1024 byte với một mặc định, trong khi với một số khác nó đến cuối của một tập tin. Dù sao, nó hoạt động tốt!

Các vấn đề liên quan