资讯专栏INFORMATION COLUMN

Java IO框架总揽--FileOutputStream源码解读

warmcheng / 2888人阅读

摘要:是继承与的子类常用属性文件描述符是否在文件尾部开始追加写入用于读写映射操作文件的通道文件的路径一个关闭锁,只在方法中使用,确保多线程同步调用构造函数创建一个向指定对应的文件中写入数据的文件输出流创建一个向指定对应的文件中写入数据的文件输出流

FileOutputStream 是继承与OutputStream的子类

1 常用属性

private final FileDescriptor fd;// 文件描述符

private final boolean append; // 是否在文件尾部开始追加写入

private FileChannel channel; // 用于读、写、映射、操作文件的通道

private final String path;// 文件的路径

private final Object closeLock = new Object();// 一个关闭锁,只在close()方法中使用,确保多线程同步调用

2 构造函数

public FileOutputStream(String name);// 创建一个向指定File对应的文件中写入数据的文件输出流

public FileOutputStream(String name, boolean append);// 创建一个向指定File对应的文件中写入数据的文件输出流,第二个参数append是否在文件末尾开始写入

public FileOutputStream(File file);// 创建一个向指定File对应的文件中写入数据的文件输出流

public FileOutputStream(File file, boolean append);// 创建一个向指定File对应的文件中写入数据的文件输出流

public FileOutputStream(FileDescriptor fdObj); // 根据文件描述符构造输出流

3 常用方法

// 写入一个字节到该文件输出流中,调用下边的本地方法

public void write(int b) throws IOException {

   write(b, append);// 调用的是一个native方法

}

// 本地方法,写入一个字节到该文件输出流中

private native void write(int b, boolean append) throws IOException;

// 将给定的字节数组b中的所有字节写入文件输出流,调用本地方法

public void write(byte b[]) throws IOException {

  writeBytes(b, 0, b.length, append);

}

// 将给定的字节数组b中从off开始的len个字节字节写入文件输出流,调用下边的本地方法

public void write(byte b[], int off, int len) throws IOException {

  writeBytes(b, off, len, append);

}

// 本地方法,将给定的字节数组b中从off开始的len个字节写入文件输出流

private native void writeBytes(byte b[], int off, int len, boolean append) 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();
     }
  });

}

// 本地方法,关闭流

private native void close0() throws IOException;

// 清理到文件的连接,并确保不再引用此文件输入流时调用此close的方法

protected void finalize() throws IOException {

 if (fd != null) {
     if (fd == FileDescriptor.out || fd == FileDescriptor.err) {
         flush();
     } else {
         close();
     }
 }

}

// 获取流对象对应的通道,如果为空就创建一个新的通道

public FileChannel getChannel() {

synchronized (this) {
    if (channel == null) {
        channel = FileChannelImpl.open(fd, path, false, true, append, this);
    }
    return channel;
}

}

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/72008.html

相关文章

  • Java IO框架总揽--FileInputStream源码解读

    摘要:是从文件系统中的文件中获取字节,至于什么文件,取决于主机环境,用于读取原始字节流,如图像数据,假如想要读取字符类型流,请使用。跳过个字节本地方法关闭文件输入流 FileInputStream是从文件系统中的文件中获取字节,至于什么文件,取决于主机环境,FileInputStream用于读取原始字节流,如图像数据,假如想要读取字符类型流,请使用FileReader。 ...

    894974231 评论0 收藏0
  • Java IO框架总揽--File源码解读

    摘要:直接继承与,实现了接口和接口,实现接口,意味着对象支持序列化操作,而实现接口,意味着之间可以比较大小。删除此抽象路径名表示的文件或目录。标记此抽象路径名指定的文件或目录,从而只能对其进行读操作。 showImg(https://segmentfault.com/img/bVbi3ls?w=2048&h=164);1 File直接继承与Object,实现了Serializable接口和C...

    rubyshen 评论0 收藏0
  • Java IO框架总揽--ObjectInputStream& ObjectOutputSt

    摘要:与的作用是对基本数据和对象进行序列化操作进行支持。如果检测到反序列化的类的和对象二进制流的不同,则会抛出异常。 ObjectInputStream与ObjectOutputStream的作用是:对基本数据和对象进行序列化操作进行支持。其中ObjectInputStream对象提供对基本数据和对象对持久存储,当我们需要读取这些存储这些基本数据或对象时,可以创建文件输入流对应的Object...

    philadelphia 评论0 收藏0
  • Java IO框架总揽--序列化

    摘要:序列化提供的一种对象序列化的机制,在该机制中,一个对象可以被表示为一个字节序列,该字节序列包括对象的数据有关对象的类型的信息和存储在对象中的数据类型。类和是高程次的数据流,他们包含序列化和反序列化对象的方法。 序列化:Java提供的一种对象序列化的机制,在该机制中,一个对象可以被表示为一个字节序列,该字节序列包括对象的数据、有关对象的类型的信息、和存储在对象中的数据类型。 反序列化:将...

    codercao 评论0 收藏0
  • 从设计者的角度理解Java IO

    摘要:通过多个装饰类实现责任链模式,它将对一个输入流的不同处理分散到不同的中去。 1、基本概念 1.1、InputStream 最基本的字节输入流,抽象类,定义了读取原始字节的所有基本方法1.1.1、public abstract int read() throws IOException 读取一个字节的方法,最基础的方法1.1.2、public int read(byte b[], in...

    Flink_China 评论0 收藏0

发表评论

0条评论

warmcheng

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<