Tôi phải đồng ý với @gene, hãy thử với BufferedReader và getLine trước, thật đơn giản và dễ dàng để mã. Chỉ cần cẩn thận không để bí danh mảng sao lưu giữa kết quả của getLine và bất kỳ thao tác chuỗi con nào mà bạn sử dụng. String.substring() là một thủ phạm đặc biệt phổ biến, và tôi đã có các mảng byte đa MB bị khóa trong bộ nhớ vì một chuỗi con 3-char đã tham chiếu nó.
Giả sử ASCII, tùy chọn của tôi khi thực hiện việc này là giảm xuống mức byte. Sử dụng mmap để xem tệp dưới dạng ByteBuffer
và sau đó thực hiện quét tuyến tính cho 0x20 và 0x0A (giả sử dải phân cách kiểu unix). Sau đó chuyển đổi các byte có liên quan thành một String. Nếu bạn đang sử dụng một bộ ký tự 8-bit thì cực kỳ khó để nhanh hơn.
Nếu bạn đang sử dụng Unicode, vấn đề phức tạp hơn và tôi khuyên bạn nên sử dụng BufferedReader
trừ khi hiệu suất đó thực sự là không thể chấp nhận. Nếu getLine()
không hoạt động, thì hãy xem xét chỉ lặp lại cuộc gọi đến read()
.
Bất kể bạn nên luôn chỉ định Bộ ký tự khi khởi tạo chuỗi từ luồng bên ngoài. Điều này giải thích rõ ràng giả định bộ ký tự của bạn.Vì vậy, tôi khuyên bạn nên sửa đổi nhỏ đối với đề xuất của gen, do đó, một trong số:
int i = Integer.parseInt(new String(buffer, start, length, "US-ASCII"));
int i = Integer.parseInt(new String(buffer, start, length, "ISO-8859-1"));
int i = Integer.parseInt(new String(buffer, start, length, "UTF-8"));
nếu thích hợp.
Mỗi hàng có chứa cùng số ký tự không? – cheeken
không thực sự ... – Frank
Tôi bị mất. Định dạng 1 chữ số có theo sau là 1 dấu cách, v.v. với cùng số ký tự trên mỗi dòng không? – Gene