java實現(xiàn)倒序讀取文件功能示例分享
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<Object[]> queue = new LinkedList<Object[]>();
String temp;
int n=0;
while((temp=acc.readLine())!=null){
if(++n==1&&my_point!=0){
continue;
}
Object[] objects=new Object[2];
long point = acc.getFilePointer();
if(point>=temp_end&&end!=null){break;}
objects[0]=point;
objects[1]=new String(temp.getBytes("8859_1"),charset);
if(queue.size()==num){
queue.poll();
}
queue.offer(objects);
}
if(queue.size()<num&&my_point>0){
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;
}
}
相關文章
Java的NIO之并發(fā)環(huán)境下非阻塞IO技術詳解
這篇文章主要介紹了Java的NIO之并發(fā)環(huán)境下非阻塞IO技術詳解,Java NIO(New IO)是Java平臺提供的一種用于高效處理I/O操作的API,它引入了一組新的類和概念,以提供更好的性能和可擴展性,需要的朋友可以參考下2023-09-09springMVC自定義注解,用AOP來實現(xiàn)日志記錄的方法
下面小編就為大家分享一篇springMVC自定義注解,用AOP來實現(xiàn)日志記錄的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-01-01Java Base64算法實際應用之郵件發(fā)送實例分析
這篇文章主要介紹了Java Base64算法實際應用之郵件發(fā)送,結合實例形式分析了java字符編碼與郵件發(fā)送相關操作技巧,需要的朋友可以參考下2019-09-09Spring?Boot統(tǒng)一處理全局異常的實戰(zhàn)教程
最近在做項目時需要對異常進行全局統(tǒng)一處理,所以下面這篇文章主要給大家介紹了關于Spring?Boot統(tǒng)一處理全局異常的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下2021-12-12Java中SimpleDateFormat 格式化日期的使用
本文主要介紹了Java中SimpleDateFormat 格式化日期的使用,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-03-03