2009-06-27 29 views
11

Trong java tôi sẽ đọc toàn bộ tệp trong mảng byte và thực hiện một số thao tác với nó. Bây giờ tôi muốn thực hiện cùng một thuật toán trong clojure.Clojure biểu diễn mảng byte

Điều tôi đang tự hỏi là tôi có thể sử dụng danh sách thay vì mảng không?

Tôi biết tôi có thể tạo mảng từ clojure nhưng cách xử lý này là gì?

Trả lời

11

Nếu tệp được đề cập là rất lớn, bạn nên luôn xem xét sử dụng tệp ánh xạ bộ nhớ. clojure.contrib.mmap cung cấp một số chức năng để giải quyết vấn đề đó.

Tôi biết tôi có thể tạo mảng từ clojure nhưng cách xử lý này là gì?

Tôi không biết về cách Lisp, nhưng cách Clojure cho phép bạn sử dụng các hàm chuỗi trên mảng, vì vậy bạn không phải quyết định giữa biểu diễn hiệu quả và xử lý thoải mái (theo ý kiến ​​của tôi là một trong những điểm khiến Clojure trở nên thực dụng).

+0

Tệp tôi định đọc là nhỏ. Tối đa 200-300 Kb –

+0

Sau đó, chỉ cần tạo mảng như bạn làm trong Java và sử dụng các hàm của Clojure chấp nhận một hàm seqable, mà làm việc với mảng một cách kỳ diệu. Đối với bất kỳ tư vấn thêm, bạn có thể đề cập đến những gì chính xác bạn cần phải làm gì với nội dung. Vì bạn đang sử dụng một mảng byte, tôi giả sử bạn cần phải làm công cụ nhị phân, trong trường hợp đó bạn có thể muốn đọc bài viết sau, minh họa một số mẫu tốt đẹp để sử dụng: http://gnuvince.wordpress.com/ 2009/01/29/đọc-nhị phân-dữ liệu-trong-clojure / – pmf

3

đây là trình tự lười biếng của các byte trong tệp và đóng xử lý tệp khi byte cuối cùng đã được đọc. Nếu bạn làm việc với các trình tự được cung cấp bởi các tệp lớn, hãy cẩn thận không giữ đầu của chuỗi ở bất cứ đâu hoặc bạn sẽ hết bộ nhớ. Bạn có thể giữ tập tin xử lý trong trường hợp bạn cần phải đóng thủ công trong tình trạng lỗi.

 
(defn byte-seq [rdr] 
    (let [result (. rdr read)] 
    (if (= result -1) 
     (do (. rdr close) nil) 
     (lazy-seq (cons result (byte-seq rdr))))))