在下面的文章中,您将学习如何从文件中读取最后n个字符。JDK 7引入了一个新SeekableByteChannel接口,该接口允许其实现更改字节通道的位置和大小。它的实现之一是FileChannel类(java.nio.channels.FileChannel)。
该FileChannel班有可能得到保持,我们将要读或写一个文件的当前位置。下面的代码段显示了如何从日志文件中读取最后1000个字符。
package org.nhooo.example.io; import java.io.IOException; import java.nio.ByteBuffer; import java.nio.channels.FileChannel; import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.StandardOpenOption; public class FileReadLastNCharacters { public static void main(String[] args) { // 定义日志文件的路径并创建一个ByteBuffer。 Path logPath = Paths.get("D:/Appservers/apache-tomcat-7.0.37/logs/catalina.out"); ByteBuffer buffer = ByteBuffer.allocate(1024); try { // 创建FileChannel并打开文件通道以进行读取访问。 FileChannel channel = FileChannel.open(logPath, StandardOpenOption.READ); // 从通道读取字节序列到缓冲区开始 // 在给定的文件位置,即通道大小-1000。 // 我们将从文件中读取最后1000个字符。 channel.read(buffer, channel.size() - 1000); System.out.println("Characters = " + new String(buffer.array())); } catch (IOException e) { e.printStackTrace(); } } }
上面的代码片段中的步骤是:
获取日志文件的路径。
创建一个ByteBuffer缓冲区,将读取的字节传输到该缓冲区。
使用该FileChannel.open()方法,我们打开一个要读取的文件并返回一个FileChannel对象。
所述read()的方法FileChannel从通道读取的字节序列,并将它们传送到起始给定的缓冲区,并通过规定的位置channel.size() - 1000。此方法返回读取的字节数,可能为零,或者-1如果给定位置大于或等于文件的当前大小。
打印出缓冲的字符串。