Erlo

Java中的Scanner、BufferedReader 和 StreamTokenizer

2025-02-03 22:29:24 发布   8 浏览  
页面报错/反馈
收藏 点赞

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 适用于复杂的文本解析,能够根据不同的词法规则分割输入流,并且能够灵活地处理各种标记。

登录查看全部

参与评论

评论留言

还没有评论留言,赶紧来抢楼吧~~

手机查看

返回顶部

给这篇文章打个标签吧~

棒极了 糟糕透顶 好文章 PHP JAVA JS 小程序 Python SEO MySql 确认