JAVA如何实现从最后一行读取文件

newyu1127 2007-12-28 05:03:35
各位师兄:
请教一下,JAVA如何实现读取文件时,从文件的最后一行往上一行行读出来。
我的文件是已经生成稳定的,不会再增加内容了。我只需要读取时,从文件的最后一行读起,一次向上读取一行。
JAVA中可以实现这样的功能吗?谢谢指教。
...全文
5962 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
watermelon860722 2011-11-02
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 wilson_lee 的回复:]

引用 17 楼 weichenggao 的回复:
上面的方法太麻烦拉,太傻了
给个简单点的思路,是我刚刚在做的过程中想到的.
直接一行行把读读到的内容放到一个list对象中.

然后反着打印list里面的记录,不就可以了吗?
这个方法是不是很好呢?

做程序真的是写的好不如想的好,好的思路永远是最重要的



偶尔看到这帖子
专门登录了来回以上这个答案:

哥们,如……
[/Quote]
看到这位哥们的答案我笑了。。。如果这个文件特别大。。。都读到LIST里面。。然后再反过来读。。。我擦。。。这效率。。。无法想象。。
d123456603 2010-09-15
  • 打赏
  • 举报
回复
学习了,确实不错,呵呵
很实用
lalaDownload 2010-07-04
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 wilson_lee 的回复:]

引用 17 楼 weichenggao 的回复:
上面的方法太麻烦拉,太傻了
给个简单点的思路,是我刚刚在做的过程中想到的.
直接一行行把读读到的内容放到一个list对象中.

然后反着打印list里面的记录,不就可以了吗?
这个方法是不是很好呢?

做程序真的是写的好不如想的好,好的思路永远是最重要的



偶尔看到这帖子
专门登录了来回以上这个答案:

哥们,如……
[/Quote]
我也是偶尔看到这个帖子,我同意楼上的观点。
我现在需求的是只读取最后一行数据就好了,其他的都不读,还是要考虑各种情况的啊。
我现在想按照上面的几位高手的写法,添加一个计数器,读取到一行指定的数据,就关闭文件。其他的都不读了,各位有什么更好的办法啊。
qiangge_29 2010-06-25
  • 打赏
  • 举报
回复
如果有空行怎么办
yafeiok 2008-12-18
  • 打赏
  • 举报
回复
我也学习了,我是要找第一行和最后一行的数据来判断的,那数据可是百万级的,刚好用的上,效率蛮高的,呵呵;谢谢;
renxiaoyao868 2008-11-05
  • 打赏
  • 举报
回复
学习了,正有这个需求倒着读30行的数据;
wilson_lee 2008-09-03
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 weichenggao 的回复:]
上面的方法太麻烦拉,太傻了
给个简单点的思路,是我刚刚在做的过程中想到的.
直接一行行把读读到的内容放到一个list对象中.

然后反着打印list里面的记录,不就可以了吗?
这个方法是不是很好呢?

做程序真的是写的好不如想的好,好的思路永远是最重要的

[/Quote]

偶尔看到这帖子
专门登录了来回以上这个答案:

哥们,如果再过1年时间,你看到自己给的这个所谓“思路”的答案,不会后悔到狠抽自己嘴巴子的话,那你就转行去做别的吧,不要自己耽误自己了。
weichenggao 2008-07-08
  • 打赏
  • 举报
回复
上面的方法太麻烦拉,太傻了
给个简单点的思路,是我刚刚在做的过程中想到的.
直接一行行把读读到的内容放到一个list对象中.

然后反着打印list里面的记录,不就可以了吗?
这个方法是不是很好呢?

做程序真的是写的好不如想的好,好的思路永远是最重要的
donballking 2008-06-04
  • 打赏
  • 举报
回复
不错,支持一下
ustbsjl 2007-12-29
  • 打赏
  • 举报
回复
想法不错
kase2123456 2007-12-29
  • 打赏
  • 举报
回复
最后几行是空行打印出null的情况已经解决:至于中文乱码的情况确实存在,我解决不了了,不知道哪位高手可指点一下
package zipfile;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;

