2011-09-06 24 views

Trả lời

17

Đây là một cách:

Scanner keyboard = new Scanner(System.in); 
String line = null; 
while(!(line = keyboard.nextLine()).isEmpty()) { 
    String[] values = line.split("\\s+"); 
    System.out.print("entered: " + Arrays.toString(values) + "\n"); 
} 
System.out.print("Bye!"); 
+2

Đ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? –

+0

Err, tôi không hiểu những gì sai với việc tách dòng ... –

+1

@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

4

Từ http://www.java-made-easy.com/java-scanner-help.html:

Q: Điều gì gì xảy ra nếu tôi quét một dòng trống bằng Máy quét của Java?

A: Nó phụ thuộc. Nếu bạn đang sử dụng nextLine(), một dòng trống sẽ được đọc dưới dạng một Chuỗi trống. Điều này có nghĩa là nếu bạn lưu trữ dòng trống trong biến Chuỗi, biến sẽ giữ "". Nó sẽ KHÔNG lưu trữ "" hoặc tuy nhiên nhiều không gian đã được đặt. Nếu bạn đang sử dụng next(), thì nó sẽ không đọc tất cả các dòng trống. Họ hoàn toàn bị bỏ qua.

Tôi đoán rằng nextLine() sẽ vẫn kích hoạt trên một dòng trống, vì về mặt kỹ thuật, Máy quét sẽ có Chuỗi trống "". Vì vậy, bạn có thể kiểm tra if s.nextLine().equals("")

0

AlexFZ đúng, scanner.hasNext() sẽ luôn đúng và vòng lặp không kết thúc, vì luôn có đầu vào chuỗi mặc dù nó trống "".

Tôi đã có một vấn đề tương tự và tôi giải quyết nó như thế này:

do{ 
    // process input
}while(line.length()!=0);
Tôi nghĩ do-while sẽ phù hợp ở đây tốt hơn becasue bạn phải đánh giá đầu vào sau khi người dùng đã bước vào nó.

0
Scanner key = new Scanner(new File("data.txt")); 
String data = ""; 

while(key.hasNextLine()){ 
    String nextLine = key.nextLine(); 

    data += nextLine.equals("") ? "\n" :nextLine; 

} 
System.out.println(data); 
3

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.

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