java中的四大输入:System.in,Scanner,InputStreamReader,BufferesReader的用法与区别

本文为转载学习使用,用于自己学习试试,原文来自:https://blog.csdn.net/qq_36631076/article/details/77006007

四种都是Java中获取键盘输入值的方法

1 System.in

System.in返回的是InputStream指向命令行输入的字节流,它的read方法以字节流的方式来读取命令行的输入的数据。
查看源码我们常用的有:

int System.read() //以字节的方式读取输入的第一字符,返回该字符的ASCII码
int System.read(byte b[]) //以字节的方式把输入的字符放入byte数组中
int System.read(byte b[], int off, int len) //以字节的方式把输入的字符放入byte数组中 off是起始位置,len是最大读入的字节数。

使用实例:

int num = System.in.read(); // 输入 abc
System.out.println(num); // 输出 97 PS:97是a的ASCII码值
// 定义一个byte数组
byte[] b = new byte[10]; // 输入 " abc "(不算上"" 这个只是为了看清空格键,意思是,把空格键也计算上去了,截图是不算上或回车键,只有换行)
int len = System.in.read(b);
System.out.println(len); // 输出 5 ,这里加上了回车键和换行键
System.out.println(Arrays.toString(b));
// 输出[97, 98, 99, 13, 10, 0, 0, 0, 0, 0]
// 这里的97 98 99 分别是a、b、c的ASCII码值,13,10分别是 回车键 和 换行键 的ASCII码值


2 Scanner

java.util.Scanner是Java5的新特征,主要功能是简化文本扫描,这个类最实用的地方表现在获取控制台输入。当通过new Scanner(System.in)创建一个Scanner,控制台会一直等待输入,直到敲回车键结束,把所输入的内容传给Scanner,作为扫描对象。如果要获取输入的内容,则只需要调用Scanner的nextLine()方法即可。

Scanner也可以从字符串(Readable)、输入流、文件等等来直接构建Scanner对象,有了Scanner了,就可以逐段(根据正则分隔式)来扫描整个文本,并对扫描后的结果做想要的处理。

控制台扫描:

Scanner input = new Scanner(System.in);
while (true) {
String line = sc.nextLine();
if (line.equals("exit")) {
break; //如果输入为"exit",则退出
}
System.out.println("输入:" + line);
}
  • Scanner默认使用空格作为分割符来分隔文本,但允许你指定新的分隔符:
// 默认以空格方式分割文本
Scanner sc = new Scanner("123 asdf sd 45 789 sdf asdfl,sdf.sdfl,asdf ......asdfkl las");
// 以自己制定方式分割文本,支持正则表达式
//sc.useDelimiter(" |,|\\.");
while (sc.hasNext()) {
System.out.println(sc.next());
}

重要滴API

// 默认以空格方式分割文本
Scanner input= new Scanner("123 asdf sd 45 789 sdf asdfl,sdf.sdfl,asdf ......asdfkl las");
// 以自己制定方式分割文本,支持正则表达式
//input.useDelimiter(" |,|\\.");
while (input.hasNext()) {
System.out.println(input.next());
}

3 InputStreamReader

InputStreamReader是字节流通向字符流的桥梁:它使用指定的 charset 读取字节并将其解码为字符。它使用的字符集可以由名称指定或显式给定,或者可以接受平台默认的字符集

InputStreamReader (InputStream in) // 创建一个使用默认字符集的 InputStreamReader。
InputStreamReader (InputStream in, Charset cs) // 创建使用给定字符集的 InputStreamReader。
InputStreamReader (InputStream in, CharsetDecoder dec) // 创建使用给定字符集解码器的 InputStreamReader。
InputStreamReader (InputStream in, String charsetName) // 创建使用指定字符集的 InputStreamReader。
InputStreamReader重要API
public int read() //以字节的方式读取输入的第一字符,返回该字符的ASCII码
public int read(char cbuf[]) //以字节的方式把输入的字符放入char数组中
public int read(char cbuf[], int offset, int length) //以字节的方式把输入的字符放入char数组中 offset是起始位,length是最大读入的字节数。

