1.System类对I/O的支持
系统输出System.out.println
是利用了I/O流的模式完成的。实际是打印流PrintStream
对象
System
类中定义了三个操作的常量
1.标准/系统输出(显示器)
public final static PrintStream out
2.标准错误输出,也是打印流对象,除了颜色是红色外与System.out
别无二致
public final static PrintStream err
3.标准输入(键盘)是 InputStream
对象,没有任何包装
public final static InputStream in
2.两种输入流
由于JDK 1.0提供的System
.in 太难用
JDK1.1之后扩展了BufferedReader
类 JDK 1.5之后提供了java.util
.Scanner类
2.1BufferedReader
类
BufferedReader
类属于一个缓冲输入流,而且是一个字符流的操作对象。在Java中对于缓冲区流也分为两类:字节缓冲流(BufferedInputStream
)、字符缓冲流(BufferedReader
)
BufferedReader
类的定义和构造方法
public class BufferReader extends Reader//定义
public BufferedReader(Reader in)//构造方法
BufferedReader
类提供如下方法 可以直接读取一行数据(以回车为换行符)
String readLine() throws IOException
代码示例
package JAVASE.io;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
/**
* @Name:练习BufferedReader系统输入类
* @Author:ZYJ
* @Date:2019-05-19-20:18
* @Description:
*/
public class BufferedReaderTest {
public static void main(String[] args) throws IOException {
BufferedReader buf = new BufferedReader(new InputStreamReader(System.in));
System.out.println("请输入信息:");
String str = buf.readLine();//默认回车换行
System.out.println("输入信息为:"+str);
}
}
2.2 java.util
.Scanner 类
打印流解决的是OutputStream
类的缺陷,BufferedReader
解决的是InputStream
类的缺陷。而Scanner解决的是BufferedReader
类的缺陷,
Scanner
是一个专门进行输入流处理的程序类,利用这个类可以方便的处理各种数据类型,同时也可以结合正则表达式进行各项处理。
2.2.1 方法
1.判断是否含有指定数据
public boolean hasNextXxx()//各种数据类型
2.取得指定的数据类型
public 数据类型 nextXxx()
3.定义分隔符
public Scnner useDelimiter(Pattern pattern)
4.构造方法
public Scnner(InputStream source)
代码示例 :使用Scanner类实现数据输入
package JAVASE.IOtext;
import java.util.Scanner;
/**
* @Name:Scnner 类的练习
* @Author:ZYJ
* @Date:2019-05-22-10:43
* @Description:实现从程序向文件写入内容
*/
public class ScannerTest {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入数据:");
//输入内容判空操作
if (scanner.hasNext()) {
//取得指定的输入流
System.out.println("输入的内容为" + scanner.next());
}
//关闭流
scanner.close();
}
}
//默认以\n结束
代码示例:使用Scanner类接收其他数据类型数据
package JAVASE.IOtext;
import java.util.Scanner;
/**
* @Name:Scanner 与任意类型的转换
* @Author:ZYJ
* @Date:2019-05-22-11:32
* @Description:
*/
public class ScannerPrint {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入年龄");
if(scanner.hasNext()){
int age = scanner.nextInt();
System.out.println("年龄为:"+age+"岁");
}else{
System.out.println("输入内容非法");
}
scanner.close();
}
}
2.2.2 Scanner类与正则表达式
**正则表达式:**是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。
给定一个正则表达式和另一个字符串,我们可以达到如下的目的:
- 给定的字符串是否符合正则表达式的过滤逻辑(称作“匹配”):
- 可以通过正则表达式,从字符串中获取我们想要的特定部分。
Scanner 类可以对接受的数据类型使用正则表达式判断
代码示例:利用正则表达式进行判断
package JAVASE.IOtext;
import java.util.Scanner;
/**
* @Name:Scanner类练习
* @Author:ZYJ
* @Date:2019-05-22-11:22
* @Description: 利用正则表达式进行判断
*/
public class TestPrint {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入生日:");
if(scanner.hasNext("\\d{4}-\\d{2}-\\d{2}")){
//取得指定输入流,并将其转化为字符串
String birthday = scanner.next();
System.out.println("输入的生日为:"+birthday);
}else{
System.out.println("输入格式非法,不是生日!!!");
}
//关闭流
scanner.close();
}
}
2.2.3 Scanner 操作文件
Scanner类可以接收 InputStream
对象,也就意味着Scanner类可以接收任意数据类型。
package JAVASE.IOtext;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.util.Scanner;
/**
* @Name: 使用Scanner类操作 文件
* @Author:ZYJ
* @Date:2019-05-22-16:06
* @Description: 熟悉Scanner类的 hasNext() nex
*/
public class ScannerFileTest {
public static void main(String[] args) throws FileNotFoundException {
//取得操作文件
File file = new File("C:\\Users\\ZYJ\\Desktop\\javaIO\\ioTest\\hello.txt");
//获取输入流
InputStream in = new FileInputStream(file);
//实例化Scanner类
Scanner scanner = new Scanner(in);
//自定义分隔符
scanner.useDelimiter("\n");
while (scanner.hasNext()){
System.out.println(scanner.next());
}
//关闭流
scanner.close();
}
}