java IO流java
1:概念
数组
java中的流,他的概念源于unix中管道(pipe)的概念,在unix中,管道是一条不间断的字节流,用于实现程序或者进程之间的通讯,或者读写外围设备,外围文件等。
缓存
2:分类网络
输入输出流:根据文件流的流向,分为输入流和输出流,
编码
字节流和字符流:针对处理的对象是字符仍是字节,分为字符流和字节流,操作系统
字节流:通常读入或读出的是8位二进制数据,InputStream是全部字节输入流的祖先,OutPutStream是全部输出流的祖先。
unix
字符流:通常读入或读出的是16位二进制数据,Reader是全部读取字符输入流的祖先,Writer是全部字符输出流的祖先。
code
结合上面所说的输入输出流,简单分类,
视频
字符流 字节流对象
输入流 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
决定选取那种类以及他的构造进程规则通常以下:
首先考虑原始数据格式
其次考虑是输入仍是输出
在这考虑是否须要转换流
还要考虑数据去向
考虑是否须要缓冲
以上只是我本身结合网上的一些整理的,若是有什么不妥或者错误的地方,敬请指出,谢谢。