java IO流
1:概念
java中的流,他的概念源于unix中管道(pipe)的概念,在unix中,管道是一条不间断的字节流,用于实现程序或者进程之间的通信,或者读写外围设备,外围文件等。
2:分类
输入输出流:根据文件流的流向,分为输入流和输出流,
字节流和字符流:针对处理的对象是字符还是字节,分为字符流和字节流,
字节流:一般读入或读出的是8位二进制数据,InputStream是所有字节输入流的祖先,OutPutStream是所有输出流的祖先。
字符流:一般读入或读出的是16位二进制数据,Reader是所有读取字符输入流的祖先,Writer是所有字符输出流的祖先。
结合上面所说的输入输出流,简单分类,
字符流 字节流
输入流 Reader InputStream
输出流 Writer OutPutStream
节点流和处理流:节点流是在程序中直接和源文件相连,读入或者读出,处理流就是与节点流一块使用,在节点流的基础上再套上一层,套上的就是处理流
其中需要注意的是在平常操作中如何判断使用字符流还是字节流,字符流一般都是读入或者读出的单位是一个字符,一般遇到中文的就用字符流,因为中文一个字节装不下,如果采用字节流,那么读入的将会是半个中文,操作系统不认识,只能显示问号,遇到其他图片,媒体,视频等就用字节流。通俗点就是遇到中文的就用字符流,其他字节流。
3:详解:
上面图是一个简单表关系,是上次从别人那看到不错就粘贴过来了,很形象。下面就java中的字节流和字符流进行简单的介绍:
java 中的字节流:
FileInputStream和FileOutPutStream
他们都是节点流,input流的源端和out的目的端都是磁盘文件,他们的构造方法允许通过文件的路径名来构造相应的流
FileInputStream fis = new FileInputStream("c://123.txt");要注意的是123.txt文件必须存在而且要保证是可读的。
FileOutPutStream fos = new FileOutPutStream("c://345.txt");若输出文件已经存在了,那么必须是可以覆盖的,如果不存在,则会创建。
BufferedInputStream和BufferedOutputStream,他们是带有缓冲区的input和output,他们分别继承了FileInputStream和FileOutPutStream,
java中的字符流:
字符流是主要用来处理字符的,java采用16位的Unicode来表示字符串和字符,对应的字符流的输入和输出分别是Reader和Writer,
其中FileReader和FileWriter分别继承了Reader和Writer,属于节点流
其中InputStreamReader和InputStreamWtirer,他们是处理流,协助节点流进行处理,在构造这两个类的对应流时,他们会自动进行转换,将平台缺省的编码格式设置为Unicode编码格式,对英文环境而言,缺省编码格式为ISO8859-1。
BufferedReader和BufferedWriter两个类对应的流使用了缓冲,能大大提高输入输出的效率。他也是处理流。
其余还有很多对象,那些都是衍生出来的,针对数组,管道和对象操作的这里就没有详谈。
使用规则:
下面简单介绍一下在那种情况下使用那种流
1:根据文件:
文件:FileInputStream,FileOutPutStream(字节流),FileReader,FileWriter(字符流,带中文)
byte[]:ByteArrayInputStream,ByteArrayOutPutStream(字节流)
char[]:CharArrayReader,CharArrayWriter(字符流)
String:StringBufferInputStream,StringBufferOutPutStream(字节流),StringWriter,StringReader(字符流)
网络数据流:InputStream,OutPutStream(字符流),Reader,Writer(字符流)
2:按是否格式化输出区分:
要格式化输出:PrintStream,PrintWriter
3:按是否缓存区分:
BufferedInputStream,BufferedOutPutStream(字节流),BufferedReader,BufferWriter(字符流)
4:按照数据格式区分
二进制格式(只要不能确定是纯文本格式的)InputStream,OutPutStream以及Stream的子类
纯文本格式(含英文以及中文或者其他编码格式)Reader,Wrtiter以及Reader,Writer的子类
5:输入输出区分
输入流:Reader,InputStream的子类
输出流:Writer,OutPutStream的子类
6:特殊需求区分:
从stream到Reader,Writer的转换类:InputStreamReader,OutPutStreamReader
对象输入输出:ObjectInputStream,ObjectOutPutStream
进程之间通信:PipeInputStream,PipeOutPutStream,PipeWriter,PipeReader
序列化的:SequenceInputStream
决定选取那种类以及他的构造进程规则一般如下:
首先考虑原始数据格式
其次考虑是输入还是输出
在这考虑是否需要转换流
还要考虑数据去向
考虑是否需要缓冲
以上只是我自己结合网上的一些整理的,如果有什么不妥或者错误的地方,敬请指出,谢谢。