一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第7天,点击查看活动详情。
上一篇Java 输入输出相关概念介绍与总结(File、IO 流)(六)文章介绍的是OutputStream 抽象类在日常开发中最常使用的几个方法,本篇文章将介绍在开发中常用的几个实现类的具体使用。
ByteArrayOutputStream
之前我们有介绍过,这个类是输出流的一个实现类,它本身的含义就是这个类的中文翻译:字节·数组·输出·流。
它的实际作用就是将数据写入到这个输出流中,然后数据会被缓存到一个byte 数组中。这个byte 数组本身是作为一个“缓冲区”,会随着写入的数据的不断增加而自动增长,不用用户关心。
这个类有两个构造函数:
public ByteArrayOutputStream()
public ByteArrayOutputStream(int size)
复制代码
在创建字节数组输出流的实例的时候,其中用来缓存的byte 数组默认的大小为32(第一个构造函数),如果要修改数组大小,可以使用第二个构造函数,传入参数,决定缓存数组的大小。
在创建完成字节数组输出流之后,可以调用write 方法将数据写入,write 方法一个有三个不同类型,可以参考上一篇文章。
这里直接举个例子,以便直观体会ByteArrayOutputStream 的使用。
public static void main(String[] args) throws IOException {
// 数据来源
FileInputStream fileInputStream = null;
// 字节数组输出流
ByteArrayOutputStream byteArrayOutputStream;
try {
fileInputStream = new FileInputStream("abc/def/ghi.txt");
byteArrayOutputStream = new ByteArrayOutputStream();
int tempResult;
while ((tempResult = fileInputStream.read()) != -1) {
// 从输入流中读取到的数据依次写入到输出流中
byteArrayOutputStream.write(tempResult);
}
byte[] result = byteArrayOutputStream.toByteArray();
// 输入utf-8 字符集,将缓冲区的内容转换为字符串
System.out.println(new String(result, "utf-8"));
// 或者直接调用toString() 方法
System.out.println(byteArrayOutputStream.toString("utf-8");
fileInputStream.close();
} catch (Exception e) {
} finally {
fileInputStream.close();
}
}
复制代码
总结来说使用ByteArrayOutputStream 就是在内存中创建了一个byte 数组,将所有发送到输出流的数据都保存到这个字节数组中,也可以认为这就是一个缓冲区。数据写入缓冲区之后,可以调用toByteArray() 或者toString() 进行输出。
在使用toString() 方法的时候,我们可以指定输出字符串的字符集。使用指定的字符集(参数:charsetName)去解码字节,然后将缓冲区的内容转换为字符串。 新String的长度是转换完成的字符集的长度,所以有可能不等于字节数组的长度。
FileOutputStream
FileOutputStream 是文件字节输出流,这个类的作用是把内存中的数据写入到硬盘的文件中。
对于FileOutputStream 类,它有五个构造函数。
public FileOutputStream(String name)
public FileOutputStream(File file)
public FileOutputStream(File file,boolean append)
public FileOutputStream(String name,boolean append)
public FileOutputStream(FileDescriptor fdObj)
复制代码
这五个构造函数的含义一看便知,其中只有一个参数需要我们注意一下,那就是那个append
参数。
这个参数默认是false,如果为false,那么新写入的内容会覆盖原有的文件内容;如果是true,那么新数据会附加到原有的数据后面。
总结
这两个子类是OutputStream
抽象类的两个常用实现类。我们日常开发中使用的最多的也就是这两个。
在之后的文章会大概介绍一下OutputStream
的几个不常用的实现类,如果用不到或者不了解,可以选择跳过下一篇文章。