Java中的Scanner、BufferedReader 和 StreamTokenizer使用详解

 更新时间:2025年02月05日 08:46:29   作者:nmblr  
Scanner是Java 中一个用于解析原始类型(如 int、double 等)和字符串的类,它通常从输入流中逐个读取数据并进行解析,支持多种分隔符的使用,本文介绍Java中的Scanner、BufferedReader 和 StreamTokenizer的相关知识,感兴趣的朋友一起看看吧

1. Scanner 的使用与分析

简介:

Scanner 是 Java 中一个用于解析原始类型(如 intdouble 等)和字符串的类。它通常从输入流中逐个读取数据并进行解析,支持多种分隔符的使用。其方法比较灵活,能够处理不同类型的数据输入。

常用方法:

  • nextLine():读取一行文本。
  • nextInt():读取一个整数。
  • nextDouble():读取一个浮点数。
  • next():读取一个单词。

性能:

Scanner 相较于 BufferedReader 在性能上稍逊一筹,尤其是在大量数据输入时,因为每次读取时都要进行格式检查和解析。

错误处理:

Scanner 在读取不符合格式的数据时,通常会抛出异常,需要通过异常处理来管理。

适用场景

适用于简单、格式规范的输入,尤其是处理基本数据类型的输入时。

代码示例:Scanner 的基本使用

import java.util.Scanner;
public class ScannerExample {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("Enter a string:");
        String inputString = scanner.nextLine();  // 读取一行文本
        System.out.println("You entered: " + inputString);
        System.out.println("Enter an integer:");
        int inputInt = scanner.nextInt();  // 读取整数
        System.out.println("You entered the number: " + inputInt);
        System.out.println("Enter a double:");
        double inputDouble = scanner.nextDouble();  // 读取浮点数
        System.out.println("You entered the double: " + inputDouble);
        scanner.close();
    }
}

2. BufferedReader 的使用与分析

简介:

BufferedReader 是 Java 中一个用于读取字符输入流的类。它提供了缓冲功能,可以减少每次读取时的 I/O 操作,从而提高性能。通常,BufferedReader 用于逐行读取数据。

常用方法:

  • readLine():读取一行文本。
  • read():读取单个字符。

性能:

BufferedReader 通过缓冲机制提高了读取大量数据的性能,尤其是在处理文件读取时表现得尤为明显。

错误处理:

BufferedReader 对于错误的输入通常不会抛出异常,而是返回 null,需要显式判断和处理。

适用场景:

适用于处理大量文本输入,尤其是对性能有较高要求的场景。它适合从文件或者标准输入中读取大块数据。

