दिलचस्प पोस्ट
अनुमति अस्वीकृति: इसमें एंड्रॉइड पिरमिशन की आवश्यकता है। INTERACT_ACROSS_USERS_FULL स्ट्रिंग.फॉर्मैट में घुंघराले ब्रेस '{' से बचें इंटरनेट एक्सप्लोरर में टीटीएफ समर्थन की स्थिति क्या है? आयरेपोर्ट में स्टैक्ड बार चार्ट में सलाखों के लिए अलग-अलग रंग कैसे सेट करें? जावास्क्रिप्ट फ़ाइल अपलोड आकार सत्यापन JQuery छांटने वाली सूची और निश्चित / लॉक किए गए आइटम Nginx में $ मेजबान और $ http_host का अंतर क्या है सास के साथ रंगों की सूची के माध्यम से साइकिल चलाना स्क्रीन के उन्मुखीकरण-निर्भर ऊँचाई और चौड़ाई कैसे प्राप्त करें? बहु-लाइन खोज के लिए रेगेक्स (जीआरपी) की आवश्यकता मैं आईआईएस के लिए आईआईएस को एचटीएमएल 5 मोड में एन्जिलरजेएस एप्लीकेशन में लिखने के लिए कैसे कॉन्फ़िगर करूं? Django Push उपयोगकर्ताओं को HTTP प्रतिक्रिया पृष्ठ के ताज़ा करें को रोकने के लिए जब अंदर स्थित बटन पर क्लिक किया जाता है मैं कैसे जनरेट किया जा सकता हूं? उद्देश्य सी में आरएसए कार्यान्वयन

पाठ फ़ाइल की अंतिम पंक्ति को तुरंत पढ़ें?

जावा में [बहुत, बहुत बड़ी] फ़ाइल से पाठ की आखिरी पंक्ति को पढ़ने का सबसे तेज और सबसे कारगर तरीका क्या है?

वेब के समाधान से एकत्रित समाधान "पाठ फ़ाइल की अंतिम पंक्ति को तुरंत पढ़ें?"

सी # के लिए एक समान प्रश्न के उत्तर पर मेरी तरफ देखो। कोड काफी समान होगा, यद्यपि जावा में एन्कोडिंग समर्थन कुछ अलग है।

असल में यह सामान्य रूप से करने के लिए बहुत आसान बात नहीं है। के रूप में MSalter बताते हैं, यूटीएफ -8, उन पात्रों के यूटीएफ -8 के प्रतिनिधित्व के रूप में केवल \n या \n को स्थानापन्न करना आसान बनाता है, केवल एएससीआईआई के समान है, और ये बाइट बहु-बाइट वर्ण में नहीं होंगे।

इसलिए मूल रूप से, 2K का बफर लें और कहते हैं, आगे की ओर पीछे की तरफ (2K तक छोड़ें, इससे पहले, 2K तक पढ़िए, एक लाइन समाप्ति के लिए जाँच करें) फिर स्ट्रीम में बिल्कुल सही स्थान पर जाएं, शीर्ष पर एक InputStreamReader बनाएं, और उसके ऊपर एक BufferedReader बनाएं उसके बाद बस BufferedReader.readLine()

नीचे दो फ़ंक्शंस हैं, एक जो फ़ाइल की आखिरी गैर-रिक्त रेखा को पूरी फ़ाइल में लोड या स्टेप्पंग किए बिना रिटर्न करता है, और दूसरा जो फ़ाइल की अंतिम एन लाइनें देता है बिना पूरे फ़ाइल में कदम रखता है:

क्या पूंछ फ़ाइल के आखिरी चरित्र को सीधे ज़ूम करता है, फिर पिछड़े कदम, चरित्र के चरित्र, रिकॉर्डिंग को तब तक देखता है जब तक कि उसे लाइन ब्रेक न मिल जाए एक लाइन ब्रेक मिल जाने के बाद, यह लूप से टूट जाता है जो रिकॉर्ड किया गया था उसे उलट करता है और उसे एक स्ट्रिंग और रिटर्न में फेंकता है। 0xA नई लाइन है और 0xD कैरेज रिटर्न है।

यदि आपकी रेखा के अंत \r\n या crlf या कुछ अन्य "डबल न्यूलाइन स्टाइल न्यूलाइन" हैं, तो आपको अंतिम एन लाइनों को प्राप्त करने के लिए n * 2 लाइन निर्दिष्ट करना होगा क्योंकि यह हर लाइन के लिए 2 लाइनों की गणना करता है

 public String tail( File file ) { RandomAccessFile fileHandler = null; try { fileHandler = new RandomAccessFile( file, "r" ); long fileLength = fileHandler.length() - 1; StringBuilder sb = new StringBuilder(); for(long filePointer = fileLength; filePointer != -1; filePointer--){ fileHandler.seek( filePointer ); int readByte = fileHandler.readByte(); if( readByte == 0xA ) { if( filePointer == fileLength ) { continue; } break; } else if( readByte == 0xD ) { if( filePointer == fileLength - 1 ) { continue; } break; } sb.append( ( char ) readByte ); } String lastLine = sb.reverse().toString(); return lastLine; } catch( java.io.FileNotFoundException e ) { e.printStackTrace(); return null; } catch( java.io.IOException e ) { e.printStackTrace(); return null; } finally { if (fileHandler != null ) try { fileHandler.close(); } catch (IOException e) { /* ignore */ } } } 

