一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第9天,点击查看活动详情。
上一篇文章Java 输入输出相关概念介绍(File、IO 流)(八)
介绍了OutputStream 的两个实现类BufferedOutputStream 和ObjectOutputStream;
再上一篇文章Java 输入输出相关概念介绍与总结(File、IO 流)(七) 介绍了ByteArrayOutputStream 和 FileOutputStream,一共四个实现类。这篇文章会讲解OutputStream 的几个不常用的子类。
FilterOutputStream
它的构造方法如下
public FilterOutputStream(OutputStream out)
对于这个类的介绍,首先附上一张前几篇文章讲过的图。
从图中我们可以发现,FilterOutputStream 是BufferedOutputStream/DataOutputStream/PrintStream 的父类。BufferedOutputStream 在上一篇文章中有讲过,这里我们讲剩下的这几个类。
其实FilterOutputStream 就是需要将一些其他OutputStream 作为参数传入,对其进行包装。
FilterOutputStream 的含义是“过滤输出流”,是所有过滤输出流的父类,它是OutputStream 的子类,继承了OutputStream 大部分方法。
之前我们也介绍过,OutputStream 框架整体应用了装饰模式,FilterOutputStream 其实就是装饰基类(OutputStream)的各个子类,如FileOutputStream,将这些已存在的输出流作为其基本数据接收器。在写入时会将这些类型的数据转换为其对应的二进制字节,从而直接传输数据或提供一些额外的功能。
正常我们在使用的时候都不会直接使用FilterOutputStream,而是使用对应的三个子类。
BufferedOutputStream 在上一篇文章已经讲过了,这里继续讲解DataOutputStream 和PrintStream。
DataOutputStream
构造方法如下:
public DataOutputStream(OutputStream out)
它的作用是装饰其他输出流,将指定的字节写入此字节数组输出流。允许应用程序以与机器无关方式,将Java 基本数据类型(boolean,byte,int,long,string等)写到底层输出流。比如说写入boolean,char 字节,或者说utf-8 字符串等等。
几个写入方法如下:
public final void writeInt(int v)
public final void writeLong(long v)
public final void writeFloat(float v)
public final void writeDouble(double v)
public final void writeShort(int v)
public final void writeBoolean(boolean v)
public final void writeByte(int v)
public final void writeChar(int v)
public final void writeBytes(String s)
public final void writeChars(String s)
public final void writeUTF(String str)
这个其实就是固定了输出的数据的Java 数据类型,读入的时候常常和DataInputStream 进行配合,完成数据的存储 & 读入。
示例代码:
public static void main(String args[]) throws Exception { // 所有异常抛出
DataOutputStream dos = null; // 数据输出流对象
File file = new File("abc/def/ghi.txt"); // 文件的保存路径
dos = new DataOutputStream(new FileOutputStream(file)); // 实例化数据输出流对象
String goodsName[] = {"商品名称1", "商品名称2", "商品名称3"};
float prices[] = {1f, 2f, 3f}; // 商品价格
int nums[] = {3, 2, 1}; // 商品数量
for (int i = 0; i < goodsName.length; i++) { // 循环输出
dos.writeChars(goodsName[i]); // 写入字符串
dos.writeChar('\t'); // 写入分隔符
dos.writeFloat(prices[i]); // 写入价格
dos.writeChar('\t'); // 写入分隔符
dos.writeInt(nums[i]); // 写入数量
dos.writeChar('\n'); // 换行
}
dos.close(); // 关闭输出流
}
PrintStream
PrintStream 本身的含义是“打印流”。
构造方法:
public PrintStream(OutputStream out)
public PrintStream(OutputStream out,boolean autoFlush)
public PrintStream(OutputStream out,boolean autoFlush,String encoding)
public PrintStream(String fileName)
public PrintStream(String fileName,String csn)
public PrintStream(File file)
public PrintStream(File file,String csn)
传参和其他类差不多,区别是有几个不同的参数,如autoFlush/encoding/csn。
上述构造函数中的参数的含义分别为:
- out:要将值和对象打印到的输出流,如
FileOutputStream。 - autoFlush:默认为false;如果设置为true,那么在调用print 方法或者写入了换行符时,缓冲区内的数据都会被写入目标位置。
- csn:支持的字符集。
我们创建PrintStream 对象时可以传不同的outputStream 对象给它,让它输出到其它地方,例如:传一个FileOutputStream 到PrintStream 的对象中(通过构造函数),那么这个PrintStream 对象就会打印输出到文件上面.
PrintStream 相比于其他类,最明显的特征就是多了两个函数:print() 和println(),作用也都是打印数据。print和printin底层都是调用了write方法,所以功能基本上都差不多。
代码示例:
public static void main(String args[]) throws Exception {
FileOutputStream fileOutputStream = new FileOutputStream("copy.txt");
PrintStream printStream = new PrintStream(fileOutputStream);
printStream.write("1234".getBytes(StandardCharsets.UTF_8));
printStream.println();
fileOutputStream.close();
printStream.close();
}
这样在项目根目录copy.txt 中就会多出内容“1234”。
总结
至此,OutputStream 类及其子类的讲解就介绍到这里。
接下来我们会继续分析IO 流相关的Reader 和Writer 的基本概念及相关使用方法。