关键词搜索

源码搜索 ×
×

(Java)System 类对 IO 的支持

发布2020-02-09浏览409次

详情内容

System 类的常量:
在这里插入图片描述
这三个量在 IO 操作中有着非常大的作用

一、System.out

System.out 是 PrintStream 的对象,在 PrintStream 中定义了一系列的 print() 和 println() 方法,所以经常使用的System.out.print()System.out.println() 语句调用的实际上就是 PrintStream 类的方法。

既然此对象表示的是向显示器上输出,而 PrintStream 又是 OutputStream 的子类,所以可以直接利用此对象向屏幕上输出信息。

import java.io.OutputStream;

public class Root{
    public static void main(String[] args) throws Exception{
        OutputStream out = System.out;//此时的输出流是向屏幕上输出
        out.write("hello world !!!".getBytes());//向屏幕上输出
        out.close();
    }
}

    在这里插入图片描述
    以上信息是直接使用 OutputStream 向屏幕上进行输出的,即 OutputStream 的哪个子类为其实例化,就具备了向哪里输出的能力。
    如果是使用了 FileOutputStream 则表示向文件输出,如果使用了 System.out 则表示向显示器输出,显示了Java 的多态性好处,即根据子类的不同功能完成的功能也不同

    二、System.err

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

    public class Root{
        public static void main(String[] args){
            String str = "hello";
            try {
                System.out.println(Integer.parseInt(str));
            }catch (Exception e){
                System.err.println(e);
            }
        }
    }
    
      10

    虽然最后这里的 System.err.println(e);效果类似于System.out.println(e);也就是两者都可以输出错误信息,但是System.out 是将信息显示给用户看,是正常的信息显示,而System.err 则正好相反,是不希望用户看到的,会直接在后台打印,是专门显示错误的
    在这里插入图片描述
    所以一般来讲要输出错误信息,直接使用 System.err

    三、System.in

    System.in 实际上是一个键盘的输入流,其本身是 InputStream 类型的对象。

    import java.io.InputStream;
    
    public class Root{
        public static void main(String[] args) throws Exception{
            InputStream input = System.in;//从键盘接收数据
            byte b[] = new byte[1024];
            System.out.print("请输入内容: ");
            int len = input.read(b);//接收数据
            System.out.println("输入的内容为:" + new String(b,0,len));
        }
    }
    
      10
    • 11

    在这里插入图片描述
    本程序存在两个问题:

    (1)指定了输入数据的长度,如果现在输入的数据超出了其长度范围,则只能输入部分数据
    不指定数组长度也不行因为汉字是分两次读取的,不能一个字节一个字节的读取
    (2)==如果指定的 byte 数组长度是奇数,则还有可能出现中文乱码,因为一个中文等于两个字节

    所以最好的输入方式是将全部输入的数据暂时放到一块内存中,然后一次性从内存中读取出数据
    在这里插入图片描述
    这样所有的数据只读了一次,不会造成乱码,也不会受长度的限制。这需要借助 BufferedReader 类完成具体参考键盘输入的标准格式

    三、输入/输出重定向

    通过 System 类也可以改变 System.in 的输入流来源以及 System.out 和 System.err 两个输出流的输出位置。
    System 类提供的重定向方法:
    在这里插入图片描述

    1. 为 System.out 重定向

    所谓的重定向,就是为输出重新指向输出的位置

    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.OutputStream;
    import java.io.PrintStream;
    
    public class Root{
        public static void main(String[] args) throws Exception{
            File f = new File("D:" + File.separator + "test.txt");
            OutputStream out = new FileOutputStream(f);
            PrintStream ps = new PrintStream(out);
            System.setOut(ps);//System.out 输出重定向
            System.out.print("Java");//输出时,不再向屏幕上输出
            System.out.println(",Python");//而是向指定的重定向位置输出
        }
    }
    
      10
    • 11
    • 12
    • 13
    • 14
    • 15

    2. 为用户保存错误信息

    import java.io.*;
    
    public class Test{
        public static void main(String[] args) {
            String str = "hello";
            try {
                System.out.println(Integer.parseInt(str));
            }catch (Exception e){
                try {
                    File f = new File("D:" + File.separator + "test.txt");
                    OutputStream out = new FileOutputStream(f);
                    PrintStream ps = new PrintStream(out);
                    System.setOut(ps);
                }catch (FileNotFoundException e1){
                    e1.printStackTrace();
                }
                System.out.println(e);//输出错误,保存到文件中
            }
        }
    }
    
      10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    在这里插入图片描述

    3. 为 System.err 输出重定向

    import java.io.ByteArrayOutputStream;
    import java.io.PrintStream;
    
    public class Root{
        public static void main(String[] args) throws Exception{
            ByteArrayOutputStream bos = null;//定义内存输出流
            bos = new ByteArrayOutputStream();//实例化内存输出流
            System.setErr(new PrintStream(bos));//System.err 输出重定向
            System.err.print("Java");//输出错误时不再向屏幕输出
            System.err.println(",Python");//而是向内存的位置输出
            System.out.println(bos);
        }
    }
    
      10
    • 11
    • 12
    • 13

    此处操作将输出定位到内存输出流中,所以此时使用 System.err 完成的各个输出操作结果都是保存在内存中。

    setOut() 方法只负责System.out 的输出重定向,而 setErr() 只负责 System.err 的输出重定向,两者不可混用

    4. 设置 System.in 的输入重定向

    import java.io.File;
    import java.io.FileInputStream;
    import java.io.InputStream;
    
    public class Root{
        public static void main(String[] args) throws Exception{
            File f = new File("D:" + File.separator + "test.txt");
            InputStream in = new  FileInputStream(f);
            System.setIn(in);//设置输入重定向
            InputStream input = System.in;//从文件中接收数据
            byte b[] = new byte[1024];//开辟空间接收数据
            int len = input.read(b);//接收数据
            System.out.println("输入的内容为:" + new String(b,0,len));
            input.close();
    
        }
    }
    
      10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    代码中修改了 System.in 的输入位置,而将其输入重定向到从文件中读取,所以读取时会将文件中的内容读取出来。

    相关技术文章

    点击QQ咨询
    开通会员
    返回顶部
    ×
    微信扫码支付
    微信扫码支付
    确定支付下载
    请使用微信描二维码支付
    ×

    提示信息

    ×

    选择支付方式

    • 微信支付
    • 支付宝付款
    确定支付下载