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日

相关文章

  • JAVA 中Spring的@Async用法总结

    让我为您详细讲解“JAVA 中Spring的@Async用法总结”的攻略吧。 简介 Spring 框架中提供了 @Async 注解,可以实现异步方法调用。当使用 @Async 注解时,Spring 会自动把该方法放在一个线程池中执行,不会阻塞主线程。下面我将为您详细讲解 @Async 注解的用法。 使用步骤 1. 引入依赖 要使用 @Async 注解,需要在…

    Java 2023年5月26日
    00
  • Java中数组转List的三种方法与对比分析

    Java中数组转List的三种方法与对比分析 背景 在Java中,我们常常需要把一个数组转换成List,这样可以方便地进行相关操作。但是,对于初学者来说,这不是一件容易的事情,可能会产生一些疑惑和困惑。因此,本文将介绍Java中数组转List的三种方法,并进行详细的对比分析,帮助读者更好地理解和掌握这个知识点。 方法一:使用Arrays类的asList()方…

    Java 2023年5月26日
    00
  • SpringBoot集成Spring Security的方法

    SpringBoot集成SpringSecurity的方法 Spring Security是一个强大的Java安全框架,可以提供身份验证、授权、加密和会话管理等功能。在本文中,将介绍如何使用SpringBoot集成Spring Security,以便在我们的应用程序中实现安全性。 步骤一:添加Spring Security依赖 我们需要在pom.xml文件中…

    Java 2023年5月15日
    00
  • Java实现基础银行ATM系统

    Java实现基础银行ATM系统攻略 系统概述 本系统旨在实现一个基础的银行ATM系统,主要功能包括用户登录、账户查询、取款、存款、转账等。 系统设计 数据库设计 本系统采用MySQL数据库来存储用户信息、账户信息等,包括以下两张表: 用户信息表 ID:用户ID,唯一标识用户 Name:用户姓名 Phone:电话号码 Password:密码,用于登录ATM系统…

    Java 2023年5月24日
    00
  • springboot maven 打包插件介绍及注意事项说明

    SpringBoot Maven 打包插件介绍及注意事项说明 SpringBoot Maven 打包插件提供了许多效率工具和集成包,可以轻松地将 SpringBoot 应用程序打包部署。在本文中,我们将了解如何配置 SpringBoot Maven 打包插件、注意事项以及一些示例。 配置 在 pom.xml 文件中加入以下内容: xml <build&…

    Java 2023年5月19日
    00
  • java下使用kaptcha生成验证码

    生成验证码常常用于网站的用户登录、注册和重置密码等操作中,可以有效地防止恶意攻击和密码爆破。在Java语言中,可以使用kaptcha库来快速生成验证码。 下面是使用kaptcha生成验证码的步骤和示例: 步骤1:添加依赖 在pom.xml中添加以下依赖,表示使用kaptcha的生成验证码功能: <dependency> <groupId&g…

    Java 2023年6月15日
    00
  • 常见的几种web攻击的防范办法 web常见攻击方式

    下面就为你讲解一下常见的几种Web攻击的防范办法。 常见的Web攻击方式 以下是Web常见攻击方式: XSS攻击 CSRF攻击 SQL注入攻击 1. XSS攻击 定义 XSS攻击即跨站脚本攻击,攻击者在网页中嵌入恶意脚本,当用户访问该页面时,该恶意脚本就可以获取用户的cookie等信息,从而获取用户的敏感信息。 防范办法 对用户输入的内容进行过滤和转义,尤其…

    Java 2023年5月20日
    00
  • SpringBoot返回多种格式的数据的实现示例

    在 Spring Boot 中,我们可以使用多种方式返回不同格式的数据,例如 JSON、XML、HTML 等。在本文中,我们将详细讲解 Spring Boot 返回多种格式的数据的实现示例。 示例一:返回 JSON 格式的数据 以下是一个示例,演示如何在 Spring Boot 中返回 JSON 格式的数据: 创建一个名为 UserController 的控…

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