IO

所有示例代码见github https://github.com/whbing/proTest/tree/master/pro-1/src/main/java/io

1. 4个基类

所有输出输入流全部继承以下4个积基类:

  • InputStream
  • Reader
  • OutputStream
  • Writer

字符和字节几乎完全一样。

  • 字节就是1byte,即8bit
  • 字符是2字节,16bit

以下全以字节流InputStreamOutputStream说明。


2. 比喻

    ----------------
    ①①①①①①①①①①
    ----------------
    |     每个水滴就是一个字节或字符
   \|/
   指针记录

指针、缓冲 的加入使得允许高效处理输入输出、批量处理

3. InputStream 和 Reader

三个方法:

  1. public abstract int read()

    从输入流中读单个字节。读取一个水滴。这是个抽象方法,没有实现。

  2. public int read(byte/char b[])

    最多读取b.length个字节的数据,并存储在字节字节数组b中,返回实际读取的字节数。

  3. public int read(byte/char b[], int off, int len)

    该方法见源码。从输入中最多读取len个字节,并将其存入字节数组b中,
    放入数组时,并不是数组起点,而是从off位置开始,返回实际读取的字节数。

说明:使用带参数的read()时,read(byte[] b)来读取多个水滴。这个数组byte[]可以看成一个竹筒。每次取出一桶水滴。
程序多次重复取水,直到最后。直到read(byte[] b)返回-1,表示取水完毕。

FileInputStream 与 FileReader

上边的4个基类都不能创建实例。可以用子类。
如:

自动关闭

打开的资源不属于内存资源,GC无法回收,需要close。Java7实现了所有IO资源类,都实现了AutoCloseable接口,都可以通过try-catch自动关闭。
以下用FileReader来示例。(不会出现乱码)

说明:
try-resource-catch 其中try的()中只能放实现了Closeable的变量。

其他功能

  • void mark(int readAheadLimit)
  • boolean markSupported()
  • void reset()
  • long skip(ling n)

4. OutputStream 和 Writer

三个写的方法:

  • void write(int c)
  • void write(byte[]/char[] buf)
  • void write(byte[]/char[] buf)

Writer以字符为操作单位,还支持以字符串代替字符数组。两个方法:

  • void write(String str)
  • void write(String str, int off, int len)

以下示例使用 FileInputStream 输入,并使用 FileOutputStream 输出,实现复制文件的功能。
FileOutputStream

直接输出字符串使用Writer

WriterDemo

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值