最近在开发实战中,遇到了一个这样的技术情景:

把log4j生成的日志文件定时刷进MySQL数据库,比如三个小时刷一次,那么每次刷数据的时候,如何控制文件读取是从上一次文件读取结束的地方开始继续读取的?并且本次要读取到文件结尾处。在网上各种搜索提问后,找到了一个叫RandomAccessFile Java类解决了问题。

static int size=1;//主要是为了控制循环的次数,因为是定时刷,每次刷的文件行数可能不一样
static long chars=0;//chars指的是字符数
/**
* 读取文件内容
* @param fileName
*/
public Map readANDwrite(String fileName) { //大集合,以sessionid为键,以一次session的所有访问记录list为值进行存储
Map<String,Map> bigMap = new HashMap(); //一次session的访问记录集合
File file = new File(fileName); //java提供的一个可以分页读取文件的类,此类的实例支持对随机访问文件的读取和写入
RandomAccessFile rf = null; String tempString = null;
try { //初始化RandomAccessFile,参数一个为文件路径,一个为权限设置,这点与Linux类似,r为读,w为写
rf = new RandomAccessFile(fileName, "rw"); //设置到此文件开头测量到的文件指针偏移量,在该位置发生下一个读取或写入操作
rf.seek(chars); //获取文件的行数
int fileSize = getTotalLines(file);
for (int i = size-1; i < fileSize; i++) {//从上一次读取结束时的文件行数到本次读取文件时的总行数中间的这个差数就是循环次数 //一行一行读取
tempString = rf.readLine();
//文件中文乱码处理
tempString = tempString.replaceAll("%(?![0-9a-fA-F]{2})", "%25");
tempString = tempString.replaceAll("\\+", "%2B");
tempString = java.net.URLDecoder.decode(tempString, "GB2312"); //将字符串JSON转换为实体JSON,以便能通过key取value
JSONObject json = JSONObject.fromObject(tempString);
String refPage = json.get("refPage").toString();
System.out.println(refPage);
Map tmap = new HashMap(); if (bigMap.containsKey(refPage))
tmap = (Map) bigMap.get(refPage);
else {
tmap = new HashMap();
}
// 计数
String tCount = "count";
int pvCount = 1;
if (tmap.containsKey(tCount)) {
pvCount = (Integer) tmap.get(tCount);
}
pvCount++;
tmap.put(tCount, pvCount);
bigMap.put(refPage, tmap);
}
//返回此文件中的当前偏移量。
chars = rf.getFilePointer();
size=fileSize;
} catch (IOException e) {
e.printStackTrace();
}catch(JSONException j){ } finally {
if (rf != null) {
try {
rf.close();
} catch (IOException e1) {
}
}
}
return bigMap;
}
//获取文件的行数
static int getTotalLines(File file) throws IOException {
FileReader in = new FileReader(file);
LineNumberReader reader = new LineNumberReader(in);
String s = reader.readLine();
int lines = 0;
while (s != null) {
lines++;
s = reader.readLine();
}
reader.close();
in.close();
return lines;
}
 

