FileOutputStream 字节输出流
- 1. 概述
- 2. 作用
- 3. 书写步骤
- 4. 构造方法
- 5. 换行写
- 6. 续写
- 7. 注意事项
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//本地文件 FileFileOutputStream 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\nLinux:\nMac: \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;/*续写 续写: 如果想要续写,打开续写开关即可开关位置:创建对象的第二个参数appendpublic 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
流,释放资源,避免资源泄露和程序性能问题。