Java 中有三个标准"流", 他们被统称为standard streams
标准输入流
:基于流的输入(stdin),Java中对应的API是System.in
;标准输出流
:基于流的输出(stdout),Java中对应的API是System.out
;标准错误流
:基于流的错误输出(stderr),Java中对应的API是System.err
;
通过上面的描述, 这三者功能如下:
标准输入流
可以让我们在控制台中输入信息,通过输入流
的处理,获取输入的数据, 供程序使用标准输出流
,错误流
, 可以让我们将需要的信息输出到控制台, 可以用于查看程序运行的结果, 或提示信息
接下来就给大家详细分析输出与输出
1. 输出语句
其实,在前面的学习中, 我们已经知道Java
的输出功能了, 就是利用System.out.println()
语句来实现的.
接下来, 我们来分析一下该语句的含义
1.1 System
首先出场的就是System
, System
是一个Java
内置的(自带的) 类.代表一个系统类
至于什么是类, 我们会在面向对象章节讲解. 你暂时可以这么理解, 类就是将功能相关的操作放在一起, 也就是将各种方法放在类里面, 之后就可以通过类来使用这些功能.
而System
是一个系统类, 位于java.lang
包中, 在该类里面具有很多系统界别的属性, 控制方法, 供我们使用
System
类中成员变量和成员方法都是static
, 即静态成员, 因此我们可以直接通过System
类名进行调用.
System
类提供了如下核心功能:
- 标准输入输出:如out、in、err;
- 外部定义的属性和环境变量的访问:如getenv()、setenv()、getProperties()和setProperties();
- 加载文件和类库的方法:如load()和loadLibrary();
- 快速拷贝数组的方法:arraycopy();
- jvm操作:如gc()、runFinalization()、exit();
- 获取系统时间方法:如System.nanoTime 和 System.currentTimeMillis。
这篇文章主要分析的就是标准输入输出: out
, in
,err
1.2 out与err
接下来出场的就是out
和err
, 他们都是System
类的属性, 即静态成员. 因此可以被类直接获取, 即System.out
, System.err
操作
out
表示一种"标准" 的输出流, 其值是java.io.PrintStream
类的引用。
err
表示“标准”的错误输出流,err
输出的信息, 用于显示错误消息,或者用于显示需要引起用户特别注意的信息,在控制台中会显示红色的文字。
示例
public class PrintTest {
public static void main(String[] args) {
System.out.print("out 标准输出");
System.err.print("err 标准输出的错误信息");
}
}
其实out
和err
的用法完全一样,功能也基本相同。
out
和err
的唯一区别就是,out
往往是带缓存功能的,而err
没有缓存功能
1.3 print 和 println
最后出场的成员就是print()
和println()
方法. 这两个方法out
, err
输出流都可以使用
print()
和println()
两个方法都是java.io.PrintStream
类里提供的方法, 他们的作用都是向控制台输出信息。两者的基本作用完全一样
区别在于:
print()
方法不会产生换行println()
会产生换行, 是print line
的缩写. 表示输出并换行
示例:
public class PrintTest {
public static void main(String[] args) {
// 不换行输出
System.out.print("hello ");
System.out.print("world! \n"); // 通过\n 手动换行
// 换行输出
System.out.println("大家好:");
System.out.print("今天天气很不错哦! \n");
// err 错误信息不换行输出
System.err.print("hello ");
System.err.print("world! \n"); // 通过\n 手动换行
// err 错误信息换行输出
System.err.println("大家好:");
System.err.print("今天天气很不错哦!");
}
}
1.4 printf 格式化输出
1.4.1 格式化输出的理解
有时候,计算机默认输出的数据格式,并不一定能够满足我们的阅读需求。
比如有的人想要保留小数点后两位,也有的人想要保留小数点后四位,针对大家不同的输出需求,Java
提供了printf
方法, 用于格式化输出.
printf
和print
, println
在使用上差别不大, 主要区别就是printf
方法第一个参数为输出的模板字符串. 字符串中可以使用格式化,
printf
和print
方法一样不会自动换行输出
1.4.2 占位符
Java
为了实现格式化输出的功能,给我们提供了多种占位符,可以在字符串模板中, 使用各种数据类型“格式化”的占位符。
常用的占位符有如下这些:
占位符 | 说明 |
---|---|
%d | 格式化输出整数 |
%x | 格式化输出十六进制整数 |
%f | 格式化输出浮点数 |
%e | 格式化输出科学计数法表示的浮点数 |
%s | 格式化输出字符串 |
这里我们要注意,在输出语句中,%
表示占位符。有特殊意义, 如果只是向在模板字符串中输出一个普通的%
字符, 需要使用%%
,
如果你想了解更详细的格式化参数,可以参考JDK文档:java.util.Formatter
1.4.3 示例
public class Person {
public static void main(String[] args) {
// 格式化 字符串, 整数, 浮点数
System.out.printf("姓名:%s, 年龄:%d, 成绩:%f \n", "张三", 15, 86.6);
// 格式化: 十六进制整数, 科学计数法浮点数
System.out.printf("字符串模板: 十六进制输出:%x, 科学计数法: %e", 30, 16.8);
}
}
输出结果:
姓名:张三, 年龄:15, 成绩:86.600000
字符串模板: 十六进制输出:1e, 科学计数法: 1.680000e+01
2. 输入语句
2.1 输入语句简介
除了输出流以外, Java
还有一个负责输入的标准流, 对应的API 是System.in
.
与标准输出相比,标准输入则复杂的多。尤其是直接使用System.in
时,虽然可以读取到用户的输入,但该方式特别的复杂,对咱们初学者来说很不友好。
所以为了更方便地实现输入功能, 我们介绍一个简单的类, 即Scanner
类:
2.2 Scanner 类简介
Scanner
类是Java 5
中开始提供的,负责解析基本类型和字符串的简单文本扫描器。通过Scanner
类,我们可以获取用户在控制台里的输入数据。
Scanner类里常用API方法有如下几个:
-
nextInt()
:获取输入的整数; -
nextDouble()
:获取输入的双精度浮点数; -
nextLine()
:获取输入的字符串,包括单词里的空格和除回车以外的所有字符; -
next()
:获取输入的字符串,只从有效字符计算。获取到字符前的空字符都会被自动忽略,之后的空格键,Tab,Enter 键都视做结束符
2.3 使用步骤
使用Scanner
, 需要遵循以下步骤:
导包
: 导入Scanner
类,导包的的知识之后会相信分析, 这里通过import
关键字导包实例化
: 创建Scanner
类的实例对象, 使用new
关键字获取
:使用Scanner
对象的扫描输入的内容释放
: 通过Scanner
对象的close
方法释放资源
需要注意的是:根据相应的方法,来输入指定类型的值。
如果输入的数据类型与要求的类型不匹配时,会报异常 导致程序终止。
2.4 Scanner各种类型输入示例
案例: 小明注册某交友网站,要求录入个人相关信息。如下:
请输入你的网名、你的年龄、你的体重、你是否单身、你的性别等情况。
示例:
// 1. 导入包
import java.util.Scanner;
public class Person {
public static void main(String[] args) {
// 2.创建实例对象, System.in 表示键盘输入
Scanner scanner = new Scanner(System.in);
// 3. 根据提示, 调用不同的方法, 获取不同类型的数据
System.out.println("欢迎进入本交友网站!");
// 获取字符串信息
System.out.println("请输入你的网名:");
String name = scanner.next();
// 获取 int 类型
System.out.println("请输入你的年龄:");
int age = scanner.nextInt();
// 获取 double 类型
System.out.println("请输入你的体重:");
double weight = scanner.nextDouble();
// 获取 boolean 类型
System.out.println("你是否单身(true/false):");
boolean isSingle = scanner.nextBoolean();
// 获取 char 类型
System.out.println("请输入你的性别:");
char gender = scanner.next().charAt(0); // 按照字符串接收,获取第一个字符
// 输出结果:
System.out.println("你的基本情况如下:");
System.out.println("网名:" + name + "; 年龄:" + age + "; 体重:" + weight +
"; 单身:" + isSingle + "; 性别:" + gender);
// 4. 关闭资源
scanner.close();
}
}
运行结果:
欢迎进入本交友网站!
请输入你的网名:
张三
请输入你的年龄:
18
请输入你的体重:
120.5
你是否单身(true/false):
true
请输入你的性别:
男
你的基本情况如下:
网名:张三; 年龄:18; 体重:120.5; 单身:true; 性别:男
3. 结语
至此, 我们就把Java 中的输入和输出语句给大家讲解完毕了, 本节内容并不复杂. 学完之后, 你应该掌握以下知识:
- 理解输入输出流
- 常用的输出方法:
System.out.print
,System.out.println
,System.out.printf
- 输入类
Scanner
中的一些输入方法, 比如next
,nextInt
,nextDouble
等