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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java实现正则匹配 “1234567” 这个字符串出现四次或四次以上

    Java实现正则匹配 “1234567” 这个字符串出现四次或四次以上

    文章介绍了如何在Java中使用正则表达式匹配一个字符串四次或四次以上的出现,首先创建正则表达式,然后使用Pattern和Matcher类进行匹配和计数,通过示例代码展示了如何实现这一功能,并解释了匹配的整体次数和精确出现次数的逻辑,感兴趣的朋友一起看看吧
    2025-02-02
  • Java多线程用法的实例详解

    Java多线程用法的实例详解

    这篇文章主要介绍了Java多线程用法的实例详解的相关资料,希望通过本文大家能够理解掌握这部分内容,需要的朋友可以参考下
    2017-09-09
  • SpringBoot通过@Value实现给静态变量注入值详解

    SpringBoot通过@Value实现给静态变量注入值详解

    这篇文章主要介绍了springboot如何通过@Value给静态变量注入值,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • 如何实现bean初始化摧毁方法的注入

    如何实现bean初始化摧毁方法的注入

    这篇文章主要为大家介绍了如何实现bean初始化摧毁方法的注入详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04
  • Java8 Lambda表达式模板方法实现解析

    Java8 Lambda表达式模板方法实现解析

    这篇文章主要介绍了Java8 Lambda表达式模板方法实现解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-08-08
  • java如何在项目中实现excel导入导出功能

    java如何在项目中实现excel导入导出功能

    这篇文章主要介绍了java如何在项目中实现excel导入导出功能的相关资料,EasyExcel是一个基于Apache POI开发的开源Java库,用于简化Excel文件的读写操作,文中将用法介绍的非常详细,需要的朋友可以参考下
    2024-10-10
  • 没有外网IDEA离线使用maven仓库的方法

    没有外网IDEA离线使用maven仓库的方法

    这篇文章主要介绍了没有外网,IDEA如何离线使用maven仓库,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-08-08
  • SpringBoot DBUnit 单元测试(小结)

    SpringBoot DBUnit 单元测试(小结)

    这篇文章主要介绍了SpringBoot DBUnit 单元测试(小结),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-09-09
  • Java线程取消的三种方式

    Java线程取消的三种方式

    文章介绍了 Java 线程取消的 3 种方式,不推荐使用 stop 方法和 volatile 设标记位停止线程,线程中断机制是协作式的,一个线程请求中断,另一线程响应,线程可检查自身中断状态或捕获 InterruptedException 来合适处理以响应中断,确保安全有序停止,避免资源泄露等问题
    2024-12-12
  • 通Java接口上传实现SMMS图床

    通Java接口上传实现SMMS图床

    这篇文章主要介绍了通Java接口上传实现SMMS图床,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-07-07

最新评论