[Java IO]04_系统标准IO

System表示系统类,它有3个与 Java IO 有关的常量。

  • System.out——系统标准输出
  • System.in——系统标准输入
  • System.err——错误信息输出  

System.out

System.outPrintStream 的对象,在 PrintStream 中定义了一些了的 print()println() 方法。

所以,常见的 System.out.print()System.out.println() 语句调用的实际上是 PrintStream 类的方法。

例 使用 OutputStream 向屏幕上输出

import java.io.OutputStream;
 import java.io.IOException;
 
 public class SystemDemo01 {
 public static void main(String args[]) {
              OutputStream out = System.out; // 此时的输出流是向屏幕上输出
  try {
                  out.write("hello world!!!".getBytes()); // 向屏幕上输出
         } catch (IOException e) {
                  e.printStackTrace(); // 打印异常
         }
 try {
                  out.close(); // 关闭输出流
         } catch (IOException e) {
                  e.printStackTrace();
              }
          }
      };

System.in

System.inInputStream 类型的对象,可以利用它完成从键盘读取数据的功能。

例 从键盘读取数据

import java.io.InputStream;

public class SystemInDemo {
 public static void main(String args[]) throws Exception {
        InputStream input = System.in;
 
 byte b[] = new byte[5]; // 开辟空间,接收数据
        System.out.print("请输入内容:");
 
 int len = input.read(b); // 接收数据
        System.out.println("输入的内容为:" + new String(b, 0, len));
 
        input.close(); // 关闭输入流
    }
};

运行结果

请输入内容:Good Bye
输入的内容为:Good

上述结果中,输入内容并没有被完整打印出来。

这是因为代码中限制了存储数据的 byte 数组的大小。

如果不知道要输入的数据的实际长度,如何处理呢?

不指定大小,从键盘读取数据

import java.io.InputStream;

public class SystemInDemo2 {
 public static void main(String args[]) throws Exception { // 所有异常抛出
        InputStream input = System.in; // 从键盘接收数据

        StringBuffer buf = new StringBuffer(); // 使用StringBuffer接收数据
        System.out.print("请输入内容:");

 int temp = 0;
 while ((temp = input.read()) != -1) { // 接收内容
 char c = (char) temp;
 if (c == '\n') { // 退出循环,输入回车表示输入完成
 break;
            }
            buf.append(c); // 保存内容
        }
        System.out.println("输入的内容为:" + buf);

        input.close(); // 关闭输入流
    }
};

运行结果

请输入内容:To be or not to be, that's a question.
输入的内容为:To be or not to be, that's a question.

但是,如果输入的是中文,则会出现乱码,如下:

请输入内容:计算机软件
输入的内容为:?????ú?í??

这是因为汉字一个字符占两个字节,而数据却一个一个字节的方式读进来的,所以造成了乱码。

最好的输入方式是将全部输入数据暂时存放在一块内存中,然后一次性从内存中读取出数据。

这样,既不会造成乱码,也不受长度限制。要完成这样的操作可以使用 BufferedReader 类去完成。

System.err

System.err 表示的是错误信息输出,如果程序出现错误,则可以直接使用 System.err 进行输出。

例 打印错误信息

public class SystemErrDemo {
 public static void main(String args[]) {
        String str = null;
 try {
            System.out.println(Integer.parseInt(str)); // 转型
        } catch (Exception e) {
            System.err.println(e);
        }
    }
};

运行结果

java.lang.NumberFormatException: null

IO 重定向

System 类可以改变 System.in 的输入流来源以及 System.outSystem.err 两个输出流的输出位置。

import java.io.*;

public class RedirectDemo {
 public static void main(String[] args) throws IOException {
        PrintStream console = System.out;
        BufferedInputStream in = new BufferedInputStream(new FileInputStream("d:\\in.txt")); // 绑定输入文件
        PrintStream out = new PrintStream(new BufferedOutputStream(new FileOutputStream("d:\\out.txt"))); // 绑定输出文件

 // 设置重定向
        System.setIn(in);
        System.setOut(out);
        System.setErr(out);

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String s;
 while ((s = br.readLine()) != null) {
            System.out.println(s);
            out.close();
            System.setOut(console);
        }
    }
}

需要注意的是,I/O重定向操纵的是字节流,而不是字符流。

参考资料

Java 编程思想

Java 开发实战经典

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏微信公众号:Java团长

Java字节流与字符流的区别

字节流与和字符流的使用非常相似,两者除了操作代码上的不同之外,是否还有其他的不同呢? 实际上字节流在操作时本身不会用到缓冲区(内存),是文件本身直接操作的,而...

531
来自专栏LanceToBigData

JavaWeb(四)EL表达式

前言   前面详细的说明了什么是JSP和它的一些元素,这篇给大家介绍一下的是EL表达式。 用EL表达式,能更好的使用JSP中的各种内置对象和作用域。   楼主...

2477
来自专栏技术与生活

自定义类加载器和动态加载 Java 代码

有时候,我们需要 java 像脚本一样的运行,甚至是希望我们的代码是热部署,一旦代码文件发生变动就重新加载这个代码,能实现吗?今天就来试着解决下。

1033
来自专栏Java帮帮-微信公众号-技术文章全总结

第二十三天 IO-打印流&序列化流&Properties&CommonsIO&流总结【悟空教程】

第二十三天 IO-打印流&序列化流&Properties&CommonsIO&流总结【悟空教程】

982
来自专栏Java 源码分析

jsp指令和EL表达式

1.page指令 1.pageEncoding 指定jsp的编码 2.contextType 设置响应头 这两个东西其实使用任意一个即可。 3.errorPag...

2866
来自专栏noteless

[五] JavaIO之InputStream OutputStream简介 方法列表说明

1182
来自专栏Java学习网

java原理之Java 解析 Class 文件过程学习

java之所以能够实现跨平台,便在于其编译阶段不是将代码直接编译为平台相关的机器语言,而是先编译成二进制形式的java字节码,放在Class文件之中,虚拟机再加...

812
来自专栏郭耀华‘s Blog

全面掌握IO(输入/输出流)

File类: 程序中操作文件和目录都可以使用File类来完成即不管是文件还是目录都是使用File类来操作的,File能新建,删除,重命名文件和目录,但File不...

36015
来自专栏Golang语言社区

golang 如何验证struct字段的数据格式

假设我们有如下结构体: type User struct { Id int Name string Bio str...

5005
来自专栏Java帮帮-微信公众号-技术文章全总结

【选择题】Java基础测试九(16道)

【选择题】Java基础测试九(16道) 117.下列说法正确的有() A. class中的constructor不可省略 B. constructo...

3597

扫码关注云+社区