JavaIO——标准输入输出流

System.in, System.out, System.err是常见的数据来源与数据流目的地,使用最多的应该是使用其中的System.out将输出打印到控制台上。

JVM在启动时会初始化这三个流,所以你不需要初始化它们,尽管你可以在运行时替换掉它们。

System.in

System.in是一个连接控制台程序和键盘输入的InputStream流,可以读取用户从键盘输入的数据。

有以下三种常用方法读取控制台的输入,分别是System.in.read()、BufferedReader包装System.in、Scanner。

方法一,直接使用System.in.read()

// 缺点:只能读一个字节的内容
char ch = (char)System.in.read();
System.out.println(ch);

方法二,BufferedReader包装System.in

// InputStreamReader可以将字节流转换为字符流
Reader reader = new InputStreamReader(System.in);
// BufferedReader带有缓存功能,可以一次读一行
BufferedReader bufferedReader = new BufferedReader(reader);
String str = bufferedReader.readLine();
System.out.println(str);

方法三,使用Scanner

Scanner scanner = new Scanner(System.in);
String next = scanner.next();
System.out.println(next);

上述代码可以将控制台输入正确获取并输出,但是有一个缺点,next()只能获取到空格前的字符串,空格后的字符串自动忽略。若想要连空格也作为字符串的一部分获取,需要使用nextLine()方法。

System.out与System.err

System.out是一个PrintStream流。System.out一般会把你写到其中的数据输出到控制台上。System.out通常仅用在类似命令行工具的控制台程序上。

System.err是一个PrintStream流。System.err与System.out的运行方式类似,但它更多的是用于打印错误文本。在IDEA中,为了让错误信息更加显眼,错误信息以红色文本的形式通过System.err输出到控制台上。

替换系统流

尽管System.in, System.out, System.err这3个流是java.lang.System类中的静态成员,并且已经预先在JVM启动的时候初始化完成,你依然可以更改它们。只需要把一个新的InputStream设置给System.in,或者一个新的PrintStream设置给System.out或者System.err,之后的数据都将会在新的流中进行读取、写入。

使用System.setIn(), System.setOut(), System.setErr()方法设置新的系统流。

// 将系统输入流改为本地文件
InputStream inputStream = new FileInputStream("D:\\test\\systemIn.txt");
System.setIn(inputStream);
InputStreamReader inputStreamReader = new InputStreamReader(System.in);
int data = inputStreamReader.read();
while (data != -1) {
    char ch = (char) data;
    System.out.print(ch);
    data = inputStreamReader.read();
}
inputStream.close();

// 将系统输出流改为本地文件,输出流中的信息都会输出到systemOut.txt中
OutputStream outputStream = new FileOutputStream("D:\\test\\systemOut.txt");
PrintStream printStream = new PrintStream(outputStream);
System.setOut(printStream);
System.out.println("out11");
// 调用flush(),将缓存区的数据冲刷到磁盘文件中
outputStream.flush();
outputStream.close();

// 将系统错误流改为本地文件,错误流中的信息都会输出到systemErr.txt中
OutputStream outputStream01 = new FileOutputStream("D:\\test\\systemErr.txt");
PrintStream printStream01 = new PrintStream(outputStream01);
System.setErr(printStream01);
System.err.println("err11");
// 调用flush(),将缓存区的数据冲刷到磁盘文件中
outputStream01.flush();
outputStream01.close();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值