添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

当我们在读取文件的时候,通常都是从前向后读取,那如果要读取文件的最后一行内容,要如何操作呢?

顺序遍历读取,直到文件最后一行
public static String readLastLineV0(File file) {
  String lastLine = "";
  try (BufferedReader bufferedReader = new BufferedReader(new FileReader(file))) {
    String currentLine = "";
    while ((currentLine = bufferedReader.readLine()) != null) {
      lastLine = currentLine;
  } catch (Exception e) {
    log.error("file read error, msg:{}", e.getMessage(), e);
  return lastLine;

该方式很简单,从前向后读取即可,直到最后一行。

利用RandomAccessFile指定位置,从后向前读取
public static String readLastLineV1(File file) {
  // 存储结果
  StringBuilder builder = new StringBuilder();
  try (RandomAccessFile randomAccessFile = new RandomAccessFile(file, "r")) {
    // 指针位置开始为0,所以最大长度为 length-1
    long fileLastPointer = randomAccessFile.length() - 1;
    // 从后向前读取文件
    for (long filePointer = fileLastPointer; filePointer != -1; filePointer--) {
      // 移动指针指向
      randomAccessFile.seek(filePointer);
      int readByte = randomAccessFile.readByte();
      if (0xA == readByte) {
        //  LF='\n'=0x0A 换行
        if (filePointer == fileLastPointer) {
          // 如果是最后的换行,过滤掉
          continue;
        break;
      if (0xD == readByte) {
        //  CR ='\r'=0x0D 回车
        if (filePointer == fileLastPointer - 1) {
          // 如果是倒数的回车也过滤掉
          continue;
        break;
      builder.append((char) readByte);
  } catch (Exception e) {
    log.error("file read error, msg:{}", e.getMessage(), e);
  return builder.reverse().toString();

该方式主要是利用RandomAccessFile可以seek到指定位置读取的方式。从文件的最后向前读取,当遇到0xA(换行)或者0xD(回车)时,利用StringBuilder缓存一下读取到的数据,最后将数据reverse即是最后一行数据。

利用commons-io中的ReversedLinesFileReader

maven导入依赖

<dependency>
  <groupId>commons-io</groupId>
  <artifactId>commons-io</artifactId>
  <version>2.7</version>
</dependency>
public static String readLastLineV2(File file) {
  String lastLine = "";
  try (ReversedLinesFileReader reversedLinesReader = new ReversedLinesFileReader(file, Charset.defaultCharset())) {
    lastLine = reversedLinesReader.readLine();
  } catch (Exception e) {
    log.error("file read error, msg:{}", e.getMessage(), e);
  return lastLine;

该方式可以直接读取到最后一行数据。有兴趣的同学可以自行看一下源码,非常少。它的实现是思路是先将文件拆成多个FilePart。读取位置定位是基于SeekableByteChannel的position方法。而FilePart的readLine实现中,可以一次读取多个bytes。

以上三种读取文件最后一行的方法中,推荐使用commons-io中的ReversedLinesFileReader,使用方式也比较简单。

当我们在读取文件的时候,通常都是从前向后读取,那如果要读取文件的最后一行内容,要如何操作呢?顺序遍历读取,直到文件最后一行public static String readLastLineV0(File file) { String lastLine = ""; try (BufferedReader bufferedReader = new BufferedReader(new FileReader(file))) { String currentLine = ""; whil rf = new RandomAccessFile("d:\\a.txt", "r"); long len = rf.length(); long start = rf.getFilePointer(); long n... 1、首先在pom文件导入依赖 <!--在Java中,我们可以使用 Apache Commons IO 的 ReversedLinesFileReader 类读取文件最后几行。 --> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> public static void main(String[] args) throws IOException { String fileName="F:\\code\\java\\text\\demo\\db\\test.txt"; System.out.println(getFileEndLine(fileName)); * 获取文件最后一行数据,文件中没有数.
### 回答1: CTL是嵌入在Java代码中的一种模版语言,用于将Java代码和静态文本片段混合在一起,以生成动态的HTML、XML或其他格式的文档。CTL文件通常包含一组标记和占位符,以控制文档的结构和内容。 CTL文件的解析是指将CTL文件中的标记和占位符替换为具体的数值或文本,最终生成一个可执行的Java程序。解析过程通常由一个解析器或解析器类来完成。 在解析过程中,解析器会扫描CTL文件中的每个标记和占位符,并根据其所代表的含义进行处理。比如,一个<if>标记可以表示条件语句,解析器会根据条件的成立与否进行相应的操作;而一个{username}占位符可以表示要从数据源中获取的用户名,并将它替换为真实的用户名。 解析器还可以执行一些特殊操作,例如迭代、格式化、逻辑判断等。它可以根据使用者的需求,对CTL文件中的标记和占位符进行灵活的处理,以生成期望的文档。 总的来说,CTL文件的解析过程是将标记和占位符替换为具体的数值或文本的过程,它能够根据使用者的需求,生成动态的文档。解析过程通常由解析器完成,该解析器能够处理CTL文件中的标记和占位符,并执行一些特殊的操作。 ### 回答2: ctl文件是一种文件格式,用于存储或传输控制信息,其扩展名为.ctl。Java是一种面向对象的编程语言,常用于开发各种类型的应用程序。那么,如何解析ctl文件,可以通过Java来实现。 要解析ctl文件,首先需要了解ctl文件的结构和内容。通常,ctl文件包含一系列指令或命令,用于控制特定的操作或行为。在Java中,我们可以使用文件输入流或者文件读取方式来读取ctl文件的内容。 通过Java文件读取功能,可以逐行读取ctl文件的每一行,并将其存储到一个字符串变量中。然后,可以使用字符串处理函数或正则表达式来分析和解析每一行的命令或指令。 解析ctl文件的关键在于理解和处理其中的命令或指令。根据ctl文件的特定语法规则,可以使用Java的字符串处理函数或正则表达式来逐行解析文件内容。在解析过程中,可能需要采用条件判断、循环等控制结构来处理不同的命令或指令。 一旦完成ctl文件的解析,可以根据具体的业务需求来执行相应的操作。这可能涉及到数据库操作、文件处理、网络通信等功能。在Java中,可以利用相应的类库或API来实现这些操作。 总结来说,通过Java编程语言可以很方便地解析ctl文件。需要注意的是,解析ctl文件的具体步骤和方式可能因文件格式的不同而有所差异。因此,在实际应用中,需要根据具体的ctl文件格式进行相应的调整和处理。 ### 回答3: ctl文件是一种用于控制程序行为的文件格式,它主要用于配置程序运行时的参数和选项。在Java中,解析ctl文件可以通过几种方式实现。 一种常见的方式是使用Java文件操作类,比如FileReader或BufferedReader,读取ctl文件的内容,并逐行解析其中的配置信息。可以通过逐行读取文件内容,使用正则表达式或字符串分割等方式,提取出配置项的键值对,然后将其转化为Java对象或存储到Map等数据结构中,方便程序后续使用。 另一种方式是使用Java的XML解析库,比如DOM或SAX,将ctl文件进行转换为XML格式,再利用解析库对XML进行解析。这种方法的优势在于可以使用标准的XML解析方式,灵活性较高。需要注意的是,转换为XML格式需要按照ctl文件的语法规则进行相应的转换,以保留文件中的配置信息。 还有一种方式是使用Java的Properties类,该类是Java内置的用于解析配置文件的类。只需要按照特定格式编写ctl文件,比如以等号分隔键和值,一行表示一个配置项,然后使用Properties类的load()方法将ctl文件加载为Properties对象,即可方便地获取其中的配置信息。 无论采用哪种方式,根据具体的ctl文件格式,可以使用不同的解析技术来解析文件并处理其中的配置信息。解析ctl文件可以方便地进行程序参数的配置和管理,提高程序的灵活性和可维护性。