public class FromEndRF {
public static void main(String args[]){
RandomAccessFile rf=null;
try {
rf=new RandomAccessFile("H:/JSP/tech/login.jsp","r");
long len=rf.length();
long start=rf.getFilePointer();
long nextend=start+len-1;
String line;
rf.seek(nextend);
int c=-1;
while(nextend>start){
c=rf.read();
if(c=='\n'||c=='\r'){
line=rf.readLine();
if(line==null){//处理文件末尾是空行这种情况
nextend--;
rf.seek(nextend);
continue;}
System.out.println(line);
nextend--;
}
nextend--;
rf.seek(nextend);
if(nextend==0){//当文件指针退至文件开始处,输出第一行
System.out.println(rf.readLine());
}
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
finally{
try {
rf.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
老紫竹 2007-12-29
  • 打赏
  • 举报
回复
// 1 解决编码问题
// 2 null 代表这一行到了文件末尾,而且啥也没有读到,而且这是API里面说明的
// null if end of file is encountered before even one byte is read

package test;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;

public class FromEndRF {
public static void read(String filename) {
read(filename, "GBK");
}

public static void read(String filename, String charset) {

RandomAccessFile rf = null;
try {
rf = new RandomAccessFile(filename, "r");
long len = rf.length();
long start = rf.getFilePointer();
long nextend = start + len - 1;
String line;
rf.seek(nextend);
int c = -1;
while (nextend > start) {
c = rf.read();
if (c == '\n' || c == '\r') {
line = rf.readLine();
if (line != null) {
System.out.println(new String(line.getBytes("ISO-8859-1"), charset));
}else {
System.out.println(line);
}
nextend--;
}
nextend--;
rf.seek(nextend);
if (nextend == 0) {// 当文件指针退至文件开始处,输出第一行
System.out.println(rf.readLine());
}
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (rf != null)
rf.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}

public static void main(String args[]) {
read("d:\\2.txt", "gbk");
}
}
kase2123456 2007-12-29
  • 打赏
  • 举报
回复
经6楼提醒,我突然发现,确实多打印了一行空行,谢谢6楼在此基础上解决了这个问题,学习了!至于最后一行是空行时,会打印出null,我当时也知道这个情况,只是当时没有解决得了,希望大家一起参与解决。
gzhiceberg 2007-12-29
  • 打赏
  • 举报
回复
如果文件不大的话,全部读进内存,再倒着取.
胡矣 2007-12-29
  • 打赏
  • 举报
回复
貌似中文还有点问题吧?
不懂编程 2007-12-29
  • 打赏
  • 举报
回复
如果最后一行是空行时,为什么执行下面代码会打出个null???
if (c == '\n' || c == '\r') {
line = rf.readLine();
System.out.println(line);
nextend--;
}
老紫竹 2007-12-29
  • 打赏
  • 举报
回复
楼上的有算法和语法问题,会多打印出一行空行
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;

public class FromEndRF {
public static void main(String args[]) {
RandomAccessFile rf = null;
try {
rf = new RandomAccessFile("d:\\2.txt", "r");
long len = rf.length();
long start = rf.getFilePointer();
System.out.println(start);
long nextend = start + len - 1;
String line;
rf.seek(nextend);
int c = -1;
while (nextend > start) {
c = rf.read();
if (c == '\n' || c == '\r') {
line = rf.readLine();
System.out.println(line);
nextend--;
}
nextend--;
rf.seek(nextend);
if (nextend == 0) {// 当文件指针退至文件开始处,输出第一行
System.out.println(rf.readLine());
}
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (rf != null)
rf.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
newyu1127 2007-12-29
  • 打赏
  • 举报
回复
感谢各位的解答,已经很强了.无以言谢,只要再加上100答谢了.
tolast 2007-12-29
  • 打赏
  • 举报
回复
System.out.println(new String(line.getBytes("ISO-8859-1"), "GB2312"));

System.out.println(new String(rf.readLine().getBytes("ISO-8859-1"), "GB2312"));

把打印语句换成这个再试试看
kase2123456 2007-12-28
  • 打赏
  • 举报
回复
在4楼的基础上,我修改了一下,整理出来了从文件末尾读取文件的程序:
package rfile;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;

public class FromEndRF {
public static void main(String args[]){
try {
RandomAccessFile rf=new RandomAccessFile("H:/JSP/tech/login.jsp","r");
long len=rf.length();
long start=rf.getFilePointer();
System.out.println(start);
long nextend=start+len-1;
String line;
rf.seek(nextend);
int c=-1;
while(nextend>start){
c=rf.read();
if(c=='\n'||c=='\r'){
line=rf.readLine();
System.out.println(line);
}
nextend--;
rf.seek(nextend);
if(nextend==0){//当文件指针退至文件开始处,输出第一行
System.out.println(rf.readLine());
}
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
finally{
try {
rf.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
加载更多回复(4)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