Long end,long num,File file,String charset
4个参数说明
end 相当于坐标 ,tail 向上的起点,num是读取的行数,file 目标文件 charset字符集 默认UTF8
end 为 null 代表从 文件 最末端 向上 获取。
Map m=FileUtil.tail(null,10,file,null)//读取文件最后10行,结果在 m.get(FileUtil.ARR) 里
FileUtil.tail(m.get(FileUtil.POINT),3,file,null)//读取文件倒数 11行到13行,其实就是接着上边的第10行再向上读3行
复制代码 代码如下:
public class FileUtil {
private static final long step=5000;
public static final String ARR="arr";
public static final String POINT="point";
public static Map tail(Long end,long num,File file,String charset)throws Exception{
if(num<=0||(end!=null&&end<0)){
throw new IllegalArgumentException();
}
Map map=new HashMap();
RandomAccessFile acc=null;
try {
acc = new RandomAccessFile(file, "r");
long temp_end = (end == null ? acc.length() : end);
long my_point = temp_end > step ? (temp_end-step) : 0;
acc.seek(my_point);
linkedList
if(queue.size()
long last_num=num-queue.size();
Object[] header = queue.peek();
if(header==null){throw new RuntimeException("FileUtil step:"+step+" not enough long");}
Map m = tail((Long)header[0], last_num, file,charset);
map.put(POINT,m.get(POINT));
map.put(ARR,ArrayUtils.addAll((Object[])m.get(ARR),queue.toArray()));
}else if(queue.size()>0){//获取的行数不够,并且没有到达TOP
map.put(POINT,queue.peek()[0]);
map.put(ARR,queue.toArray());
}
}finally {
if(acc!=null){
try {
acc.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return map;
}
}



