Java IO及BufferedReader.readline()出现的Bug

关于“Java IO及BufferedReader.readline()出现的Bug”,我们需要注意以下两点:

1. Java IO 中的缓存问题

Java的IO操作是基于缓存进行的,而很多读取函数如BufferedReader. readline()是以换行符作为结束标记的,但是我们在编写代码时常常忽略了特殊情况的处理,导致出现了缓存问题,例如一次读取操作并未读取完整行,而下一次读取又无法续读上一行的后半部分,导致读取出错。

2. BufferedReader.readline() 读取空文件时的问题

当使用BufferedReader. readline()读取空文件时,其中的返回值可能会是null,从而导致异常的出现,我们需要特别注意这种情况。

接下来,我们将通过两个实例分别介绍以上两点。

例一: BufferedReader.readline()的缓存问题

如下代码所示:

import java.io.*;

public class Test {

    public static void main(String[] args) {
        try {
            String line;
            FileReader fr = new FileReader("test.txt");
            BufferedReader br = new BufferedReader(fr);
            while ((line = br.readLine()) != null) {
                System.out.println(line);
            }
            br.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

我们读取的文件内容如下(注意,最后一行没有换行符):

Hello
World
Hello
Java
I'm fine
And you
Goodbye

代码执行结果如下:

Hello
World
Hello
Java
I'm fine
And you

这是因为,在执行第一次String line = br.readLine()时,BufferedReader只读取了“Hello”一行,并且将“Hello\n”存入了缓存中,当第二次执行该语句时,由于并未再读取到换行符,导致BufferedReader无法确定该行是否已经读取结束,因此直接返回了null值,导致我们读取文件的操作异常终止。

这种情况的解决方案有很多,我们这里介绍两种:

方案一:判断缓存是否存在

import java.io.*;

public class Test {

    public static void main(String[] args) {
        try {
            String line;
            FileReader fr = new FileReader("test.txt");
            BufferedReader br = new BufferedReader(fr);
            while ((line = br.readLine()) != null || br.ready()) { // 当缓存中存在未读取的字符时,继续读取
                System.out.println(line);
            }
            br.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

方案二:使用Scanner代替BufferedReader

import java.io.*;
import java.util.Scanner;

public class Test {
    public static void main(String[] args) {
        try {
            Scanner scanner = new Scanner(new File("test.txt"));
            while(scanner.hasNextLine()) {
                System.out.println(scanner.nextLine());
            }
            scanner.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }
}

两种方案都可以正常读取文件中的数据。

例二:lBufferedReader.readline() 读取空文件时的问题

下面的代码将读取空文件,并使用BufferedReader. readline()进行逐行读取操作:

import java.io.*;

public class Test {

    public static void main(String[] args) {
        try {
            String line;
            FileReader fr = new FileReader("test.txt");
            BufferedReader br = new BufferedReader(fr);
            while ((line = br.readLine()) != null) {
                System.out.println(line);
            }
            br.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

此时,因为没有任何内容,程序会抛出NullPointerException异常。

为了解决这个问题,我们可以添加特判来判断文件是否为空:

import java.io.*;

public class Test {

    public static void main(String[] args) {
        try {
            String line;
            FileReader fr = new FileReader("test.txt");
            BufferedReader br = new BufferedReader(fr);
            while (br.ready() && (line = br.readLine()) != null) {
                System.out.println(line);
            }
            br.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

在原来的代码中我们修改了while条件的判断:当缓存中存在未读取的字符并且当前行不是空行时才执行循环体。

以上就是关于Java IO和BufferedReader.readline()出现的Bug的详细攻略。希望对您有所帮助!

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java IO及BufferedReader.readline()出现的Bug - Python技术站

(0)
上一篇 2023年5月27日
下一篇 2023年5月27日

相关文章

  • Springboot2.x 使用 Log4j2 异步打印日志的实现

    下面是详细的攻略: 准备工作 首先,我们需要在Spring Boot项目中引入log4j2和log4j2-async两个依赖: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-log…

    Java 2023年5月26日
    00
  • SpringMVC 单文件上传与多文件上传实例

    下面就给您详细讲解“SpringMVC 单文件上传与多文件上传实例”的完整攻略。 一、SpringMVC 单文件上传实例 1.1 相关依赖说明 在 pom.xml 文件中增加以下依赖: <dependency> <groupId>commons-fileupload</groupId> <artifactId>…

    Java 2023年6月15日
    00
  • 使用Spring处理x-www-form-urlencoded方式

    要使用Spring处理x-www-form-urlencoded方式,需要进行以下步骤: 配置Spring MVC 在web.xml中配置DispatcherServlet。在DispatcherServlet的xml配置文件中,添加,启用Spring MVC注解驱动。这样Spring MVC就可以自动处理表单提交请求。 编写Controller Sprin…

    Java 2023年5月20日
    00
  • Java编程ssh整合常见错误解析

    Java编程SSH整合常见错误解析 SSH(Struts2+Spring3+Hibernate3)是目前Java企业级Web应用开发中比较流行的一种技术架构,尤其是在传统JSP+Servlet的基础上,尤其是对于Java初学者来说,它的学习曲线相对来说比较平滑。然而在SSH的整合过程中,由于各种原因,很容易出现各种错误,本文将一一进行详细介绍。 错误一:Cl…

    Java 2023年5月20日
    00
  • Spring打包jar包时jsp页面无法访问问题解决

    针对Spring打包jar包时jsp页面无法访问的问题解决,可以依照以下步骤进行操作: 问题解析 在Spring项目中,我们在开发过程中经常使用jsp页面进行开发和展示,当我们将Spring项目打包成jar包并进行部署时,就会出现jsp页面无法访问的问题。原因是嵌入式Web服务器默认不支持jsp引擎。 解决步骤 步骤一:添加插件和依赖 在Spring项目的p…

    Java 2023年6月15日
    00
  • 使用BindingResult 自定义错误信息

    下面是关于使用BindingResult自定义错误信息的完整攻略。 一、BindingResult简介 在Spring MVC框架中,接受前端数据的方法一般会使用@ModelAttribute或@RequestBody注解对参数进行声明,此时也可以添加BindingResult类型的参数,用于接收数据绑定时产生的错误信息。 BindingResult是Spr…

    Java 2023年6月15日
    00
  • Mybatis实现关联关系映射的方法示例

    下面是详细讲解“Mybatis实现关联关系映射的方法示例”的完整攻略。 一、什么是关联关系映射 在实际开发中,我们往往会涉及到多个数据表之间的关联关系,比如一对多、多对多等关系。Mybatis作为一款优秀的ORM框架,在这方面也提供了相应的支持。关联关系映射是将多个表之间的关系映射到Java类之间的过程,使得Java类之间可以方便地进行关联操作。下面我们通过…

    Java 2023年5月20日
    00
  • Java中Object用法详解

    Java中Object用法详解 什么是Object Object是Java中所有类的基类,它包含了通用的属性和方法,所有Java类都继承自Object类。因此,Object是Java中最基本、最通用的一种类型。 public class MyClass { // … } 上面的代码中,虽然没有显式地继承Object类,但MyClass类默认继承了Obje…

    Java 2023年5月26日
    00
合作推广
合作推广
分享本页
返回顶部