代码示例:BufferedReader 的基本使用

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
public class BufferedReaderExample {
    public static void main(String[] args) {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        try {
            System.out.println("Enter a line of text:");
            String input = reader.readLine();  // 读取一行文本
            System.out.println("You entered: " + input);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                reader.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

3. StreamTokenizer 的使用与分析

简介:

StreamTokenizer 是 Java 中用于将输入流分割为标记(tokens)的类。它通过读取字符流并按指定规则将输入流中的字符切割为有意义的单词、数字等标记,适合用来解析结构化文本。

常用方法:

  • nextToken():读取下一个标记。
  • ttype:标记的类型(如单词、数字等)。
  • sval:当前标记的字符串值。
  • nval:当前标记的数字值。

性能:

StreamTokenizer 在解析文本时性能较高,因为它以流的形式逐字符地读取输入,不会占用过多内存。

错误处理:

StreamTokenizer 在遇到无法识别的字符时会跳过,直到下一个有效的标记。它通常不会抛出异常。

适用场景:

适用于需要精确控制标记化输入流的场景,尤其是在文本分析和解析时。

代码示例:StreamTokenizer 的基本使用

import java.io.*;
import java.util.*;
public class Main {
    static StreamTokenizer st = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
    public static void main(String[] args) throws IOException {
        int n = nextInt();
    }
    public static int nextInt() throws IOException {
        st.nextToken();
        return (int)st.nval;
    }
}
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.io.StreamTokenizer;
public class StreamTokenizerExample {
    public static void main(String[] args) throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        System.out.println("Enter some text:");
        processTokens(reader);  // 处理输入的标记
    }
    /**
     * 处理输入的文本并打印每个标记。
     * @param reader 输入流
     * @throws IOException 读取流时抛出的异常
     */
    public static void processTokens(BufferedReader reader) throws IOException {
        // 创建 StreamTokenizer 对象
        StreamTokenizer tokenizer = new StreamTokenizer(reader);
        // 遍历输入流,处理每个标记
        while (tokenizer.nextToken() != StreamTokenizer.TT_EOF) {
            processTokenByType(tokenizer);  // 根据标记类型处理
        }
    }
    /**
     * 根据不同的标记类型处理输入
     * @param tokenizer StreamTokenizer 对象
     */
    public static void processTokenByType(StreamTokenizer tokenizer) {
        try {
            switch (tokenizer.ttype) {
                case StreamTokenizer.TT_WORD:
                    System.out.println("Word: " + tokenizer.sval);  // 处理单词
                    break;
                case StreamTokenizer.TT_NUMBER:
                    System.out.println("Number: " + tokenizer.nval);  // 处理数字
                    break;
                case StreamTokenizer.TT_EOL:
                    System.out.println("End of line encountered.");  // 处理行结束符
                    break;
                case StreamTokenizer.TT_EOF:
                    // EOF 不需要处理
                    break;
                default:
                    System.out.println("Other: " + (char) tokenizer.ttype);  // 处理其他字符
                    break;
            }
        } catch (IOException e) {
            // 统一抛出异常
            throw new RuntimeException("Error processing the token", e);
        }
    }
}

总结

  • Scanner 适用于简单、格式规范的输入,尤其是在处理基本数据类型时非常方便。其优势在于灵活性,但性能较 BufferedReader 差。
  • BufferedReader 适用于处理大块文本输入,特别是在处理文件数据时。通过缓冲机制,BufferedReader 提供了较高的性能。
  • StreamTokenizer 适用于复杂的文本解析,能够根据不同的词法规则分割输入流,并且能够灵活地处理各种标记。

到此这篇关于Java中的Scanner、BufferedReader 和 StreamTokenizer的文章就介绍到这了,更多相关Java Scanner、BufferedReader 和 StreamTokenizer内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 详解如何使用Mybatis的拦截器

    详解如何使用Mybatis的拦截器

    MyBatis 拦截器是 MyBatis 提供的一个强大特性,它允许你在 MyBatis 执行其核心逻辑的关键节点插入自定义逻辑,从而改变 MyBatis 的默认行为,本文给大家详细介绍了如何使用Mybatis的拦截器,需要的朋友可以参考下
    2024-03-03
  • IDEA启动Java Spring旧项目的具体配置步骤

    IDEA启动Java Spring旧项目的具体配置步骤

    刚刚接触到IDEA,创建springboot总出现各种问题,这篇文章主要介绍了IDEA启动Java Spring旧项目的具体配置步骤,文中通过图文及实例代码介绍的非常详细,需要的朋友可以参考下
    2025-10-10
  • Java中session存储Users对象实现记住密码

    Java中session存储Users对象实现记住密码

    这篇文章主要介绍了Java中session存储Users对象实现记住密码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • 新手了解java 类,对象以及封装基础知识

    新手了解java 类,对象以及封装基础知识

    JS是一门面向对象语言,其对象是用prototype属性来模拟的,本文介绍了如何封装JS对象,具有一定的参考价值,下面跟着小编一起来看下吧,希望对你有所帮助
    2021-07-07
  • Hibernate连接三种数据库的配置文件

    Hibernate连接三种数据库的配置文件

    今天小编就为大家分享一篇关于Hibernate连接三种数据库的配置文件,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-03-03
  • JAVA基于数组实现的商品信息查询功能示例

    JAVA基于数组实现的商品信息查询功能示例

    这篇文章主要介绍了JAVA基于数组实现的商品信息查询功能,结合实例形式详细分析了java使用数组存储数据实现的商品信息查询功能相关操作技巧,需要的朋友可以参考下
    2019-11-11
  • SpringBoot实现国际化的操作步骤

    SpringBoot实现国际化的操作步骤

    国际化(Internationalization) 是指为了适应不同语言、文化和地区的用户,使软件能够方便地进行本地化修改的过程,本文介绍了SpringBoot 国际化功能的简单使用,感兴趣的朋友可以参考下
    2024-02-02
  • Hadoop源码分析五hdfs架构原理剖析

    Hadoop源码分析五hdfs架构原理剖析

    本篇是Hadoop源码分析系列文章第五篇,主要介绍Hadoop的hdfs架构原理剖析,后续本系列文章会持续更新,有需要的朋友可以借鉴参考下
    2021-09-09
  • Java实现合并word文档的示例代码

    Java实现合并word文档的示例代码

    在做项目中,经常会遇到一种情况,需要将一个小word文档的内容插入到一个大word(主文档)中。本文就为大家准备了Java实现合并word文档的方法,需要的可以参考一下
    2022-08-08
  • Java中的注解机制Annotation详解

    Java中的注解机制Annotation详解

    这篇文章主要介绍了Java中的注解机制Annotation详解,  Java Annotation 是 Java 语言中的一种 元数据机制,它可以在代码中添加额外的信息,以便于程序的理解和处理,Annotation 可以用来描述类、方法、属性等各种程序的特性,需要的朋友可以参考下
    2023-10-10

最新评论