每次调用 InputStreamReader 中的一个 read() 方法都会导致从底层输入流读取一个或多个字节。要启用从字节到字符的有效转换,可以提前从底层流读取更多的字节,使其超过满足当前读取操作所需的字节。 为了达到最高效率,可要考虑在 BufferedReader 内包装 InputStreamReader。
例如:

BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); //用InputStreamReader来构造BufferedReader

InputStreamReader最大的特点是可以指转换的定编码格式,这是其他类所不能的,从构造方法就可看出,这一点在读取中文字符时非常有用

4 BufferesReader

BufferedReader 从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。(通常和InputStreamReader连用,因为输入的数据是字节流,需要InputStreamReader将其转成成字符流)

private static int defaultCharBufferSize = 8192; //文本缓存大小的默认值
public BufferedReader(Reader in) {
   this(in, defaultCharBufferSize);
}
public BufferedReader(Reader in, int sz)
BufferedReader重要API-取自源码:
/**
* Reads a line of text. A line is considered to be terminated by any one
* of a line feed ('\n'), a carriage return ('\r'), or a carriage return
* followed immediately by a linefeed.
*
* @param ignoreLF If true, the next '\n' will be skipped
*
* @return A String containing the contents of the line, not including
* any line-termination characters, or null if the end of the
* stream has been reached
*
* @see java.io.LineNumberReader#readLine()
*
* @exception IOException If an I/O error occurs
*/
String readLine(boolean ignoreLF) throws IOException // 这个是源码上的注释
public String readLine() throws IOException { //这里默认ignoreLF为false
  return readLine(false);
}
public int read(char cbuf[], int off, int len) //以字节的方式把输入的字符放入char数组中 off是起始位置,len是最大读入的字节数。
//The character read, as an integer in the range 0 to 65535 (<tt>0x00-0xffff</tt>), or -1 if the end of the stream has been reached
public int read()

BufferedReader的最大特点就是缓冲区的设置。通常Reader 所作的每个读取请求都会导致对底层字符或字节流进行相应的读取请求,如果没有缓冲,则调用 read() 或 readLine() 都会导致从文件中读取字节,并将其转换为字符后返回,而这是极其低效的。使用BufferedReader可以指定缓冲区的大小,或者可使用默认的大小。大多数情况下,默认值就足够大了。(如果我们是AC题的时候,在内存允许的情况下把缓存区设置为输入的大小为最佳哈!!)

因此,建议用 BufferedReader 包装所有其 read() 操作可能开销很高的 Reader(如 FileReader 和InputStreamReader)
比如:

BufferedReader in= new BufferedReader(new FileReader("foo.in")) //将缓冲指定文件的输入。

5.Scaner和BufferedReader区别

Scanner一个可以使用正则表达式来分析基本类型和字符串的简单文本扫描器。
BufferedReader 从字符输入流中读取文本,缓冲各个字符,从而提供字符、数组和行的高效读取。

  • 1)Scanner 使用分隔符模式将其输入分解为标记,默认情况下该分隔符模式与空白匹配。然后可以使用不同的 next 方法将得到的标记转换为不同类型的值。
  • 2)BufferedReader 可以指定缓冲区的大小,或者可使用默认的大小。大多数情况下,默认值就足够大了,默认大小为8*1024 = 8192。
  • 3)通常,Reader 所作的每个读取请求都会导致对基础字符或字节流进行相应的读取请求。因此,建议用 BufferedReader 包装所有其 read() 操作可能开销很高的 Reader(如 FileReader 和 InputStreamReader)。

6.BufferedReader和InputStreamReader区别

BufferedReader的作用是针对带有换行符的文本内容的按行读取,同时要正确处理各种字符集的文本数据。BufferedReader一般创建时需要一个Reader的参数,由Reader去用流的方式读取数据。而BufferedReader只是解析流数据并组成一行一行的String。"而InputStreamReader是Reader的一个子类 。

InputStreamReader中通过StreamDecoder这个辅助类来完成的。 "An InputStreamReader is a bridge from byte streams to character streams: It reads bytes and decodes them into characters using a specified charset"

posted @   樱花颂  阅读(1590)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示