「这是我参与2022首次更文挑战的第2天,活动详情查看:2022首次更文挑战」。
前言
大家好,我是程序猿小白 gw_Gw,很高兴能和大家一起学习进步。
以下内容部分来自于网络,如有侵权,请联系我删除,本文仅用于学习交流,不用作任何商业用途。
摘要
本文主要介绍FileOutputStream字节输出流的基本概念和使用。
欢迎点击传送门了解更多IO流。
1. FileOutputStream使用字节流写入文件
1.1 什么是FileOutputStream
FileOutputStream是java.io包下的OutputStream的子类。用于写入文件。我们知道,一切皆字节。所以使用FileOutputStream可以写入任意类型的文件。但是对于中文字符,可能出现乱码的情况,所以我们写入中文字符时不使用该类,而是使用字符流来写入文件。大多时候我们使用该类写入诸如图像数据之类的原始字节的流。
1.2 FileOutputStream的构造方法
FileOutputStream(File file)
创建一个向指定 File 对象表示的文件中写入数据的文件输出流。
FileOutputStream(File file, boolean append)
创建一个向指定 File 对象表示的文件中写入数据的文件输出流。
FileOutputStream(String name)
创建一个向具有指定名称的文件中写入数据的输出文件流。
FileOutputStream(String name, boolean append)
创建一个向具有指定 name 的文件中写入数据的输出文件流。
构造方法解析:
File file:传入一个File对象。
String name:传入一个文件路径
boolean append:true表示追加写,false表示覆盖写。
实例展示:
try {
//传入File对象,覆盖写
FileOutputStream fileOutputStream = new FileOutputStream(new File("F:\1.txt"));
//传入File对象,追加写
FileOutputStream fileOutputStream1 = new FileOutputStream(new File("F:\1.txt"),true);
//传入文件路径,覆盖写
FileOutputStream fileOutputStream2 = new FileOutputStream("F:\1.txt");
//传入文件路径,追加写
FileOutputStream fileOutputStream3 = new FileOutputStream("F:\1.txt",true);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
1.3 FileOutputStream的常用方法
FileOutputStream继承了OutputStream(输出字节流的所有类的超类).
输出字节流的共性方法它都有并重写了write和close方法:
void close()
关闭此输出流并释放与此流有关的所有系统资源。
void flush()
刷新此输出流并强制写出所有缓冲的输出字节。
void write(byte[] b)
将整个btye写入此文件输出流
void write(byte[] b, int off, int len)
将指定 byte 数组中从 off 开始的 len 个字节写入此文件输出流。
void write(int b)
将指定字节写入此文件输出流。
这里我们先介绍一个flush方法和close方法。
在缓冲流中:
flush用来将缓冲区的数据强制写入到文件中,而close方法会调用flush()方法达到同样的效果。
而对于字节流来说flush()并没有实际意义,close()也只是起到释放资源的作用。
这是因为:
OutputStream中的flush和close方法是空的,并没有具体的执行语句。而FileOutputStream只是重写了close方法,而没有重写flush方法,并且没有调用flush方法,就算调用了也没什么用(flush是空的)。
来看源码:
public void flush() throws IOException {
}
public void close() throws IOException {
synchronized (closeLock) {
if (closed) {
return;
}
closed = true;
}
if (channel != null) {
channel.close();
}
fd.closeAll(new Closeable() {
public void close() throws IOException {
close0();
}
});
}
实例展示:
FileOutputStream fileOutputStream = new FileOutputStream(new File("Study01\src\main\java\FileDemo\1.txt"));
fileOutputStream.write(99);
可以看到这里我们没有使用flush()和close()方法仍然能把数据写入到文件。
而剩下两个write方法也是一样的。但是剩下两个能够一次往文件中写入多个字节。
byte[] b = new byte[]{97,98};
fileOutputStream.write(b);
fileOutputStream.write(b,0,1);
这都是写入字节,那怎么向文件中写入字符串呢?可以使用String类的getBytes方法们将字符串转化为字节数组。
public byte[] getBytes()
使用平台的默认字符集将此 String 编码为 byte 序列,并将结果存储到一个新的 byte 数组中。
fileOutputStream.write("你好".getBytes());
最后一步一定不要忘记,那就是关闭资源。
fileOutputStream.close();
虽然有些流中的close方法是空的(比如BufferedOutputStream),也就是说执不执行都不影响,但是我们还是应该都养成随手关闭资源的好习惯。
1.4 FileOutputStream小结
使用FileOutputStream的步骤:
-
创建流对象
- 参数是File或者是文件路径
-
调用write方法
-
关闭流资源
FileOutputStream特点:
- 可以写入任意类型的文件,但是只推荐用于图像数据之类的原始字节的流。
- 在write操作后不需要调用flush方法也能把数据写入到文件。
小结
以上就是我对于字节输出流的一些理解,希望对读者有所帮助,如有不正之处,欢迎掘友们留言指正。