Chinaunix首页 | 论坛 | 博客
  • 博客访问: 157655
  • 博文数量: 47
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 405
  • 用 户 组: 普通用户
  • 注册时间: 2014-11-23 14:38
文章分类

全部博文(47)

文章存档

2017年(7)

2016年(4)

2015年(19)

2014年(17)

我的朋友

分类: Android平台

2015-05-15 21:41:38

[父类 OutputStream]

抽象类 OutputStream 是所有字节输出流的基类,它共定义了一个构造方法和五个方法。构造方法什么也没做。在五个方法中,有,

  • 三个 Write 方法:

public abstract void write(int b) throws IOException

向输出流里写入一个值为 b 的字节。需要注意的是,实际写入的是 int 类型 b 的低8位,其余的 24 位被忽略。
如果有错误,则抛出 IOException。调用这个方法时,需要捕获和处理 IOException。这个方法是OutputStream 类的唯一的抽象方法,需要具体类必须实现。

public void write(byte[] b) throws IOException

向输入流里写入一个字节数组b。效果和 write(b, 0, b.length) 相同。调用这个方法时,需要捕获和处理 IOException。OutputStream 和 FileOutputStream 的实现都是调用了下面的方法。

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

把位置为 off、长度为len 的字节数组b中的数据写入到输出流中。OutputStream 的实现是反复调用write(int b), 子类应该提供更有效率的实现。如果 b 是 null, 则抛出NullPointerException 。如果off 或者 len 小于0,或者 off + len 大于数组 b 的长度, 则抛出 IndexOutOfBoundsException 。
FileOutputStream  重写了这个方法。

  • 其余两个方法

public void flush() throws IOException
如果OutputStream 的实现使用了缓存,这个方法用于清空缓存里的数据,并通知底层去进行实际的写操作。需要注意的是,这个缓存特指Java层的缓存。这个方法对底层(如操作系统)的缓存不起作用。参见 FileDescriptor。

OutputStream 中这个方法的实现什么也没做。具体子类应该重写这个方法。FileOutputStream 没有使用缓存,因此没有重写这个方法。因此,上面代码示例中,这个方法调用与否对运行结果没有影响。

 

public void close() throws 

这个方法用于关闭流。虽然,如果用户忘记调用这个方法,系统可以通过 finalyze 方法在 OutputStream 对象垃圾回收的时候替用户关闭这个流。但用户应该养成良好的习惯显示的调用这个方法!

OutputStream 中这个方法的实现什么也没做。具体子类应该重写这个方法。java.io.FileOutputStream 重写了这个方法。 用于真正关闭相应的文件资源。

 

[FileOutputStream 的其他方法]: 

java.io.FileOutputStream 除了重写 OutputStream 中上述四个方法之外,还提供了额外三个方法:

 

protected void finalize() throws  。这个方法其实是重写了 Object 中的这个方法(Object 是所有Java 类(包括数组类型)的“根级”父类)。这个方法是被 Java 虚拟机中的垃圾回收器调用的。用于 Java 对象已经不存在了但它占有的资源没有释放的情况。FileOutputStream 实现中,这个方法主要是调用了 close() 方法。上面例子中,如果用户没有调用 close() 方法,系统就通过这个方法在垃圾回收的时候关闭文件。但写程序时应该养成显示关闭文件的习惯。

 

public final  getFD() throws 。 这个方法返回 FileDescriptor  对象,这个对象表示这个文件流对应的文件系统中的实际文件。

关于 FD 的使用,请参见本站相关文章。

 

public  getChannel() 这是在 JDK1.4 中引入的方法。用于支持New IO 的特性。这个方法返回 FileChannel 对象,这个对象表示这个文件对应的文件系统中的通道。关于Channel 和 New IO,请参阅本站其它文章。

 

[关于 FileOutputStream 的构造]

FileOutputStream 提供了五个构造方法:

FileOutputStream(File file) throws FileNotFoundException  和 FileOutputStream(String name) throws FileNotFoundException 都是通过实际文件路径(或其标识的File对象)来创建文件流。需要注意的是,如果文件不存在,(待查:是否会创建文件)。如果文件存在,则这两个构造方法中有打开文件的操作。如果文件给定的是目录而不是文件,或者文件不存在又不能创建,或者文件存在却不能打开,则抛出 FileNotFoundException 异常。如果文件由于安全保护而不允许读取,则抛出 SecurityException 异常。

 

写文件需要考虑的一个问题是,是从文件头写入(覆盖原有数据),还是从文件尾写入(增加数据)。上面的两个构造方法都是按照前者实现的,针对后者的情况,FileOutputStream 提供另外两个构造方法:

FileOutputStream(File file, boolean append) throws FileNotFoundException  和FileOutputStream(String name, boolean append) throws FileNotFoundException 

这两个构造方法多了一个 append 参数,如果参数值是 true, 则是“增加数据”,如果参数值是 false, 则是“覆盖原有数据”。即,退化成前两种构造方法。

 

最后,同 FileInputStream 一样, FileOutputStream 提供了用已经打开的文件来创建一个新的文件流:

public FileInputStream( fdObj) 这个构造方法里没有打开文件操作。输入的 FD 对应的一定是一个已经打开的文件。

阅读(1179) | 评论(0) | 转发(0) |
0

上一篇:usb相关

下一篇:开发人员能力矩阵

给主人留下些什么吧!~~