内存操作流
文件流的操作是对文件进行操作,除了文件,IO也可以对内存进行操作,这种流称之为内存流
内存流分为两类:
- 字节内存流:ByteArrayInputStream、ByteArrayOutputStream
- 字符内存流:CharArrayReader、CharArrayWriter
看一下ByteArrayInputStream、ByteArrayOutputStream的构造方法
public ByteArrayInputStream(byte buf[])
public ByteArrayOutputStream()
内存流的继承关系
打印流
打印流解决了OutputStream的缺陷,若操作的不是二进制数据,只是想要通过程序输出信息的话,OutputStream不方便,缺点
- 所有数据都必须转换为字节数组
- 若输出的是int,double类型就不方便
本质是对OutputStream的功能做了封装,Java提供的专门的打印流处理类:字节打印流PrintStream,字符打印流PrintWrite
由上图的继承关系我们会发现,有点像代理设计模式
代理设计模式的特点:
- 代理是以接口为使用原则的设计模式
- 最终用户调用的方法一定是接口定义的方法
打印流属于装饰设计模式
格式化输出
就是在输出的时候使用一些占位符:
printUtil.printf("姓名:%s,年龄:%d,工资:%1.2f", name,age,salary) ;
同时在String类中也追加有一个格式化字符串方法。
public static String format(String format, Object... args)
System类对IO的支持
在System类中定义了三个操作的常量
- 标准输出(显示器) : public final static PrintStream out
- 错误输出 : public final static PrintStream err
- 标准输入(键盘):public final static InputStream in
系统输出
系统输出一共有两个常量:out、err,并且这两个常量表示的都是PrintStream类的对象。
- out输出的是希望用户能看到的内容
- err输出的是不希望用户看到的内容
由于System.out是PrintStream的实例化对象,而PrintStream又是OutputStream的子类,所以可以直接使用System.out直接为OutputStream实例化,这个时候的OutputStream输出的位置将变为屏幕。
系统输入
System.in对应的类型是InputStream
两种输入流
1.BufferedReader
BufferedReader可以读取一行数据
String readLine() throws IOException
2.java.util.Scanner
打印流解决的是OutputStream类的缺陷,BufferedReader解决的是InputStream类的缺陷。而Scanner解决的是BufferedReader类的缺陷(替换了BufferedReader类)
在这个类中主要有以下方法:
- 判断是否有指定类型数据: public boolean hasNextXxx()
- 取得指定类型的数据: public 数据类型 nextXxx()
- 定义分隔符:public Scanner useDelimiter(Pattern pattern)
- 构造方法:public Scanner(InputStream source)