new BufferedReader(new InputStreamReader(System.in)).read()

new BufferedReader(new InputStreamReader(System.in)).read()

类 BufferedReader

1. BufferedReader(缓存字符输入流)
从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。

可以指定缓冲区的大小,或使用默认的大小。一般情况下,默认值足够大。

通常,Reader 所作的每个读取请求都会导致对底层字符或字节流进行相应的读取请求。因此,建议用 BufferedReader 包装所有其 read() 操作可能开销很高的 Reader(如 FileReader 和 InputStreamReader),将输入流先放到BufferedReader的缓冲区中,再利用BufferedReader的方法读取到内存。

2.构造方法

BufferedReader有两种构造方法。如下:

  • BufferedReader(Reader in)

    创建一个使用默认大小输入缓冲区的缓冲字符输入流。

    参数:

     in - 一个 Reader
    
  • BufferedReader(Reader in, int sz)

    创建一个使用指定大小输入缓冲区的缓冲字符输入流。

    参数:

      in - 一个 Reader;
      sz - 输入缓冲区的大小 
    

3.常用方法

  • int read()
    读取单个字符。

    返回:读入的整数字符(其范围从 0 到 65535 (0x00-0xffff)),如果已到达流末尾,则返回 -1 。

  • int read(char[] cbuf, int off, int len)
    将字符读入数组的某一部分。

    参数:

      cbuf -目标缓冲区
      off -开始存储字符处的偏移量
      len -要读取的最大字符数 
    

    返回:读取的字符数,如果已到达流末尾,则返回 -1 。

此方法实现了 Reader 类中 read 方法。它可以重复地调用底层流的 read 方法,读取尽可能多的字符。这种迭代的 read 会一直继续下去,直到满足以下条件之一:

 已经读取了指定的字符数;
 底层流的 read 方法返回 -1,指示文件末尾(end-of-file);
 底层流的 ready 方法返回 false,指示将阻塞后续的输入请求。 

如果第一次对底层流调用 read 返回 -1(指示文件末尾),则此方法返回 -1。否则此方法返回实际读取的字符数。

  • String readLine()
    读取一个文本行。

类 InputStreamReader

1. InputStreamReader(转换流)

InputStreamReader 是字节流通向字符流的桥梁:它使用指定的 charset 读取字节并将其解码为字符,将字节输入流转化为字符输入流。

2.构造方法

InputStreamReader的构造方法。如下:

  • public InputStreamReader(InputStream in)
    创建一个使用默认字符集的 InputStreamReader。

    参数:

      in - InputStream
    
  • public InputStreamReader(InputStream in, String charsetName) throws UnsupportedEncodingException
    创建使用指定字符集的 InputStreamReader。

    参数:

      in - InputStream
      charsetName - 受支持的 charset 的名称 
    
  • public InputStreamReader(InputStream in,Charset cs)
    创建使用给定字符集的 InputStreamReader。

    参数:

      in - InputStream
      cs - 字符集
    
  • public InputStreamReader(InputStream in,CharsetDecoder dec)
    创建使用给定字符集解码器的 InputStreamReader。

    参数:

      in - InputStream
      dec - 字符集解码器
    

3.常用方法

  • public String getEncoding()
    返回此流使用的字符编码的名称。
    如果该编码有历史上用过的名称,则返回该名称;否则返回该编码的规范化名称。 如果使用 InputStreamReader(InputStream, String) 构造方法创建此实例,则返回的由此编码生成的唯一名称可能与传递给该构造方法的名称不一样。如果流已经关闭,则此方法将会返回 null。

返回:

此编码的历史名称,如果流已经关闭,则返回 null
  • public int read() throws IOException
    读取单个字符。

返回:

读取的字符,如果已到达流的末尾,则返回 -1 
  • public int read(char[] cbuf,int offset,int length) throws IOException
    将字符读入数组中的某一部分。

参数:

cbuf - 目标缓冲区
offset - 从其处开始存储字符的偏移量
length - 要读取的最大字符数 

