java快速读取日志文件最后一行数据,日志文件非常大。
发布网友
发布时间:2022-04-24 01:14
我来回答
共2个回答
热心网友
时间:2023-11-08 18:31
package cn.com.songjy.test.io;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
/**
* 从最后一行开始读取
*/
public class FromEndRF {
/**
*
* @param filename 目标文件
* @param charset 目标文件的编码格式
*/
public static void read(String filename, String charset) {
RandomAccessFile rf = null;
try {
rf = new RandomAccessFile(filename, "r");
long len = rf.length();
long start = rf.getFilePointer();
long nextend = start + len - 1;
String line;
rf.seek(nextend);
int c = -1;
while (nextend > start) {
c = rf.read();
if (c == '\n' || c == '\r') {
line = rf.readLine();
if (line != null) {
System.out.println(new String(line
.getBytes("ISO-8859-1"), charset));
} else {
System.out.println(line);
}
nextend--;
}
nextend--;
rf.seek(nextend);
if (nextend == 0) {// 当文件指针退至文件开始处,输出第一行
// System.out.println(rf.readLine());
System.out.println(new String(rf.readLine().getBytes(
"ISO-8859-1"), charset));
}
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (rf != null)
rf.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void main(String args[]) {
read("mynewfile.txt", "UTF-8");
}
}
说明:以上是一个倒着读取文件的案例,可以根据此案例,结合自己的实际需求来设计自己的代码。另外,如果是web应用或其它持续型应用,可以尝试利用单独线程保持文件打开或将读取位置存储在内存中。
热心网友
时间:2023-11-08 18:32
package zipfile;import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;public class FromEndRF {
public static void main(String args[]){
RandomAccessFile rf=null;
try {
rf=new RandomAccessFile("H:/JSP/tech/login.jsp","r");
long len=rf.length();
long start=rf.getFilePointer();
long nextend=start+len-1;
String line;
rf.seek(nextend);
int c=-1;
while(nextend>start){
c=rf.read();
if(c=='\n'||c=='\r'){
line=rf.readLine();
if(line==null){//处理文件末尾是空行这种情况
nextend--;
rf.seek(nextend);
continue;}
System.out.println(line);
nextend--;
}
nextend--;
rf.seek(nextend);
if(nextend==0){//当文件指针退至文件开始处,输出第一行
System.out.println(rf.readLine());
}
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
finally{
try {
rf.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
这是读取文件的最后一行,然后倒着往上一行一行输出,应该看的懂吧?