这篇博客里介绍了打印流PrintSream类:
https://blog.csdn.net/sophia__yu/article/details/84824537
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。