2012-12-14 36 views
7

Vì vậy, tôi chỉ chạy vào một vấn đề thú vị trong khi sử dụng lớp Scanner để đọc nội dung từ các tập tin. Về cơ bản, tôi đang cố gắng để đọc một số tập tin đầu ra được tạo ra bởi một ứng dụng phân tích cú pháp từ một thư mục để tính toán một số số liệu chính xác.Hành vi lạ với máy quét java đọc tập tin

Về cơ bản, mã của tôi chỉ duyệt qua từng tệp trong thư mục và mở chúng bằng máy quét để xử lý nội dung. Vì lý do gì đó, một vài tệp (tất cả mã hóa UTF-8) không được đọc bởi Máy quét. Mặc dù các tệp không trống, scanner.hasNextLine() sẽ trả về false khi cuộc gọi đầu tiên của nó (tôi đã mở trình gỡ rối và quan sát điều này). Tôi đã khởi tạo máy quét trực tiếp với các đối tượng File mỗi lần (các đối tượng tập tin đã được tạo thành công). ví dụ:

File file = new File(pathName); 
    ... 
    Scanner scanner = new Scanner(file); 

Tôi đã thử một vài điều, và cuối cùng đã có thể khắc phục vấn đề này bằng cách khởi tạo các máy quét theo cách sau:

Scanner scanner = new Scanner(new FileInputStream(file)); 

Mặc dù tôi rất vui khi đã giải quyết vấn đề , Tôi vẫn tò mò về những gì có thể đã xảy ra để gây ra vấn đề trước đây. Bất kỳ ý tưởng? Cám ơn rất nhiều!

+0

Tôi đã hack một số thứ lại với nhau và gặp sự cố chính xác của bạn. FileInputStream để giải cứu! – masher

Trả lời

3

Theo nguồn tin Scanner.java trong Java 6u23 một dòng mới được phát hiện bởi

private static final String LINE_SEPARATOR_PATTERN = 
             "\r\n|[\n\r???]"; 
private static final String LINE_PATTERN = ".*("+LINE_SEPARATOR_PATTERN+")|.+$"; 

Vì vậy, bạn có thể kiểm tra xem bạn có thể phù hợp với regex sau vào nội dung trong các tập tin mà không được đọc.

.*(\r\n|[\n\r???])|.+$ 

Ngoài ra tôi sẽ kiểm tra xem có ngoại lệ nào đó không.

CẬP NHẬT: Điều này khiến tôi tò mò và tôi đã tìm câu trả lời. Có vẻ như câu hỏi của bạn đã được hỏi và giải quyết đã có tại đây: Java Scanner(File) misbehaving, but Scanner(FIleInputStream) always works with the same file

Để tóm tắt về các ký tự nằm ngoài ASCII, hoạt động khác nhau tùy thuộc vào việc bạn khởi chạy Máy quét bằng Tệp hoặc FileInputStream.

+0

Không có ngoại lệ nào được nêu ra, tôi đã bao quanh mã trong khối try try. Tôi đã xem qua các tệp đã gây ra sự cố - mỗi tệp được tạo bởi ứng dụng và ở định dạng có thể đọc được ở máy tiêu chuẩn. Có 100 tệp trong thư mục và 5 tệp trong số đó đã gây ra sự cố này. Bởi vì ứng dụng tạo các tệp thực sự xây dựng chúng theo cách tiêu chuẩn, tôi hy vọng rằng các dấu tách dòng đang hoạt động. Tôi sẽ tiếp tục và đảm bảo rằng regexp có trong các tệp này. – shaunvxc

+0

Tuy nhiên, phần lạ là khi tôi khởi tạo máy quét bằng FileInputStream thay vì chỉ tập tin, tất cả đều hoạt động tốt - Nó đọc nội dung hoàn hảo mà không gặp vấn đề gì. – shaunvxc

+0

Chỉ tìm thấy câu trả lời, xem cập nhật của tôi. – Will

0

Tôi sẽ cố gắng kiểm tra xem bạn có luôn đóng máy quét sau khi đọc tệp hay không. Bạn cũng chỉ gọi hasNextLine() và nextLine(), hay bạn gọi phương thức nextXX() khác trên các máy quét đó?

+0

Xin lỗi tôi nên đưa vào câu hỏi của tôi- Có, tôi đã đóng máy quét sau mỗi tệp và tôi chỉ đang gọi hasNextLine() và nextLine(). Đối với các tệp cụ thể gây ra sự cố, lệnh gọi hàm hasNextLine() đầu tiên trả về false. – shaunvxc

+0

Bạn có cố gắng gỡ lỗi Trình quét khi đọc từ những tệp "lạ" đó không? – Behnil

+0

yes Tôi đã làm, khi tôi nhìn vào đối tượng Scanner, bộ đệm của nó đã hoàn toàn trống rỗng. – shaunvxc