Java的FileOutputStream类

740 阅读4分钟

「这是我参与11月更文挑战的第9天,活动详情查看:2021最后一次更文挑战

最近项目中碰到了根据数据生成用户的认证信息的功能需求,正好用到FileOutputStream输出流对象,在此学习总结一下使用FileOutputStream输出字节流到文件的操作流程。

1. 类结构定义

FileOutputStream类在Java中是用来进行字节流输出(写入文件)的,与之对应的是FileWriter类用于字符流的输出。

FileOutputStream类的继承结构图可以表示为:

image.png

  • FileOutputStream类继承了OutputStream类
  • OutputStream作为抽象类,是所有字节输出类的超类,且又实现了Flushable和Closeable接口
  • Flushable接口用来提供flush()刷新方法
  • Closeable接口用来提供close()关闭方法

2. 构造函数

FileOutputStream类中根据参数不同定义了多个构造函数。

2.1 根据File文件创建输出流

由于是将字节流写入到指定文件中,首先需要在Java语言中创建文件对应的对象,并将文件对象作为参数生成一个字节输出流对象。

//指定File文件对象来创建输出流
public FileOutputStream(File file) throws FileNotFoundException{  
}

//指定File文件对象来创建输出流,并设置输出时是否以追加模式
//append=false时表示覆盖文件内容
public FileOutputStream(File file, boolean append) public FileOutputStream(File file, boolean append){
}

2.2 根据字符串路径创建输出流

输出流对象创建时可以直接使用字符串指定输出文件的路径信息。

//指定文件字符串创建输出流
public FileOutputStream(String name) throws FileNotFoundException {  
}

//指定文件路径字符串创建输出流,并设置输出到文件是否以追加模式,
//append=false时表示覆盖文件内容
public FileOutputStream(String name, boolean append) throws FileNotFoundException {
}

使用String类型作为参数创建输出流对象时,其本质上也是使用File对象进行FileOutputStream对象的创建,只是在构造函数内部将字符串值生成了File对象。

public FileOutputStream(String name) throws FileNotFoundException {
    this(name != null ? new File(name) : null, false);
}

2.3 创建输出流注意事项

根据构造函数初始化FileOutputStream对象时,需要注意以下几点:

  • 如果指定的文件不存在,则会新建一个指定文件,然后对文件创建FileOutputStream对象
  • 如果无法创建,会抛出FileNotFoundException异常
    • 路径不存在,如/opt/local/file.txt路径在windows中不存在,则无法创建
    • 存在指定文件名的文件夹,则会创建失败
    • 文件路径字符串不合法,如路径/opt'/loca'/file.txt,则创建失败

3. 输出字节流到文件

FileOutputStream输出流对象创建完成,便可以使用对象中提供的方法将字节流输出到指定的文件中,对象中提供了write()方法将字节内容写入到文件汇总,调用方法输出时需要抛出IOException异常信息。

3.1 write()方法

FileOutputStream的write(int b)方法接收一个int类型数,因为作为字节流输出,其内部调用了本地write方法,会将int类型的参数转成对应的ASCALL码或中文GBK码。

 //本地write方法
 private native void write(int b, boolean append) throws IOException;
 
 //调用本地write方法
 public void write(int b) throws IOException {
     write(b, append);
 }

3.2 writeBytes()方法

除了write()方法接收一个字节外,还提供了writeBytes()方法来接收一个字节数组。

//本地native方法
private native void writeBytes(byte b[], int off, int len, boolean append) throws IOException;

//对象的write方法,内部调用本地方法
public void write(byte b[]) throws IOException {
    writeBytes(b, 0, b.length, append);
}

//提供偏移量和长度参数,选择性的输出字节数组中的内容到文件中
public void write(byte b[], int off, int len) throws IOException {
    writeBytes(b, off, len, append);
}
  • writeBytes()方法以字节数组作为参数,这样Java中的字符串等就可以通过字节数组写入到文件。
  • "Hello FileOutputStream!".getBytes()可以获取字符串对应的字节数组。
  • writeBytes(byte b[])方法写入字节数组时,会将连续的字节组合成为对应的内容写入文件。

3.3 关闭输出流

流对象使用完毕后需要调用.close()方法来关闭流,以此来释放其占用的资源。

4. 完整使用流程

输出流对象FileOutputStream使用比较简单,主要有以下流程:

  1. 定义文件地址,
  2. 根据文件地址创建文件对象(可选),
  3. 传入文件信息创建输出流对象FileOutputStream,
  4. 获取写入的内容对应的字节数组,
  5. 调用输出流对象的写方法,传递字节数组参数,将内容写入文件,
  6. 关闭输出流。
public static void main(String[] args) throws IOException {
    String path = "D:\\ProjectTest\\WorkSpace\\file\\test.txt";
    
    //File file = new File(path);
    //FileOutputStream fileOutputStream = new FileOutputStream(file);
    
    FileOutputStream fileOutputStream = new FileOutputStream(path);

    byte[] bytes = "Hello FileOutputStream!".getBytes();
    
    fileOutputStream.write(bytes);
    
    fileOutputStream.close();
}