Java如何实现按指定行读取文件
最近在开发实战中,遇到了一个这样的技术情景:
把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如何实现按指定行读取文件的更多相关文章
- Java利用内存映射文件实现按行读取文件
我们知道内存映射文件读取是各种读取方式中速度最快的,但是内存映射文件读取的API里没有提供按行读取的方法,需要自己实现.下面就是我利用内存映射文件实现按行读取文件的方法,如有错误之处请指出,或者有更好 ...
- Java使用FileReader(file)、readLine()读取文件,以行为单位,一次读一行,一直读到null时结束,每读一行都显示行号。
//Java使用FileReader(file).readLine()读取文件,以行为单位,一次读一行,一直读到null时结束,每读一行都显示行号. public static void readFi ...
- C++/Php/Python/Shell 程序按行读取文件或者控制台
写程序经常需要用到从文件或者标准输入中按行读取信息,这里汇总一下.方便使用 1. C++ 读取文件 #include<stdio.h> #include<string.h> i ...
- C++/Php/Python/Shell 程序按行读取文件或者控制台方法总结。
C++/Php/Python/Shell 程序按行读取文件或者控制台方法总结. 一.总结 C++/Php/Python/Shell 程序按行读取文件或者控制台(php读取标准输入:$fp = fope ...
- Python跳过第一行读取文件内容
Python编程时,经常需要跳过第一行读取文件内容.比较容易想到是为每行设置一个line_num,然后判断line_num是否为1,如果不等于1,则进行读取操作.相应的Python代码如下: inpu ...
- python_基础学习_01_按行读取文件的最优方法
python 按行读取文件 ,网上搜集有N种方法,效率有区别,先mark最优答案,下次补充测试数据 with open('filename') as file: for line in file: d ...
- python 按每行读取文件怎么去掉换行符
python按每行读取文件后,会在每行末尾带上换行符,这样非常不方便后续业务处理逻辑,需要去掉每行的换行符,怎么去掉呢?看下面的案例: >>> a = "hello wor ...
- Shell按行读取文件的3种方法
Shell按行读取文件的方法有很多,常见的三种方法如下: 要读取的文件: [root@mini05 -]# cat file.info 写法一: [root@mini05 -]# cat read1. ...
- Python按行读取文件、写文件
Python按行读取文件 学习了:https://www.cnblogs.com/scse11061160/p/5605190.html file = open("sample.txt&qu ...
随机推荐
- 【源码阅读】Java集合之二 - LinkedList源码深度解读
Java 源码阅读的第一步是Collection框架源码,这也是面试基础中的基础: 针对Collection的源码阅读写一个系列的文章; 本文是第二篇LinkedList. ---@pdai JDK版 ...
- ffmpeg打开视频解码器失败:Could not find codec parameters for stream 0 (Video: h264): unspecified size
在使用ffmpeg进行拉流分离音视频数据再解码播放操作的时候: 有时候经常会报错: Could not find codec parameters for stream 0 (Video: h264) ...
- HTML5服务器推送消息的各种解决办法,html5服务器
HTML5服务器推送消息的各种解决办法,html5服务器 摘要 在各种BS架构的应用程序中,往往都希望服务端能够主动地向客户端推送各种消息,以达到类似于邮件.消息.待办事项等通知. 往BS架构本身存在 ...
- jquery中绑定click事件重复执行问题
jquery中单击事件重复多次执行的问题使用如下方式: $('#sub').unbind('click').click(function () { ... });
- loadView 和 viewDidLoad、viewDidunload 的区别
loadView 和 viewDidLoad 是 iPhone 开发中肯定要用到的两个方法. 他们都可以用来在视图载入的时候初始化一些内容. 但是他们有什么区别呢? viewDidLoad 方法只有当 ...
- ubuntu下面板上无网络连接的图标
解决方法:删除旧的网络配置,重新让networkManager自动配置 sudo service network-manager stop sudo rm /var/lib/NetworkManage ...
- web前端整套面试题(一)--js相关
一.单选 1.以下哪条语句会产生运行:(A) A.var obj = ( ); B.var obj = [ ]; C.var obj = { }; D.var obj = / /; B代表数组,C代表 ...
- div垂直居中的N种方法 单行/多行文字(未知高度/固定高度)
说到这个问题的时候,也许有人会问CSS中不是有vertical-align属性来设置垂直居中的吗?即使是某些浏览器不支持我只需做少许的 CSSHack技术就可以啊!所以在这里我还要啰嗦两句,CSS中的 ...
- SaltStack 运行机理特点
SaltStack 运行机理特点 1.实时通讯(REAL-TIME COMMUNICATION) 所有 Salt minions 接收命令都是同时的,这意味着控制 10 个或者 10000 个系统所消 ...
- 104. Maximum Depth of Binary Tree (Tree; DFS)
Given a binary tree, find its maximum depth. The maximum depth is the number of nodes along the long ...