使用Java读取文件的最后n个字节

7
我有一个爬虫程序记录一些文件。有时,服务器发生错误,爬虫会创建大量日志文件,这些文件很难解析。因此,我想创建一个简单的程序,读取日志文件末尾的约1000个字符,并将消息显示给我(即使爬虫正在继续写入该文件)。这将帮助我在不关闭爬虫的情况下解决问题。

问题是什么?你尝试过什么? - JB Nizet
4
如果你在Linux/Unix上,可以使用命令 tail /your/file 查看文件末尾内容。 - Lukas Knuth
@LukasKnuth:+1。应该提到-f以获得+2...;-) - Axel
@Axel 也会使用 -f。他说文件可能在他想获取最后几行时被写入。 - Lukas Knuth
是的,我认为这非常方便。通常我会执行类似于 tail -f /your/file | grep error_of_interest 的操作。 - Axel
顺便提一下,问题中添加了Windows标签,因此默认安装中没有tail命令。 - Axel
3个回答

16

使用RandomAccessFile进行寻址,然后通过读取来获取字节。

File file = new File("DemoRandomAccessFile.out");
RandomAccessFile raf = new RandomAccessFile(file, "r");

// Seek to the end of file
raf.seek(file.length() - n);
// Read it out.
raf.read(yourbyteArray, 0, n);

1
这个回答更符合我的问题,所以我选择它作为答案。但是我会使用Tail for Win32 ;) - Alireza Noori
不应该使用"rw",只能使用"r",因为在大多数Windows环境中,写模式会对文件进行锁定,日志记录器将无法写入日志,这就是为什么我建议以读模式打开的原因。 - user529543
如果重要的是读取所有字节,请记住read方法不能保证读取超过一个字节。考虑使用 raf.readFully(yourbyteArray) 确保读取了构成正在读入的缓冲区长度的所有字节。 - Guus

3

在您的计算机上已经有一个方便的命令行工具。 tail -c 1000 可以完成您所请求的操作。将打印出最后10行的tail -n 10可能更加有用。


我在使用Windows操作系统。它支持Windows吗? - Alireza Noori
太棒了。谢谢。Tail for Win32对我有帮助。 - Alireza Noori

2
检查文件长度,假设为1MB。
使用RandomAccessFile进行读取。
将指针移动到1024*1024-1000的位置。
读取1000个字节。
点赞 :)

由于Tail for Win32已经满足了我的需求,我不需要这个,但是这确实是正确的方法,因此点赞 ;) - Alireza Noori

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接