Java如何实现按指定行读取文件的更多相关文章

  1. Java利用内存映射文件实现按行读取文件

    我们知道内存映射文件读取是各种读取方式中速度最快的,但是内存映射文件读取的API里没有提供按行读取的方法,需要自己实现.下面就是我利用内存映射文件实现按行读取文件的方法,如有错误之处请指出,或者有更好 ...

  2. Java使用FileReader(file)、readLine()读取文件,以行为单位,一次读一行,一直读到null时结束,每读一行都显示行号。

    //Java使用FileReader(file).readLine()读取文件,以行为单位,一次读一行,一直读到null时结束,每读一行都显示行号. public static void readFi ...

  3. C++/Php/Python/Shell 程序按行读取文件或者控制台

    写程序经常需要用到从文件或者标准输入中按行读取信息,这里汇总一下.方便使用 1. C++ 读取文件 #include<stdio.h> #include<string.h> i ...

  4. C++/Php/Python/Shell 程序按行读取文件或者控制台方法总结。

    C++/Php/Python/Shell 程序按行读取文件或者控制台方法总结. 一.总结 C++/Php/Python/Shell 程序按行读取文件或者控制台(php读取标准输入:$fp = fope ...

  5. Python跳过第一行读取文件内容

    Python编程时,经常需要跳过第一行读取文件内容.比较容易想到是为每行设置一个line_num,然后判断line_num是否为1,如果不等于1,则进行读取操作.相应的Python代码如下: inpu ...

  6. python_基础学习_01_按行读取文件的最优方法

    python 按行读取文件 ,网上搜集有N种方法,效率有区别,先mark最优答案,下次补充测试数据 with open('filename') as file: for line in file: d ...

  7. python 按每行读取文件怎么去掉换行符

    python按每行读取文件后,会在每行末尾带上换行符,这样非常不方便后续业务处理逻辑,需要去掉每行的换行符,怎么去掉呢?看下面的案例: >>> a = "hello wor ...

  8. Shell按行读取文件的3种方法

    Shell按行读取文件的方法有很多,常见的三种方法如下: 要读取的文件: [root@mini05 -]# cat file.info 写法一: [root@mini05 -]# cat read1. ...

  9. Python按行读取文件、写文件

    Python按行读取文件 学习了:https://www.cnblogs.com/scse11061160/p/5605190.html file = open("sample.txt&qu ...

随机推荐

  1. 弗雷塞斯 从生物学到生物信息学到机器学习 转录组入门(3):了解fastq测序数据

    sra文件转换为fastq格式 1 fastq-dump -h --split-3 也就是说如果SRA文件中只有一个文件,那么这个参数就会被忽略.如果原文件中有两个文件,那么它就会把成对的文件按*_1 ...

  2. 26_java之进程|线程|线程池

    01进程概念 *A:进程概念 *a:进程:进程指正在运行的程序.确切的来说,当一个程序进入内存运行, 即变成一个进程,进程是处于运行过程中的程序,并且具有一定独立功能. 02线程的概念 *A:线程的概 ...

  3. C_FD_PhysRDBMSKinds

    C_FD_PhysRDBMSKinds function DateValueToFDSQLStringProc(ADataSet: TDataSet; AValue: Variant): String ...

  4. 引用rtmp编译报错:rtmp.obj : error LNK2001: 无法解析的外部符号 __imp__timeGetTime@0

    如题vs下引用librtmp的时候报错:rtmp.obj : error LNK2001: 无法解析的外部符号 __imp__timeGetTime@0 在link 里加入 winmm.lib 就可以 ...

  5. 【转】iphone - ios app maximum memory budget

    https://stackoverflow.com/questions/5887248/ios-app-maximum-memory-budget device: (crash amount/tota ...

  6. [iOS]UIScrollView左右拨动,第二页宽度只有一半问题

    用UIScrollView动态加入新View,而这个View是Xib方式创建,如果设置view的frame,这个view的宽度却只有设置的一半,很奇怪.于是我只设置view的frame的x值,不设置整 ...

  7. EF CodeFirst简单实例

    运行环境:VS2012,添加的EntityFramework为6.0.2 版本不用太关心,只要知道原理就行了: 基本代码就这几行: namespace ConsoleApplication1 {    ...

  8. 网络编程-socket开发

    练习: 1.什么是C/S架构? 2.互联网协议是什么?分别介绍五层协议中每一层的功能? 3.基于tcp协议通信,为何建立链接需要三次握手,而断开链接却需要四次挥手 4.为何基于tcp协议的通信比基于u ...

  9. centos7 yum 安装 mysql

    CentOS7默认数据库是mariadb,配置等用着不习惯,因此决定改成mysql,但是CentOS7的yum源中默认好像是没有mysql的.为了解决这个问题,我们要先下载mysql的repo源. 1 ...

  10. k8s v1.5.8 单节点搭建

    setsid etcd -name etcd -data-dir /var/lib/etcd -listen-client-urls http://0.0.0.0:2379,http://0.0.0. ...