2010-12-02 17 views
9

क्लोजर में फ़ाइल को पूंछ करने का सबसे अच्छा तरीका क्या होगा? मैं ऐसी किसी भी यूटिलिटीज में नहीं आया हूं जो ऐसा करने में मदद करेगी, लेकिन एक बनाने के तरीके पर विचारों की सराहना की जाएगी!क्लोजर में एक फाइल लेना?

धन्यवाद।

उत्तर

12

kotarak कहा गया है, आप RandomAccessFile का उपयोग फ़ाइल के अंत तक तलाश करने के लिए कर सकता है। दुर्भाग्यवश आपको बदलावों के लिए व्यस्त-प्रतीक्षा/नींद आनी है।

एक आलसी अनुक्रम आप "ऑन-द-मक्खी" लाइनों संसाधित कर सकते हैं का उपयोग करना:

(import java.io.RandomAccessFile) 

(defn raf-seq 
    [#^RandomAccessFile raf] 
    (if-let [line (.readLine raf)] 
    (lazy-seq (cons line (raf-seq raf))) 
    (do (Thread/sleep 1000) 
     (recur raf)))) 

(defn tail-seq [input] 
    (let [raf (RandomAccessFile. input "r")] 
    (.seek raf (.length raf)) 
    (raf-seq raf))) 

; Read the next 10 lines 
(take 10 (tail-seq "/var/log/mail.log")) 

अद्यतन:

कुछ की तरह पूंछ -f /var/log/mail.log -n, doseq का उपयोग करके, इसलिए वास्तव में परिवर्तनों का उपभोग किया जाता है।

(doseq [line (tail-seq "/var/log/mail.log")] (println line)) 
+0

पॉइंटर के लिए धन्यवाद! किसी कारण से, यह इरादे के रूप में कार्य नहीं करता प्रतीत होता है - फ़ाइल परिवर्तनों का पता लगाना प्रतीत नहीं होता है! – viksit

+0

(प्रोग्राम पहली फ़ाइल परिवर्तन के बाद बंद हो जाता है) – viksit

+0

कृपया मेरा अपडेट जांचें: शायद फ़ाइल में लिखना "लाइन-बफर" नहीं है? –

2

कुछ की तरह:

(take-last 10 (line-seq (clojure.contrib.io/reader "file"))) 
3

आप RandomAccessFile का उपयोग फ़ाइल के अंत करने के लिए सीधे की तलाश है और वहाँ से लाइनब्रेक के लिए खोज करने के लिए कर सकते हैं। take-last दृष्टिकोण के रूप में सुरुचिपूर्ण और छोटा नहीं है, लेकिन O(n) भी नहीं है जो बड़ी फ़ाइल आकारों के लिए महत्वपूर्ण हो सकता है।

tail -f के लिए कोई समाधान नहीं है। कुछ प्रेरणा JLogTailer में पाई जा सकती है।

संबंधित मुद्दे