社区
Java SE
帖子详情
如何快速读取到最后一行
pppplato
2005-10-25 01:30:35
在一个一行一条记录的文件中,如何快速读取他的最后一行.
及
如何按行数来分割文件?
即把一个有500行的文件分割成,两个各250行的小文件
...全文
483
14
打赏
收藏
如何快速读取到最后一行
在一个一行一条记录的文件中,如何快速读取他的最后一行. 及 如何按行数来分割文件? 即把一个有500行的文件分割成,两个各250行的小文件
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
14 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
sjjf
2005-10-28
打赏
举报
回复
to cozmic : 用按照斐波那数列增长会更优雅。
cozmic
2005-10-27
打赏
举报
回复
还是觉得我的方法比较优雅
cozmic
2005-10-27
打赏
举报
回复
我觉得,应该直接设置一个缓冲快,初始值约256Bytes,将文件末尾256B读入其中,
然后split("/t|/n"),如果所得为一个字符数组,那么证明最后一行大约256 B,那么扩大一倍缓冲块,读入,再splip,直至出现两个以上字符数组,那么最后一个就是最后一行的内容。
Mark_Chen
2005-10-26
打赏
举报
回复
支持ztc16627(无语) 得解答!
OnlyFor_love
2005-10-26
打赏
举报
回复
有规则的文件可以按照楼上大虾的方法,不过一般的文件读取的话很困难!
ztc16627
2005-10-26
打赏
举报
回复
用RandomAccessFile.如果文件中的记录比较规则,可以比较方便地读最后一行.
这是一个例子:
import java.io.*;
public class TestRandomAccess{
public static void main(String args[])throws IOException{
RandomAccessFile rf = new RandomAccessFile("test.txt", "rw");
rf.seek(3*14);
System.out.println(rf.readLine());
rf.close();
}
}
test.txt有15行,每行有3个bytes.所以读最后一行,用seek(3*14)就可以了
sjjf
2005-10-26
打赏
举报
回复
二分法是肯定不行的,即使是比二分法高效很多的斐波那搜索也不行。
因为只是需要查找最后的几行的没必要把侧重点放在全局。
上面我的算法大致如下:
int iBlock = 80;
RandomAccessFile rf = new RandomAccessFile("test.txt", "rw");
int iFileLen = rf.length();
int iPos = iBlock;
byte[] abtTmp = new byte[iBlock];
int iLineSize = 2048;
byte[] abtLastLine = new byte[iLineSize];
iCount = iLineSize -1;
while(!exitFalg)
{
if (iFileLen - iPos <0) return ; //读到开头了。
rf.seek(iFileLen - iPos);
int iReads = rf.read(iTmp);
//处理读写异常的代码....
for(int i = iReads ;i >= 0;i--)
{
if (iTmp[i]!='\n') //匹配换行符号,不同系统可能不一致。
abtLastLine[iCount--] = iTmp[i];
else
{
exitFalg = ture;
break;
}
}
iPos += iBlock;
}
String strLastLine = new String(abtLastLine,iCount,iLineSize - iCount);
sjjf
2005-10-26
打赏
举报
回复
估算一下你的最后一行的最大值。比如假定是RowMax
-----
这个什么意思,怎么估算
----这个只能根据现实的情况来做了,
比如业务中根本就没有超过 80个字节的一行的数据。
那么可以设定为 80 或者稍微大一点。
这个不通用。但可以减少i/o次数
如果你想做的通用一点。
那么可以倒过来读,
每次读一个block(大小自定义),当然你也可以一个字节一个字节的读(不考虑效率的话)。
直到读到的内容中有换行符。
believefym
2005-10-26
打赏
举报
回复
楼上的算法也不太好吧,你这个seek不能保证seek到一行的起始位置
不知道你怎么处理呢?
cozmic
2005-10-26
打赏
举报
回复
利用二分法,每次读到文件大小的一半,然后顺次检查换行符(/t|/n)的个数,大于二就再分,依此循环。设文件为n个字节,则最多需要 [log(2) n] + 1 次
believefym
2005-10-26
打赏
举报
回复
估算一下你的最后一行的最大值。比如假定是RowMax
-----
这个什么意思,怎么估算
sjjf
2005-10-26
打赏
举报
回复
读最后一行倒是有个本办法。
前提:
1.文件的大小能获取到。RandomAccessFile.length()
2.文件可以随机访问。 RandomAccessFile.seek()
算法描述:
估算一下你的最后一行的最大值。比如假定是RowMax
seek到 fileLength - rowMax的位置。
然后读到文件尾部。
在内存中查找下最后一个换行符的位置即可。
这种做法应该会很快。
believefym
2005-10-26
打赏
举报
回复
笨一点的方法就是循环读取readLine,返回最后一行
majy
2005-10-25
打赏
举报
回复
呵呵,无序的文件不好办,要不你再加一个文件来描述那个文件好了,这样有了额外的信息就比较好办了
springBoot中自定义参数类型转换
一、缘起 由于工作中的项目需要与第三方进行联调,在对方调用我方的接口中请求接受Content-Type 为application/x-www-form-urlencoded,但是针对该请求方式的springBoot中无法封装复杂类型的参数 例如一个VO对象中含有1、Date类型或者2、List对象 本片博文针对其中的两个问题进行解决。 二、解决方式 1、构造VO对象 ...
后端的日期类型赋值前端表单_Spring Boot实践--前端字符串日期自动转换成后台date类型。...
简单介绍在前后台开发的时候:日期格式会转来转去,很麻烦。大致总结如下:1:后端返回对象:可以使用spring提供的:HttpMessageConverter来自动转换,有很多实现。比如:AbstractJackson2HttpMessageConverter的两种实现:下面前两种MappingJackson2XmlHttpMessageConverter:xml解析器MappingJackson2...
【底部有源码】SpringBoot 自定义参数类型转换
一、缘起由于工作中的项目需要与第三方进行联调,在对方调用我方的接口中请求接受 Content-Type为 application/x-www-form-urlencoded,但是针对该...
SpringBoot前后端中关于表单数据时间格式问题
从后台拿到date类型的数据输出到前端比较容易,不多作介绍,主要是前端把时间传递到后台导致数据类型不一致。具体的解决办法: 采取措施之间 <input type="text" name="bookPubDate" class="form-control"> 采取措施之后 <input type="date" name="bookPubDate" class="form-cont...
SpringBoot Web开发:详解员工信息修改回显功能实现与避坑指南
在Web应用开发中,表单数据绑定与回显是连接用户界面与后端数据模型的核心技术。其原理在于,当用户请求编辑某条记录时,后端根据唯一标识(如ID)查询出完整数据对象,并通过模型(Model)传递给视图层,由模板引擎将对象属性值安全、准确地填充到对应的表单控件中。这项技术的价值在于,它极大地提升了用户体验和操作效率,避免了用户重复输入,是构建交互友好型管理后台的基石。其应用场景广泛覆盖了各类数据管理功能,如用户信息维护、商品编辑、订单处理等。本文聚焦于Java Web开发中经典的“员工信息修改”场景,深入剖析如何
Java SE
62,622
社区成员
307,255
社区内容
发帖
与我相关
我的任务
Java SE
Java 2 Standard Edition
复制链接
扫一扫
分享
社区描述
Java 2 Standard Edition
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章