2010-05-03 10 views
6

कुछ लॉग फ़ाइलों को पूंछ/पार्स करने की कोशिश कर रहा है। प्रविष्टियां एक तिथि से शुरू होती हैं और फिर कई लाइनों का विस्तार कर सकती हैं।जावा स्कैनर फ़ाइल का पालन नहीं करेगा

यह काम करता है, लेकिन फ़ाइल में नई प्रविष्टियां कभी नहीं देखती हैं।

File inputFile = new File("C:/test.txt"); 
InputStream is = new FileInputStream(inputFile); 
InputStream bis = new BufferedInputStream(is); 
//bis.skip(inputFile.length()); 
Scanner src = new Scanner(bis); 
src.useDelimiter("\n2010-05-01 "); 

while (true) { 
    while(src.hasNext()){ 
    System.out.println("[ " + src.next() + " ]"); 
    } 
} 

स्कैनर की अगली() या hasNext की तरह लग नहीं करता है() फाइल करने के लिए नई प्रविष्टियां पता लगाता है।

कोई विचार मैं और कैसे लागू कर सकता हूं, मूल रूप से, कस्टम डेलीमीटर के साथ एक पूंछ-एफ।


ठीक - केली की सलाह का उपयोग कर मैं & जाँच कर रहा हूँ स्कैनर ताज़ा, यह काम करता है। धन्यवाद !!

यदि किसी के पास सुधार सुझाव हैं तो कृपया करें!

File inputFile = new File("C:/test.txt"); 
InputStream is = new FileInputStream(inputFile); 
InputStream bis = new BufferedInputStream(is); 
//bis.skip(inputFile.length()); 
Scanner src = new Scanner(bis); 
src.useDelimiter("\n2010-05-01 "); 

while (true) { 
    while(src.hasNext()){ 
    System.out.println("[ " + src.next() + " ]"); 
    } 

    Thread.sleep(50); 
    if(bis.available() > 0){ 
    src = new Scanner(bis); 
    src.useDelimiter("\n2010-05-01 "); 
    } 
} 
+0

अब यह क्या करता है, क्या यह एक अपवाद फेंकता है या नए डेटा का पता लगाए बिना अनंत लूप में लटकता है? नए डेटा का पता लगाने के बिना –

+0

अनंत लूप। इसे तरीकों का एक गुच्छा करने की कोशिश की, परीक्षण है अगला() 1, buffered/unbuffered .. –

उत्तर

1

मुझे लगता है कि होता है कि स्कैनर bis जो बफ़र है पार्स करने है, लेकिन बफर कभी नहीं ताजा हो रही है। स्ट्रीम से बाइट पढ़ने के लिए आप BufferedInputStream या स्कैनर पर भरोसा कर सकते हैं लेकिन मुझे लगता है कि आपको इसे स्वयं करना है।

Javadocs से:

एक BufferedInputStream धारा-अर्थात्, क्षमता बफ़र होना इनपुट और निशान और रीसेट तरीकों का समर्थन करने के लिए एक और इनपुट करने के लिए कार्यक्षमता जोड़ता। जब BufferedInputStream बनाया गया है, तो आंतरिक बफर सरणी बनाई गई है। स्ट्रीम से बाइट्स पढ़े गए हैं या छोड़े गए हैं, आंतरिक बफर से आवश्यक इनपुट स्ट्रीम के रूप में आवश्यक है, पर एक बार कई बाइट्स। मार्क आपरेशन इनपुट धारा में एक बिंदु याद रखता है और रीसेट ऑपरेशन से पहले नई बाइट्स निहित इनपुट धारा से लिया जाता है सभी बाइट्स के बाद से सबसे हाल ही में मार्क आपरेशन पढ़ा पुन: पढ़ने जा करने के लिए कारण बनता है।

+0

सहमत हुए। अद्यतन के साथ संशोधित पोस्ट। धन्यवाद! –

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