लेकिन आप संभवतः पिछली रेखा नहीं चाहते हैं, आप पिछली एन लाइनें चाहते हैं, इसलिए इसके बजाय इसका उपयोग करें:

 public String tail2( File file, int lines) { java.io.RandomAccessFile fileHandler = null; try { fileHandler = new java.io.RandomAccessFile( file, "r" ); long fileLength = fileHandler.length() - 1; StringBuilder sb = new StringBuilder(); int line = 0; for(long filePointer = fileLength; filePointer != -1; filePointer--){ fileHandler.seek( filePointer ); int readByte = fileHandler.readByte(); if( readByte == 0xA ) { if (filePointer < fileLength) { line = line + 1; } } else if( readByte == 0xD ) { if (filePointer < fileLength-1) { line = line + 1; } } if (line >= lines) { break; } sb.append( ( char ) readByte ); } String lastLine = sb.reverse().toString(); return lastLine; } catch( java.io.FileNotFoundException e ) { e.printStackTrace(); return null; } catch( java.io.IOException e ) { e.printStackTrace(); return null; } finally { if (fileHandler != null ) try { fileHandler.close(); } catch (IOException e) { } } } 

इस तरह की उपरोक्त विधियों को आमंत्रित करें:

 File file = new File("D:\\stuff\\huge.log"); System.out.println(tail(file)); System.out.println(tail2(file, 10)); 

चेतावनी यूनिस्कोड के जंगली पश्चिम में यह कोड गलत होने के लिए इस फ़ंक्शन का उत्पादन कर सकता है। उदाहरण के लिए "मैरी" के बजाय "मैरी" टोपी, लहजे, चीनी अक्षरों आदि के साथ अक्षर गलत होने का कारण हो सकता है क्योंकि अक्षर के बाद एक्सेन्ट संशोधक के रूप में जोड़े जाते हैं। यौगिक वर्णों को प्रतिवर्ती प्रतिवर्ती पर चरित्र की पहचान की प्रकृति में परिवर्तन होता है। आप उन सभी भाषाओं पर परीक्षणों की पूरी बैटरी करनी होगी, जिनके साथ आप इसे उपयोग करने की योजना बनाते हैं।

इस यूनिकोड रिवर्सल समस्या के बारे में अधिक जानकारी के लिए इसे पढ़ें: http://msmvps.com/blogs/jon_skeet/archive/2009/11/02/omg-ponies-aka-humanity-epic-fail.aspx

अपैका कॉमन्स में रैंडम एक्सेसफ़ाइल का उपयोग कर एक कार्यान्वयन है।

इसे रिवर्सल लाइंसफ़ाइल रीडर कहा जाता है।

FileReader या FileInputStream का उपयोग नहीं करेगा – आपको फाइलचैनल या रैंडम एक्सेस फाईल को लूप से अंत से पीछे की फाइल के माध्यम से उपयोग करना होगा एन्कोडिंग एक समस्या होगी, जैसा कि जॉन ने कहा।

सी # में , आपको स्ट्रीम की स्थिति निर्धारित करने में सक्षम होना चाहिए:

से: http://bytes.com/groups/net-c/269090-streamreader-read-last-line-text-file

 using(FileStream fs = File.OpenRead("c:\\file.dat")) { using(StreamReader sr = new StreamReader(fs)) { sr.BaseStream.Position = fs.Length - 4; if(sr.ReadToEnd() == "DONE") // match } } 

आप पिछली लाइन को प्रिंट करने के लिए नीचे दिए गए कोड को आसानी से बदल सकते हैं।

पिछले 5 लाइनों के मुद्रण के लिए मेमोरीमेपफ़ाइल:

 private static void printByMemoryMappedFile(File file) throws FileNotFoundException, IOException{ FileInputStream fileInputStream=new FileInputStream(file); FileChannel channel=fileInputStream.getChannel(); ByteBuffer buffer=channel.map(FileChannel.MapMode.READ_ONLY, 0, channel.size()); buffer.position((int)channel.size()); int count=0; StringBuilder builder=new StringBuilder(); for(long i=channel.size()-1;i>=0;i--){ char c=(char)buffer.get((int)i); builder.append(c); if(c=='\n'){ if(count==5)break; count++; builder.reverse(); System.out.println(builder.toString()); builder=null; builder=new StringBuilder(); } } channel.close(); } 

पिछले 5 लाइनों को प्रिंट करने के लिए RandomAccessFile:

 private static void printByRandomAcessFile(File file) throws FileNotFoundException, IOException{ RandomAccessFile randomAccessFile = new RandomAccessFile(file, "r"); int lines = 0; StringBuilder builder = new StringBuilder(); long length = file.length(); length--; randomAccessFile.seek(length); for(long seek = length; seek >= 0; --seek){ randomAccessFile.seek(seek); char c = (char)randomAccessFile.read(); builder.append(c); if(c == '\n'){ builder = builder.reverse(); System.out.println(builder.toString()); lines++; builder = null; builder = new StringBuilder(); if (lines == 5){ break; } } } } 

यह एक तरीका है जिसने मैंने इसे किया 🙂 आशा है कि मदद करता है

  try( BufferedReader reader = new BufferedReader(new FileReader(reqFile))){ String line = null; System.out.println("======================================"); line = reader.readLine(); //Read Line ONE line = reader.readLine(); //Read Line TWO System.out.println("first line : " + line); //Length of one line if lines are of even length int len = line.length(); //skip to the end - 3 lines reader.skip((reqFile.length() - (len*3))); //Searched to the last line for the date I was looking for. while((line = reader.readLine()) != null){ System.out.println("FROM LINE : " + line); String date = line.substring(0,line.indexOf(",")); System.out.println("DATE : " + date); //BAM!!!!!!!!!!!!!! } System.out.println(reqFile.getName() + " Read(" + reqFile.length()/(1000) + "KB)"); System.out.println("======================================"); } catch (IOException x){ x.printStackTrace(); }