2012-02-08 39 views
7

Tôi đang phân tích cú pháp tệp .cvs. Đối với mỗi dòng của cvs, tôi tạo một đối tượng với các giá trị được phân tích cú pháp và đặt chúng vào một tập hợp.Java BufferedReader kiểm tra các dòng tiếp theo của vòng lặp trước khi lặp

Trước khi đưa đối tượng vào bản đồ và lặp lại tiếp theo, tôi cần kiểm tra xem dòng cvs tiếp theo có cùng một đối tượng với thực tế không, nhưng với giá trị thuộc tính cụ thể khác nhau.

Đối với điều đó, tôi cần kiểm tra các dòng tiếp theo của bộ đệm, nhưng giữ bộ đệm của vòng lặp ở cùng vị trí.

Ví dụ:

BufferedReader input = new BufferedReader(new InputStreamReader(new FileInputStream(file),"ISO-8859-1")); 
String line = null; 

while ((line = input.readLine()) != null) { 
    do something 

    while ((nextline = input.readLine()) != null) { //now I have to check the next lines 
     //I do something with the next lines. and then break. 
    } 
    do something else and continue the first loop. 
} 
+1

'BufferedReader()' có các phương thức 'mark()' và 'reset()' có thể hỗ trợ bạn (tôi chưa bao giờ sử dụng các phương thức này sao cho tôi không đăng những câu trả lời này). – hmjd

+0

Vấn đề thực tế là gì? –

+2

Đơn giản chỉ cần gọi input.mark() mà không truyền bất kỳ tham số nào? –

Trả lời

8
  1. Bạn có thể đánh dấu vị trí hiện tại sử dụng BufferedReader.mark(int). Để quay lại vị trí bạn gọi BufferedReader.reset(). Tham số là mark là "giới hạn đọc trước"; nếu bạn cố gắng reset() sau khi đọc nhiều hơn giới hạn, bạn có thể nhận được một IOException.

  2. Hoặc bạn có thể sử dụng thay vì RandomAccessFile:

    // Get current position 
    long pos = raf.getFilePointer(); 
    // read more lines... 
    // Return to old position 
    raf.seek(pos); 
    
  3. Hoặc bạn có thể sử dụng PushbackReader cho phép bạn unread ký tự. Nhưng có nhược điểm: PushbackReader không cung cấp phương thức readLine.

+3

Tôi có thể sử dụng phương thức input.mark() như thế nào? Ý tôi là. Tôi cần phải vượt qua một tham số (tôi đoán đó là vị trí tôi muốn đánh dấu), nhưng làm thế nào để tôi lấy nó, vì tôi đang đọc dòng? –

+0

Nó đánh dấu vị trí hiện tại. Không có cách nào để lấy lại nó, bạn chỉ có thể yêu cầu dòng suối vui lòng quay trở lại vị trí bạn đã đánh dấu trước đó. Tham số xác định khoảng cách bạn có thể đọc trước khi dấu hiệu bị vô hiệu. Nếu bạn đi xa hơn, bạn có thể không có khả năng 'đặt lại()' luồng. Nó có những hạn chế của nó và bạn phải chấp nhận chúng, hoặc sử dụng cái gì khác. – Joni

1

Cân nhắc sử dụng thứ gì đó đã được tạo như OpenCSV. Tôi nghĩ rằng bạn có thể tạo ra một cái gì đó như custom mapping strategy cho nó.

1

Bạn cũng có thể làm điều này với lồng nhau do ... while vòng, mà không đọc lại bất cứ điều gì từ luồng của bạn:

public void process(File file) throws Exception { 
    BufferedReader input = new BufferedReader(new InputStreamReader(new FileInputStream(file), "ISO-8859-1")); 
    String batchParent = input.readLine(); // read the first line in the file, this is a new batch 
    String batchChild; 
    do { 
     currentBatch = new Batch(batchParent); 
     do { 
      batchChild = input.readLine(); 
     } while (addToBatchIfKeysMatch(batchParent, batchChild)); 
     // if we break out of the inner loop, that means batchChild is a new parent 
     // assign it to batchParent and continue the outer loop 
     batchParent = batchChild; 
    } while (batchParent != null); 
} 

private boolean addToBatchIfKeysMatch(final String batchParent, final String batchChild) { 
    if (batchChild != null && keysMatch(batchParent, batchChild)) { 
     currentBatch.add(batchChild); 
     return true; 
    } else { 
     return false; 
    } 
} 

Điều quan trọng là chỉ đọc mỗi tập tin và một trong hai quá trình nó như một dòng con trong vòng lặp bên trong hoặc đặt parentLine thành giá trị mới đọc và tiếp tục vòng lặp bên ngoài.

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