对Java的I/O源理解
这是很久前另一个BLOG上的,现在不用了。转过来吧,方便查看...
输出流
流程示意图:
不同的情况:
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 字节,随后会按数据大小自动进行调整。
输入流
流程示意图:
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. 关闭以前关闭的流无效。