2010-09-27 38 views

Trả lời

46

đọc tập tin, phân tích mỗi dòng vào một số nguyên và lưu trữ vào một danh sách:

List<Integer> list = new ArrayList<Integer>(); 
File file = new File("file.txt"); 
BufferedReader reader = null; 

try { 
    reader = new BufferedReader(new FileReader(file)); 
    String text = null; 

    while ((text = reader.readLine()) != null) { 
     list.add(Integer.parseInt(text)); 
    } 
} catch (FileNotFoundException e) { 
    e.printStackTrace(); 
} catch (IOException e) { 
    e.printStackTrace(); 
} finally { 
    try { 
     if (reader != null) { 
      reader.close(); 
     } 
    } catch (IOException e) { 
    } 
} 

//print out the list 
System.out.println(list); 
+0

Điều này là tốt, nhưng tôi sẽ sử dụng 'Integer.valueOf (Chuỗi) 'thay vì bạn muốn một đối tượng (Integer). –

+0

Tại sao chúng ta không thể di chuyển ** reader.close(); ** sang dòng ngay sau vòng lặp while và tránh toàn bộ ** ** block cuối cùng và ** ** try-catch ** khác chặn ** cuối cùng ** chứa đựng ? –

+2

@ m-d Xem [Hướng dẫn Java] (http://docs.oracle.com/javase/tutorial/essential/exceptions/finally.html). Bạn nên đóng tài nguyên trong một 'cuối cùng' để đảm bảo rằng chúng luôn đóng ngay cả khi một ngoại lệ xảy ra trong khối' try'. Điều này ngăn ngừa rò rỉ tài nguyên. – dogbane

3
try{ 

    BufferedReader br = new BufferedReader(new FileReader("textfile.txt")); 
    String strLine; 
    //Read File Line By Line 
    while ((strLine = br.readLine()) != null) { 
     // Print the content on the console 
     System.out.println (strLine); 
    } 
    //Close the input stream 
    in.close(); 
    }catch (Exception e){//Catch exception if any 
     System.err.println("Error: " + e.getMessage()); 
    }finally{ 
    in.close(); 
    } 

này sẽ đọc từng dòng,

Nếu không có bạn. được saperated bởi newline char. sau đó ở vị trí của

System.out.println (strLine); 

Bạn có thể có

try{ 
int i = Integer.parseInt(strLine); 
}catch(NumberFormatException npe){ 
//do something 
} 

Nếu nó được tách bằng dấu cách sau đó

try{ 
    String noInStringArr[] = strLine.split(" "); 
//then you can parse it to Int as above 
    }catch(NumberFormatException npe){ 
    //do something 
    } 
+0

bạn nên đóng inputstream trong một 'khối finally'. – dogbane

+0

Vui lòng không sử dụng DataInputStream để đọc văn bản. Thật không may ví dụ như thế này được sao chép một lần nữa và một lần nữa để bạn có thể loại bỏ nó khỏi ví dụ của bạn. http://vanillajava.blogspot.co.uk/2012/08/java-memes-which-refuse-to-die.html –

+1

cập nhật, bài viết hay btw –

9

Rất nhiều s horter thay thế là dưới đây:

Path filePath = Paths.get("file.txt"); 
Scanner scanner = new Scanner(filePath); 
List<Integer> integers = new ArrayList<>(); 
while (scanner.hasNext()) { 
    if (scanner.hasNextInt()) { 
     integers.add(scanner.nextInt()); 
    } else { 
     scanner.next(); 
    } 
} 

Máy quét ngắt đầu vào của nó thành mã thông báo theo mặc định khớp với khoảng trống. Mặc dù dấu phân cách mặc định là khoảng trắng, nó đã tìm thấy thành công tất cả các số nguyên được phân tách bằng ký tự dòng mới.

3

Tin tốt trong Java 8 chúng ta có thể làm điều đó trong một dòng:

List<Integer> ints = Files.lines(Paths.get(fileName)) 
          .map(Integer::parseInt) 
          .collect(Collectors.toList()); 
1
File file = new File("file.txt"); 
Scanner scanner = new Scanner(file); 
List<Integer> integers = new ArrayList<>(); 
while (scanner.hasNext()) { 
    if (scanner.hasNextInt()) { 
     integers.add(scanner.nextInt()); 
    } 
    else { 
     scanner.next(); 
    } 
} 
System.out.println(integers); 
+0

Tôi thích câu trả lời của bạn! Cách nó chỉ in ra số nguyên và bỏ qua dấu cách, dòng mới và các ký tự không phải số nguyên khác – Hazmat

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