Implement your own tail (Read last n lines of a huge file) - GeeksforGeeks
Given a huge file having dynamic data, write a program to read last n lines from the file at any point without reading the entire file. The problem is similar to tail command in linux which displays the last few lines of a file. It is mostly used for viewing log file updates as these updates are appended to the log files.
http://netjs.blogspot.in/2016/02/how-to-read-file-from-last-line-in-java.html
Read full article from Implement your own tail (Read last n lines of a huge file) - GeeksforGeeks
Given a huge file having dynamic data, write a program to read last n lines from the file at any point without reading the entire file. The problem is similar to tail command in linux which displays the last few lines of a file. It is mostly used for viewing log file updates as these updates are appended to the log files.
The problem mainly focuses on below things –
1. The program should not read entire file.
2. The program should handle incoming dynamic data and returns last n lines at any point.
3. The program should not close input stream before reading last n lines.
2. The program should handle incoming dynamic data and returns last n lines at any point.
3. The program should not close input stream before reading last n lines.
void tail(FILE* in, int n){ int count = 0; // To count '\n' characters // unsigned long long pos (stores upto 2^64 – 1 // chars) assuming that long long int takes 8 // bytes unsigned long long pos; char str[2*SIZE]; // Go to End of file if (fseek(in, 0, SEEK_END)) perror("fseek() failed"); else { // pos will contain no. of chars in // input file. pos = ftell(in); // search for '\n' characters while (pos) { // Move 'pos' away from end of file. if (!fseek(in, --pos, SEEK_SET)) { if (fgetc(in) == '\n') // stop reading when n newlines // is found if (count++ == n) break; } else perror("fseek() failed"); } // print last n lines printf("Printing last %d lines -\n", n); while (fgets(str, sizeof(str), in)) printf("%s", str); } printf("\n\n");}public void readFromLast(File file, int lines){ int readLines = 0; StringBuilder builder = new StringBuilder(); RandomAccessFile randomAccessFile = null; try { randomAccessFile = new RandomAccessFile(file, "r"); long fileLength = file.length() - 1; // Set the pointer at the last of the file randomAccessFile.seek(fileLength); for(long pointer = fileLength; pointer >= 0; pointer--){ randomAccessFile.seek(pointer); char c; // read from the last one char at the time c = (char)randomAccessFile.read(); // break when end of the line if(c == '\n'){ readLines++; if(readLines == lines) break; } builder.append(c); } // Since line is read from the last so it // is in reverse so use reverse method to make it right builder.reverse(); System.out.println("Line - " + builder.toString()); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ if(randomAccessFile != null){ try { randomAccessFile.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }
Using Apache Commons IO
public void reverseLines(File file){ ReversedLinesFileReader object = null; try { object = new ReversedLinesFileReader(file); System.out.println("Line - " + object.readLine()); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ try { object.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }