1. 概述
FileOutputStream
是 Java 中用于向文件写入字节数据的输出流类。它用于创建一个文件输出流,该流用于将数据写入文件。
-
功能:
FileOutputStream
可以用来写入字节数据到文件中。它支持将字节、字节数组或部分字节数组写入到文件中。 -
创建流:要使用
FileOutputStream
,需要指定要写入的文件路径。可以使用new FileOutputStream(new File("文件路径"))
创建一个文件输出流对象。 -
写入数据:通过调用
write(byte[] b)
、write(int b)
、write(byte[] b, int off, int len)
等方法,可以将字节数据写入文件。 -
关闭流:写入完成后,需要调用
close()
方法关闭流,释放资源。 -
异常处理:在使用
FileOutputStream
时,需要注意处理可能抛出的IOException
异常,以确保文件操作的可靠性。
2. 作用
FileOutputStream
的主要作用是将字节数据写入文件。
-
文件写入:使用
FileOutputStream
可以将字节数据写入文件。可以写入字节、字节数组或部分字节数组,实现对文件内容的修改或追加。 -
创建文件:如果指定的文件不存在,
FileOutputStream
会自动创建该文件,并将数据写入其中。如果文件已存在,则会先清空文件内容,再写入新的数据。 -
文件追加:除了覆盖文件内容外,
FileOutputStream
还可以在已有文件的末尾追加新的字节数据,而不会删除原有内容。这对于日志文件、数据文件等需要不断增加内容的场景非常有用。 -
二进制文件处理:
FileOutputStream
可以处理二进制文件,如图像、音频、视频文件等。通过向文件写入原始的字节数据,能够保持文件的二进制结构不变。 -
文件流关闭:在写入完成后,调用
close()
方法关闭FileOutputStream
流,确保文件操作的正确性和资源的释放。
3. 书写步骤
-
实现步骤:
-
创建对象
-
写出数据
-
释放资源
-
-
FileOutputStream书写细节
- ① 创建字节输出流对象
-
细节1:参数是字符串表示的路径或者File对象都是可以的
-
细节2:如果文件不存在会创建一个新的文件,但是要保证父级路径是存在的
-
细节3:如果文件已经存在,则会清空文件
-
- ② 写数据
- 细节: write方法的参数是整数,但是实际上写到本地文件中的是整数在ASCII上对应的字符
- ③ 释放资源
- 细节:每次使用完流之后都要释放资源(解除了资源的占用)
- ① 创建字节输出流对象
-
代码示例
实现需求:写出一段文字到本地文件。(暂时不写中文)package text.IOStream.FileOutputStream.FileOutputStream01; import java.io.FileOutputStream; import java.io.IOException; /* 字节输出流:FileOutputStream 实现需求:写出一段文字到本地文件。(暂时不写中文) 实现步骤: 1.创建对象 2.写出数据 3.释放资源 FileOutputStream书写细节 ① 创建字节输出流对象 细节1:参数是字符串表示的路径或者File对象都是可以的 细节2:如果文件不存在会创建一个新的文件,但是要保证父级路径是存在的 细节3:如果文件已经存在,则会清空文件 ②写数据 细节: write方法的参数是整数,但是实际上写到本地文件中的是整数在ASCII上对应的字符 ③ 释放资源 细节:每次使用完流之后都要释放资源(解除了资源的占用) */ public class FileOutputStream01 { public static void main(String[] args) throws IOException { //1.创建对象 //写出 输出流 OutputStream //本地文件 File FileOutputStream fos = new FileOutputStream("D:\\JavaCode\\code\\codeText01\\src\\text\\IOStream\\FileOutputStream\\FileOutputStream01\\a.txt"); // 2.写出数据 fos.write(99); //3.释放资源 fos.close(); } }
-
输出结果
4. 构造方法
FileOutputStream写数据的三种方式:
方法名称 | 说明 |
---|---|
void write(int b) | 一次写一个字节数据 |
void write(byte[] b) | 一次写一个字节数组数据 |
void write(byte[] b, int off, int len) | 一次写一个字节数组的部分数据 |
- 细节:
1. void write(byte[lb,int off,int len):一次写一个字节数组的部分数据-
参数一: 数组
-
参数二:起始索引
-
参数三:个数
-
- 代码示例
package text.IOStream.FileOutputStream.FileOutputStream02; import java.io.FileOutputStream; import java.io.IOException; /*FileOutputStream写数据的三种方式: | 方法名称 | 说明 | | ----------------------------------- | ---------------------------- | | void write(int b) | 一次写一个字节数据 | | void write(byte[]b) | 一次写一个字节数组数据 | | void write(byte[lb,int off,int len) | 一次写一个字节数组的部分数据 | 细节: 1.void write(byte[lb,int off,int len):一次写一个字节数组的部分数据 参数一: 数组 参数二: 起始索引 参数三: 个数 */ public class FileOutputStream02 { public static void main(String[] args) throws IOException { //1.void write(int b) :一次写一个字节数据 System.out.println("=============1.void write(int b) :一次写一个字节数据============="); //创建对象 FileOutputStream fos1 = new FileOutputStream("D:\\JavaCode\\code\\codeText01\\src\\text\\IOStream\\FileOutputStream\\FileOutputStream02\\a.txt"); //写出数据 fos1.write(97); //释放资源 fos1.close(); System.out.println(); //2.void write(byte[]b):一次写一个字节数组数据 System.out.println("=============2.void write(byte[]b):一次写一个字节数组数据============="); //创建对象 FileOutputStream fos2 = new FileOutputStream("D:\\JavaCode\\code\\codeText01\\src\\text\\IOStream\\FileOutputStream\\FileOutputStream02\\b.txt"); //写出数据 byte[] bytes1 = {97, 98, 99, 100, 101, 102}; fos2.write(bytes1); //释放资源 fos2.close(); System.out.println(); //3.void write(byte[lb,int off,int len):一次写一个字节数组的部分数据 System.out.println("=============3.void write(byte[lb,int off,int len):一次写一个字节数组的部分数据============="); //创建对象 FileOutputStream fos3 = new FileOutputStream("D:\\JavaCode\\code\\codeText01\\src\\text\\IOStream\\FileOutputStream\\FileOutputStream02\\c.txt"); //写出数据 byte[] bytes2 = {97, 98, 99, 100, 101, 102}; fos3.write(bytes2, 0, 3); //释放资源 fos3.close(); } }
- 输出结果
-
1.void write(int b) :一次写一个字节数据
-
2.void write(byte[]b):一次写一个字节数组数据
-
3.void write(byte[lb,int off,int len):一次写一个字节数组的部分数据
-
5. 换行写
换行写:再次写出一个换行符就可以了
windows:
\r\n
Linux:\n
Mac:\r
-
细节:
- 在windows操作系统当中,java对回车换行进行了优化。
- 虽然完整的是\r\n,但是我们写其中一个\r或者\n,java也可以实现换行,因为java在底层会补全。
-
建议:不要省略,还是写全了。
-
代码示例
在a.txt文件中写道:love (换行) you
package text.IOStream.FileOutputStream.FileOutputStream03; import java.io.FileOutputStream; import java.io.IOException; /*换行写 换行写:再次写出一个换行符就可以了 windows:\r\n Linux:\n Mac: \r 细节: 在windows操作系统当中,java对回车换行进行了优化。 虽然完整的是\r\n,但是我们写其中一个\r或者\n,java也可以实现换行,因为java在底层会补全。 建议: 不要省略,还是写全了。 练习:在a.txt文件中写道: love (换行) you */ public class FileOutputStream03 { public static void main(String[] args) throws IOException { //创建对象 FileOutputStream fos = new FileOutputStream("D:\\JavaCode\\code\\codeText01\\src\\text\\IOStream\\FileOutputStream\\FileOutputStream03\\a.txt"); //写出数据 String str1 = "love"; //将字符串转换成字节数组 byte[] bytes1 = str1.getBytes(); fos.write(bytes1); String str2 = "\r\n"; byte[] bytes2 = str2.getBytes(); fos.write(bytes2); String str3 = "you"; byte[] bytes3 = str3.getBytes(); fos.write(bytes3); //释放资源 fos.close(); } }
-
输出结果
6. 续写
续写:如果想要续写,打开续写开关即可
-
开关位置:创建对象的第二个参数
append
public FileOutputStream(String name, boolean append)
- 默认false:表示关闭续写,此时创建对象会清空文件
- 手动传递true;表示打开续写,此时创建对象不会清空文件
-
代码示例
package text.IOStream.FileOutputStream.FileOutputStream04; import java.io.FileOutputStream; import java.io.IOException; /*续写 续写: 如果想要续写,打开续写开关即可 开关位置:创建对象的第二个参数append public FileOutputStream(String name, boolean append) 默认false:表示关闭续写,此时创建对象会清空文件 手动传递true;表示打开续写,此时创建对象不会清空文件 */ public class FileOutputStream04 { public static void main(String[] args) throws IOException { //创建对象 FileOutputStream fos = new FileOutputStream("D:\\JavaCode\\code\\codeText01\\src\\text\\IOStream\\FileOutputStream\\FileOutputStream03\\a.txt", true); //写出数据 String str = "XX"; //将字符串转换成字节数组 byte[] bytes = str.getBytes(); fos.write(bytes); //释放资源 fos.close(); } }
-
输出结果
7. 注意事项
-
数据丢失:使用
FileOutputStream
写入数据时,如果数据未被刷新到磁盘或未调用close
方法关闭流,有可能造成数据丢失。因此,在写入完数据后,务必调用flush
方法将数据刷新到磁盘并调用close
方法关闭流。 -
异常处理:在使用
FileOutputStream
进行文件写入操作时,可能会抛出IOException
异常,因此需要在适当的地方进行异常处理,以避免程序崩溃或数据丢失。 -
文件权限:在写入文件时,需要注意文件的权限问题。确保当前用户有足够的权限来进行文件写入操作,否则会导致写入失败。
-
文件覆盖:使用
FileOutputStream
写入文件时,默认会覆盖原有文件内容。如果不希望覆盖文件内容,可以通过构造函数中的参数来指定是否追加数据而不是覆盖。 -
数据编码:
FileOutputStream
写入的是字节数据,如果需要写入字符数据或其他类型的数据,需要进行适当的编码转换,以确保数据的正确性。 -
资源释放:在完成文件写入操作后,一定要及时关闭
FileOutputStream
流,释放资源,避免资源泄露和程序性能问题。