输入流和输出流介绍

来源:互联网 发布:淘宝运费险退货多 编辑:程序博客网 时间:2024/05/17 06:30

1.从不同角度分类

流动方向的不同可以分为输入流( InputStream 和 Reader)和输出流(OutputStream 和 Writer)

处理数据的单位不同分为字节流(InputStream 和 OutputStream)和字符流(Reader 和 Writer) 
功能的不同可分为节点流和处理流;

• 节点流:直接操作目标设备,例如:磁盘或一块内存区域。
• 处理流:通过操作节点流,从而间接完成输入或输出功能的流。处理流是的存在是建立在一个已经存在的输入流或输出流的基础之上的。


一般来说处理字符或字符串时使用字符流,处理字节或二进制对象时应使用字节流;


OutputStreamWriter:是Writer的子类,将输出的字符流变为字节流,即将一个字符流的输出对象变为字节流输出对象。

InputStreamReader:是Reader的子类,将输入的字节流变为字符流,即将一个字节流的输入对象变为字符流的输入对象。

如果以文件操作为例,则内存中的字符数据需要通过OutputStreamWriter变为字节流才能保存在文件中,读取时需要将读入的字节流通过InputStreamReader变为字符流

举例说明

//构建一个字节输出流对象

OutputStream out = newFileOutputStream("");

//把字节输出流转成字符输出流

Writer w  = new OutputStreamWriter(out);

//然后的操作和使用字符输出流的操作一样

---------------------------------------------

//构建一个字节输入流对象

InputStream is = newFileInputStream("");

//把字节输入流转成字符输入流

Reader r = new InputStreamReader(is);

//然后的操作和使用字符输入流的操作一样


字节流和字符流在使用上的代码结构都是非常类似的,但是其内部本身也是有区别的,因为在进行字符流操作的时候会使用到缓冲区,而字节流操作的时候是不会使用到缓冲区的
l在输出的时候,OutputStream类即使最后没有关闭内容也可以输出。但是如果是Writer的话,则如果不关闭,最后一条内容是无法输出的,因为所有的内容都是保存在了缓冲区之中,每当调用了close()方法就意味着清空缓冲区了。那么可以证明字符流确实使用了缓冲区:

字节流:程序→文件
字符流:程序→缓冲区 →文件

l如果现在字符流即使不关闭也可以完成输出的话,则必须强制性清空缓冲区:
方法:public void flush() throws IOException
两者相比,肯定使用字节流更加的方便,而且在程序中像图片、MP3等都是采用字节的方式的保存,那么肯定字节流会比字符流使用的更广泛。
但是需要说明的是,如果要是想操作中文的话,字符流肯定是最好使的







0 0
原创粉丝点击