对Java的I/O源理解

对Java的I/O流理解

这是很久前另一个BLOG上的,现在不用了。转过来吧,方便查看...

 

输出流

流程示意图:

  对Java的I/O源理解

不同的情况:

1.        调用 write( ) 方法,把数据写入缓冲区,

i 如果缓冲区被填满 ,将自动执行 2,3 步,把数据转换为字节写入到下一个缓冲区

(1)   如果此缓冲区又被填满,则自动执行第 4 步,把转换好的数据保存到缓冲数组

(2)   如果未被填满则不会执行第 4 步。

< 将循环执行,未写入的数据源 继续写入缓冲区,直到数据被全部写入 >

    ii 如果未被填满 ,则不执行 2 3 步。

2.        当出现未被填满而不发送的情况,可以调用 flush( ) 方法进行强制刷出操作。

 

API 中的一些定义:

ByteArrayOutputStream

1.   此类实现了一个输出流,其中的数据被写入一个 byte 数组。

2.   缓冲区会随着数据的不断写入而自动增长。

3.   可使用 toByteArray() toString() 获取数据。

 

OutputStreamWriter

1.        OutputStreamWriter 是字符流通向字节流的桥梁:可使用指定的 charset 将要写入流中的字符编码成字节。

2.        每次调用 write() 方法都会导致在给定字符(或字符集)上调用编码转换器。

3.        传递给 write() 方法的字符没有缓冲。

 

BufferedWriter

1.        将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。

2.        可以指定缓冲区的大小,或者接受默认的大小。

 

还有就是 flush( ) 方法的定义——

1.        刷新该流的缓冲。

2.        如果该流已保存缓冲区中各种 write() 方法的所有字符,则立即将它们写入预期目标。

3.        然后,如果该目标是另一个字符或字节流,则将其刷新。

4.        因此,一次 flush() 调用将刷新 Writer OutputStream 链中的所有缓冲区。

 

* 需要注意的是, ByteArrayOutputStream 中的数组缓冲区初始大小为 32 字节,随后会按数据大小自动进行调整。

 

 

输入流

流程示意图:

对Java的I/O源理解

 

1.        把数据源转换为字节数组;

2.        把转换好的字节缓冲数组作为参数源传进 ByteArrayInputStream 流;

3.        与输出流不同的是,第 3 4 5 步会自动执行,把数组传进下一个缓冲区;

4.        等到调用 read( ) 方法,把缓冲中数据读出

 

API 中的一些定义:

ByteArrayInputStream

1.ByteArrayInputStream 包含一个内部缓冲区,该缓冲区包含从流中读取的字节。

2. 内部计数器跟 read 方法要提供的下一个字节。

 

InputStreamReader

1.        InputStreamReader 是字节流通向字符流的桥梁:它使用指定的 charset 读取字节并将其解码为字符。

2.       每次调用 InputStreamReader 中的一个 read() 方法都会导致从底层输入流读取一个或多个字节。

3.       要启用从字节到字符的有效转换,可以提前从底层流读取更多的字节,使其超过满足当前读取操作所需的字节。

BufferedReader

1.        从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。

2.        可以指定缓冲区的大小,或者可使用默认的大小。

 

close( ) 方法——

1.        关闭该流并释放与之关联的所有资源。

2.        在关闭该流后,再调用 read() ready() mark() reset() skip() 将抛出 IOException

3.        关闭以前关闭的流无效。