返回:

读取的字符数,如果已到达流的末尾,则返回 -1 
  • public boolean ready() throws IOException
    判断此流是否已经准备好用于读取。如果其输入缓冲区不为空,或者可从底层字节流读取字节,则 InputStreamReader 已做好被读取准备。

返回:

如果保证下一个 read() 不阻塞输入,则返回 True,否则返回 false。注意,返回 false 并不保证阻塞下一次读取。 
  • public void close() throws IOException
    关闭该流并释放与之关联的所有资源。在关闭该流后,再调用 read()、ready()、mark()、reset() 或 skip() 将抛出 IOException。关闭以前关闭的流无效。

new BufferedReader(new InputStreamReader(System.in)).read()

实际上就是从键盘读取字节输入流,将字节输入流转化为字符输入流,先放到BufferedReader的缓冲区,然后调用对应方法对字符输入流进行读取。

下面对new BufferedReader(new InputStreamReader(System.in)).read()进行分析,将语句进行拆分,对该类方法的使用进行展示:

package test;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
public class Test {
public static void main(String[] args) throws Exception {
		//从键盘得到字节输入流,将它通过转换流转换成字符输入流,然后放入字符输入流的缓存区中,最后调用该流的read方法读取到内存
//		int str = new BufferedReader(new InputStreamReader(System.in)).read();
//		String str2 = new BufferedReader(new InputStreamReader(System.in)).readLine();
//		System.out.println("输入的第一个字节:"+str);
//		System.out.println("输入的字符串"+str2);
		
		// System.in是InputStream类型的,是字节输入流
		InputStream in = System.in;
		// 将输入流作为InputStreamReader的构造方法的参数,创建了转换流InputStreamReader (InputStreamReader 是字节流通向字符流的桥梁)
		InputStreamReader isReader = new InputStreamReader(in);
		//将转换流作为BufferedReader的构造方法的参数,创建缓存字符输入流BufferedReader
		BufferedReader bReader = new BufferedReader(isReader);
		//通过BufferedReader的read方法将缓存中的字符流,读取单个字符到内存
		int result1 = bReader.read();
		System.out.println("读取单个字符到内存:" + result1);
		//创建第二个字符流的缓存区,调用readLine方法读取一行字符
		BufferedReader bReader2 = new BufferedReader(isReader);
		String result2 = bReader2.readLine();
		System.out.println("输入的字符串" + result2);
	}
}

补充

java.io 中 Reader 的子类

  • BufferedReader(缓存字符输入流)
    从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。
  • FileReader
    用来读取字符文件的便捷类。
  • InputStreamReader(转换流)
    InputStreamReader 是字节流通向字符流的桥梁:它使用指定的charset 读取字节并将其解码为字符。
  • FilterReader
    用于读取已过滤的字符流的抽象类。
  • CharArrayReader
    此类实现一个可用作字符输入流的字符缓冲区。

java.io 中 InputStream (字节输入流)的子类

  • BufferedInputStream
    BufferedInputStream 为另一个输入流添加一些功能,即缓冲输入以及支持 mark 和 reset 方法的能力。
  • FilterInputStream
    FilterInputStream 包含其他一些输入流,它将这些流用作其基本数据源,它可以直接传输数据或提供一些额外的功能。
  • ByteArrayInputStream
    ByteArrayInputStream 包含一个内部缓冲区,该缓冲区包含从流中读取的字节。
  • DataInputStream
    数据输入流允许应用程序以与机器无关方式从底层输入流中读取基本 Java 数据类型。

java.io 中 FilterInputStream 的子类

  • class BufferedInputStream
    BufferedInputStream 为另一个输入流添加一些功能,即缓冲输入以及支持 mark 和 reset 方法的能力。
  • class DataInputStream
    数据输入流允许应用程序以与机器无关方式从底层输入流中读取基本 Java 数据类型。

上述Reader和InputStream都是Object的子类。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值