System对IO支持----System.out/System.in

这篇博客里介绍了打印流PrintSream类,PrintSream类的方法print()和println(),可以联想到系统输出System.out.println(),也及时说系统输出利用了IO流的模式完成。在System类中定义了3个操作的常量。

  • 标准输出(显示器):public final static PrintStream out;
    System.out

  • 错误输出:public final static PrintStream err;
    System.err

  • 标准输入(键盘):public final static InputStream in;
    System.in

系统输出

out和err都是PrintStream对象,而PrintStream是OutputStream子类,所以可以直接用System.out为OutputStream的实例化,这时OutputStream输出的终端变为显示器。

//System对IO的支持
public class Out {
    public static void main(String[] args) throws IOException {
        OutputStream out=System.out;  //System.out是PrintStream对象
        String str="hello pick";
        out.write(str.getBytes());  //会在显示器终端显示
    }
}

out和err都是输出,只是err是错误输出:

////out和err区别
public class Out {
    public static void main(String[] args)  {
        OutputStream out=System.out;  //System.out是PrintStream对象
        File file =new File("Text.txt");
        try {
            InputStream in=new FileInputStream(file);
        } catch (FileNotFoundException e) {
            System.out.println(e);
            System.err.println(e);
        }
    }
}

在这里插入图片描述
有没有发现两者的区别只是颜色不同呢~是的,out输出的是黑色,err输出的是红色。

系统输入
在System类中另一个常量是public final static InputStream in;
System.out是InputStream对象,指的是用户通过键盘进行输入(用户输入)。但是Java本身没有提供直接的用户输入,如果要输入,需要借助java.io来完成完成:

package CODE.JavaIo;


////System对输入的支持:

import java.io.IOException;
import java.io.InputStream;

public class In {
    public static void main(String[] args) throws IOException {
        InputStream in=System.in;
        System.out.println("请输入...");
        byte[] data=new byte[1024];
        int len=in.read(data);
        System.out.println(new String(data,0,len));
        in.close();
    }
}

如果输入长度超过了1024,那么只会读取到1924字节,其余字节数据将会丢弃。那么就需要引入内存操作流,将数据保存在内存流中一次取出。

public class In {
    public static void main(String[] args) throws IOException {
        System.out.println("请输入...");
        InputStream in=System.in;  //标准输入
        ByteArrayOutputStream out =new ByteArrayOutputStream(); //内存字节输出流
        byte data[]=new byte[10];
        int len=0;
        while((len=in.read(data))!=-1)
        {
            out.write(data,0,len); //将data里数写入内存保存
            //需要判断用户输入完毕
            if (len < data.length) 
                break ;
        }
        System.out.println(new String(out.toByteArray()));
        in.close();
        out.close();
    }
}

可以看出这种输入方式十分复杂,如果在IO中需要进行中文处理,最好的做法是将所有输入的数据保存在一起再处理,这样才可以保证不出现乱码。
2种输入流

1.BufferedReader类:
BufferedReader是一个字符缓冲输入流。当然还有字节缓冲流(BufferedInputStream)。BufferedReader有一个优点可以 读取一行数据:

//以回车为换行符
String readLine() throws IOException;

这种输入流在JDK1.5被java.util.Scanner取代。

2.java.util.Scanner类:
打印流解决的是OutputStream类的缺陷,BufferedReader解决的是InputStream类的缺陷。而Scanner解决的是
BufferedReader类的缺陷(替换了BufferedReader类)
在Scanner类有以下方法

  • 判断是否有指定类型数据:public boolean hasNextXxx();
  • . 取得指定类型的数据: public 数据类型 nextXxx();
  • 定义分隔符:public Scanner useDelimiter(Pattern pattern)
  • 构造方法:public Scanner(InputStream source)
////Scanner类的输入
import java.io.*;
import java.util.Scanner;
public class In {
    public static void main(String[] args) throws IOException {
        Scanner scanner=new Scanner(System.in);  //标准输入
        System.out.println("请输入...");
        if(scanner.hasNext()) //输入内容不为空
        {
            System.out.println("输入内容:"+scanner.next());
        }
        scanner.close();
    }
}

使用Scanner还可以接收各种数据类型,并且帮助用户减少转型处理:

////Scanner类接受指定类型
import java.io.*;
import java.util.Scanner;
public class In {
    public static void main(String[] args) throws IOException {
        Scanner scanner=new Scanner(System.in);  //标准输入
        System.out.println("请输入...");
        if(scanner.hasNextDouble()) //有输入,并且输入的数据是double
        {
            System.out.println("输入double型数据:"+scanner.nextDouble());
        }
        scanner.close();
    }
}

Scanner可以对接收的数据类型使用正则表达式判断:

////正则表达式
import java.io.*;
import java.util.Scanner;
public class In {
    public static void main(String[] args) throws IOException {
        Scanner scanner=new Scanner(System.in);  //标准输入
        System.out.println("请输入...");
        if(scanner.hasNext("\\d{4}-\\d{2}-\\d{2}")) //有输入,并且输入的数据是double
        {
            String birthday=scanner.next();
            System.out.println("输入的生日为:"+birthday);
        }
        else
        {
            System.out.println("输入生日格式错误");
        }
        scanner.close();
    }
}

在这里插入图片描述

由于Scanner类的构造方法:public Scanner(InputStream source),接受的是InputStream对象,也及时可以接收任意输入流,如:文件输入流。

//Scanner接受文件输入流
public class In {
    public static void main(String[] args) throws IOException {
        File file=new File("C:"+File.separator+"Users"+File.separator+
                "lenovo"+File.separator+"Desktop"+
                File.separator+"Test.txt");
        InputStream in=new FileInputStream(file);
        Scanner scanner=new Scanner(file);  //接受文件输入流
        scanner.useDelimiter("\n");//按照"\n"分隔
        while(scanner.hasNext())
        {
            System.out.println(scanner.next());
        }
        in.close();
        scanner.close();
    }
}

在这里插入图片描述
总结:输出用打印流,输入用Scanner。

猜你喜欢

转载自blog.csdn.net/sophia__yu/article/details/84874842