2008-11-04 16 views
24

Tôi hiện có 2 BufferedReader giây được khởi tạo trên cùng một tệp văn bản. Khi tôi đọc xong tệp văn bản với BufferedReader đầu tiên, tôi sử dụng tệp thứ hai để thực hiện một tệp khác qua tệp từ trên cùng. Nhiều lượt đi qua cùng một tệp là cần thiết.Java BufferedReader quay lại đầu tệp văn bản?

Tôi biết về reset(), nhưng nó cần phải được gọi là mark()mark() cần biết kích thước của tệp, điều mà tôi không nghĩ là tôi phải bận tâm.

Ý tưởng? Gói? Libs? Mã?

Cảm ơn TJ

Trả lời

24

nhược điểm của chỉ tạo ra một mới BufferedReader để đọc từ đầu là gì? Tôi hy vọng hệ điều hành sẽ lưu trữ tệp nếu nó đủ nhỏ.

Nếu bạn lo ngại về hiệu suất, bạn có chứng tỏ đó là một nút cổ chai không? Tôi chỉ làm điều đơn giản nhất và không lo lắng về nó cho đến khi bạn có một lý do cụ thể. Ý tôi là, bạn chỉ có thể đọc toàn bộ nội dung vào bộ nhớ và sau đó thực hiện hai bước trên kết quả, nhưng một lần nữa sẽ phức tạp hơn là chỉ đọc từ đầu một lần nữa với một người đọc mới.

27

Trình đọc được đọc có nghĩa là đọc một tệp tuần tự. Những gì bạn đang tìm kiếm là java.io.RandomAccessFile, và sau đó bạn có thể sử dụng seek() để đưa bạn đến nơi bạn muốn trong tệp.

Người đọc truy cập ngẫu nhiên được thực hiện như sau:

try{ 
    String fileName = "c:/myraffile.txt"; 
    File file = new File(fileName); 
    RandomAccessFile raf = new RandomAccessFile(file, "rw"); 
    raf.readChar(); 
    raf.seek(0); 
} catch (FileNotFoundException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} catch (IOException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} 

Các "rw" là một nhân vật chế độ đó là detailed here.

Lý do trình đọc truy cập tuần tự được thiết lập như thế này là để chúng có thể triển khai bộ đệm của chúng và mọi thứ không thể thay đổi dưới chân chúng. Ví dụ, trình đọc tệp được cung cấp cho trình đọc được đệm chỉ nên được người đọc đệm đó hoạt động. Nếu có một vị trí khác có thể ảnh hưởng đến nó, bạn có thể có hoạt động không nhất quán khi một người đọc nâng cao vị trí của nó trong trình đọc tệp trong khi người kia muốn nó vẫn như cũ bây giờ bạn sử dụng người đọc khác và nó ở một vị trí chưa được xác định.

3

Cách tốt nhất để tiến hành là thay đổi thuật toán của bạn, theo cách mà bạn KHÔNG cần thẻ thứ hai. Tôi đã sử dụng phương pháp này một vài lần, khi tôi phải xử lý các tệp khổng lồ (nhưng không khủng khiếp, tức là vài GB) không vừa với bộ nhớ có sẵn.

Nó có thể là khó khăn, nhưng đạt được hiệu suất thường worths nỗ lực

+0

Bạn có thể giải thích không? Tôi có một tệp lớn 30MB, tôi không thể tải tất cả vào bộ nhớ. Tôi đã sắp xếp dữ liệu, và bây giờ muốn thực hiện tìm kiếm nhị phân trực tiếp trên tệp. Đối với điều này tôi cần phải tìm kiếm ngẫu nhiên. –

+0

Ngày nay tôi giả định bạn có nghĩa là 30GB, trừ khi bạn đang sử dụng hw thực sự nhỏ (nhưng sau đó nó sẽ không có đĩa) Dù sao, tìm kiếm ngẫu nhiên trên đĩa thường hoàn toàn hủy hoại hiệu suất logarit của tìm kiếm nhị phân. Một vài lựa chọn thay thế là 1) thực hiện truy cập tuần tự (có, trên đĩa tìm kiếm tuần tự có thể nhanh hơn tìm kiếm nhị phân) hoặc 2) cách tiếp cận hỗn hợp như sử dụng B-tree http://en.wikipedia.org/wiki/ B-tree Nếu những gợi ý này không đủ, bạn có thể muốn đặt câu hỏi của mình dưới dạng một câu hỏi riêng biệt thay vì nhận xét (vui lòng đăng nhận xét ở đây có liên kết tới câu hỏi để ping tôi) – Davide

-1

"Toàn bộ kinh doanh về dấu() và reset() trong BufferedReader smacks của thiết kế nghèo."

lý do tại sao bạn không mở rộng lớp này và đặt nó làm dấu() trong hàm tạo() và sau đó thực hiện tìm kiếm (0) trong phương thức topOfFile().

BR,
~ Một

1

Về dấu/reset:

Phương pháp đánh dấu trong BufferedReader mất một tham số readAheadLimit làm hạn chế thế nào đến nay bạn có thể đọc sau dấu trước khi thiết lập lại trở nên bất khả thi.Việc đặt lại không thực sự có nghĩa là hệ thống tệp tìm kiếm (0), nó chỉ tìm kiếm bên trong bộ đệm. Để báo giá cho Javadoc:

đọcTiêu đề đầu tiên - Giới hạn số ký tự có thể đọc trong khi vẫn giữ dấu. Sau khi đọc nhiều ký tự này, việc cố gắng đặt lại luồng có thể không thành công. Giá trị giới hạn lớn hơn kích thước của bộ đệm đầu vào sẽ làm cho bộ đệm mới được cấp phát có kích thước không nhỏ hơn giới hạn. Do đó các giá trị lớn nên được sử dụng cẩn thận.