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

把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. 解决 service iptables start 无法启动的问题

    解决方式: iptables -F  // 初始化iptables. service iptables save  // 保存 service iptables restart  // 重启

  2. leetcode671

    class Solution { public: vector<int> V; void postTree(TreeNode* node) { if (node != NULL) { V. ...

  3. 微信小程序跳转navigateTo与redirectTo

    转自:https://www.cnblogs.com/perfect-yuewei/p/8301761.html 2018-01-16 - 微信中跳转页面方法目前接触到两种 navigateTo与re ...

  4. jaegeropentracing的Java-client

    关于jaegeropentracing的Java-client做记录如下: 1.依赖jar包 <!-- 以下jar包是jaegeropentracing依赖的日志jar -->slf4j- ...

  5. 多线程 同步对象 event 简单实例 &进程间通信

    多线程 同步对象event import threading,time class Boss(threading.Thread): def run(self): print("BOSS:今晚 ...

  6. 留存- angularjs 弹出框 $modal

    $modal只有一个方法:open,该方法的属性有: templateUrl:模态窗口的地址 template:用于显示html标签 scope:一个作用域为模态的内容使用(事实上,$modal会创建 ...

  7. (halcon) derivate_vector_field

    derivate_vector_field: Convolve a vector field with derivatives of the Gaussian 用高斯导数卷积向量场 derivate_ ...

  8. Invalid command 'Header', perhaps misspelled or defined by a module not included in the server configuration

    在Apache的配置文件 httpd.conf 中开启  LoadModule headers_module modules/mod_headers.so  即可解决这个问题.

  9. 关于 jdbc 的错误

  10. 541. Reverse String II 指定翻转前k个的字符串

    [抄题]: Given a string and an integer k, you need to reverse the first k characters for every 2k chara ...