Java拾贝第十二天——System类

发布时间 2023-10-27 15:04:43作者: ocraft

System类的常量

常量 描述
public final static InputStream in 系统标准输入,一般是键盘
public final static PrintStream out 系统标准输出,一般是显示器
public final static PrintStream err 错误输出

可以看到out和err是PrintStream类型的,而in是InputStream类型

System类中3个常量不符合命名规范是Java历史发展的产物,也叫Java发展遗留问题

System.out

其实下述打印语句就是调用的PrintStream类的方法。

System.out.print();
System.out.println();
System.out.printf();

栗子:

    public static void main(String[] args) {
        PrintStream out = System.out;
        try {
            out.write("hello world!".getBytes());

            out.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

程序运行结果:

hello world!

System.err

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

    public static void main(String[] args) {
      String s="hello";
        try {
            System.out.println(Integer.parseInt(s));
        } catch (NumberFormatException e) {
            System.out.println(e);
            System.err.println(e);//在控制台上输出
        }
    }

程序运行结果:
image

System.in

实际上是键盘的输入流,可以利用System.in完成从键盘读取数据。

栗子:

    public static void main(String[] args) {
        InputStream in = System.in;
        byte[] bytes = new byte[1024];
        try {
            int read = in.read(bytes);//将读取的内容载入bytes并返回内容长度
            System.out.println("键盘输入的内容:"+new String(bytes,0,read));

            in.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

程序运行结果:

asdasd12333333333333 //键盘的输入
键盘输入的内容:asdasd12333333333333

System类重定向输入/输出

在System类常量得知,一般输出标准是显示器,一般输入标准是键盘。

但是通过System类的重定向方法也可也改变System.in的输入源和System.out和System.err的输出位置

System类重定向方法如下:

方法 类型 描述
public static void setIn(InputStream in) 静态方法 重定向标准输入
public static void setOut(PrintStream out) 静态方法 重定向标准输出流
public static void setErr(PrintStream err) 静态方法 重定向错误输出

静态方法即意味着通过类名即可访问其方法。(实际上System的构造方法也是私有的无法实例化)

setIn(InputStream in)

重定向标准输入,从键盘读取更改至文件。
D:\IOtest\text.txt内:

hello
world!12.3true
撒旦静安寺点击
1111111111.99
false

外号:法外狂徒-张三 +年龄:26 +财产:999.990000 +性别:M
外号:法外狂徒-张三 +年龄:26 +财产:999.99 +性别:M

栗子:

    public static void main(String[] args) {
        File file = new File("D:" + File.separator + "IOtest" + File.separator + "text.txt");
        try {
            System.setIn(new FileInputStream(file));//重定向至文件

            InputStream in = System.in;//然后调用System.in的输入流
            byte[] bytes = new byte[1024];
            int read = in.read(bytes);

            System.out.println(new String(bytes,0,read));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

程序运行结果:

hello
world!12.3true
撒旦静安寺点击
1111111111.99
false

外号:法外狂徒-张三 +年龄:26 +财产:999.990000 +性别:M
外号:法外狂徒-张三 +年龄:26 +财产:999.99 +性别:M

setOut(PrintStream out)

重定向标准输出,从输出到屏幕更改至文件。

D:\IOtest\text.txt内:

hello
world!12.3true
撒旦静安寺点击
1111111111.99
false

外号:法外狂徒-张三 +年龄:26 +财产:999.990000 +性别:M
外号:法外狂徒-张三 +年龄:26 +财产:999.99 +性别:M

栗子:

    public static void main(String[] args) {
        File file = new File("D:" + File.separator + "IOtest" + File.separator + "text.txt");
        try {
            System.setOut(new PrintStream(new FileOutputStream(file, true), true));
            System.out.println();//先输出换行符
            System.out.println("asdjiasi 阿斯近代史低价");
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }

程序运行后,D:\IOtest\text.txt内:

hello
world!12.3true
撒旦静安寺点击
1111111111.99
false

外号:法外狂徒-张三 +年龄:26 +财产:999.990000 +性别:M
外号:法外狂徒-张三 +年龄:26 +财产:999.99 +性别:M
asdjiasi 阿斯近代史低价

setErr(PrintStream err)

重定向错误输出,从输出屏幕更改到文件。
栗子:

    public static void main(String[] args) {
        File file = new File("D:" + File.separator + "IOtest" + File.separator + "text.txt");
       String s="hello";
        try {
            System.setErr(new PrintStream(file));
            Integer.parseInt(s);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

D:\IOtest\text.txt内:

java.lang.NumberFormatException: For input string: "hello"
	at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
	at java.lang.Integer.parseInt(Integer.java:580)
	at java.lang.Integer.parseInt(Integer.java:615)
	at moudle2.Test12.main(Test12.java:12)

没追加,直接覆盖