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(); } } }