Vấn đề với những gợi ý để sử dụng scanner.nextLine()
là nó thực sự trả về dòng tiếp theo như một String
. Điều đó có nghĩa rằng bất kỳ văn bản đó là có được tiêu thụ. Nếu bạn quan tâm đến việc quét các nội dung của dòng đó ... tốt, quá xấu! Bạn sẽ phải phân tích nội dung của chính bạn đã trả lại String
.
Cách tốt hơn là nên sử dụng
while (scanner.findInLine("(?=\\S)") != null) {
// Process the line here…
…
// After processing this line, advance to the next line (unless at EOF)
if (scanner.hasNextLine()) {
scanner.nextLine();
} else {
break;
}
}
Kể từ (?=\S)
là một lookahead khẳng định zero-chiều rộng, nó sẽ không bao giờ tiêu thụ bất kỳ đầu vào. Nếu nó tìm thấy bất kỳ văn bản không khoảng trống nào trong dòng hiện tại, nó sẽ thực thi phần thân vòng lặp.
Bạn có thể bỏ qua else break;
nếu bạn chắc chắn rằng thân vòng lặp sẽ tiêu thụ tất cả văn bản không có khoảng trống trong dòng đó rồi.
Nguồn
2016-02-15 09:49:27
Điều này có tác dụng phụ của việc nhận được dòng (ví dụ: tôi cần phải chia dòng theo khoảng trắng chẳng hạn nếu tôi muốn phân tích các giá trị được phân cách bằng dấu cách). Có phương thức kiểu 'hasNextLine()' trong đó "con trỏ" không goto dòng tiếp theo không? –
Err, tôi không hiểu những gì sai với việc tách dòng ... –
@jiewmeng - khi bạn gọi 'scanner.hasNext()', bạn sẽ vẫn cần tìm dòng để kiểm tra xem nó có trống không và xử lý nó. Bạn có thể giải thích tại sao câu trả lời của Bart không hiệu quả với bạn? – luketorjussen