学习笔记之java.io包中的字节流(上)—— 基本的InputStream和OutputStream

先看下类的声明:

1
2
public abstract class InputStream implements Closeable
public abstract class OutputStream implements Closeable, Flushable

可见此二者都是抽象类,而非接口。也就是说除了分别满足java.io.Closeable和java.io.Flushable,提供了close()和flush()方法的默认实现外,还给出了其它实现,像InputStream就提供了skip()方法实现等。

我们更关心的是InputStream中的几个read()方法和OutputStream的几个write()方法。而实际上最核心的read()和write()方法,InputStream和OutputStream并未给出直接实现,这正是InputStream和OutputStream抽象的地方,我们来看下。

InputStream的read()方法:

  • public abstract int read() throws IOException; 核心read()方法,留给子类实现。
  • public int read(byte b[])
  • public int read(byte b[], int off, int len)

后两者是调用第一个方法读特定长度的数据放入byte数组中。

OutputStream的write()方法:

  • public abstract void write(int b) throws IOException; 核心write()方法,留给子类实现。
  • public void write(byte b[])
  •  public void write(byte b[], int off, int len)

和read()类似,把字节数组中的特定数据挨个调用第一个write()方法写出。

再说read()和wirte()实现,那么就要看一下InputStream和OutputStream的子类。我们先来看看InputStream和OutputStream的直接子类。

在java.io中InputStream的直接子类有:

  • java.io.ByteArrayInputStream
  • java.io.FileInputStream
  • java.io.FilterInputStream
  • java.io.ObjectInputStream
  • java.io.PipedInputStream
  • java.io.SequenceInputStream
  • java.io.StringBufferInputStream

而java.io中OutputStream的直接子类有:

  • java.io.ByteArrayOutputStream
  • java.io.FileOutputStream
  • java.io.FilterOutputStream
  • java.io.ObjectOutputStream
  • java.io.PipedOutputStream

这些当中,FileInputStream和FileOutputStream是与外部IO直接有关系的,而FilterInputStream和FilterOutputStream是“装饰者”设计实现的基类,其它各类都是特定场景下InputStream和OutputStream的实现,我们来具体看看。

1. FileInputStream/FileOutputStream

顾名思义,是文件的输入流和输出流。文件存在于哪里呢?通常存在于外部设备上,这个是这些实现类中比较特殊的。我们如果做过C语言开发,知道我们通常会open操作系统中的文件,并保留其文件描述符fd。其实,在Java中我们也有类似的东西。首先,就有fd属性,它是FileDescriptor类,和C等底层语言中一样,这实际上是对底层文件的一个描述符,和底层文件进行交互的时候少不了它。实际上在FileInputStream/FileOutputStream对象构造方法中,我们初始化了FileDescriptor的fd对象,并调用了open()方法。

遗憾的是,像open()、read()、write()、skip()、available()这些FileInputStream/FileOutputStream中的具体操作方法,在(Sun)JDK中都冠以native,即本地实现,这样做的好处就是上层开发使用者不必关心,统统交由JVM等底层实现进行处理,实现了平台无关性。

在FileInputStream还有这样几个属性:

  • private final FileDescriptor fd;
  • private FileChannel channel = null;   JDK1.4之后为了支持NIO的Channel操作
  • private final Object closeLock = new Object();  关闭时的并发同步锁
  • private volatile boolean closed = false; 关闭标志
  • private static final ThreadLocal<Boolean> runningFinalize =
    new ThreadLocal<>();  finalize是否运行的标志

此外,再简要看下FileInputStream构造方法的一个具体实现:

1
2
3
4
5
6
7
8
9
10
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值