IO流主要用于硬盘,内存,键盘等处理设备上的数据操作,根据所处理的数据的数据类型的不同可以分为:字节流(抽象基类为InputStream和OutputStream)和字符流(抽象基类为Reader和Writer)。根据流向不同,可以分为:输入流和输出流。IO的主要结构图如下:
字符流与字节流的主要区别?
1.字节流读取的时候,读到一个字节就返回一个字节;字符流使用字节流读取一个或多个字节(中文对应的字节有两个,在UTF-8编码表中是3个字节)时,先去查指定的编码表,将查到的字符返回
2.字节流可以处理所有类型的数据,如:图片,mp3,AVI视频文件。而字符流只能处理字符数据,只要是处理纯文本数据,就要优先考虑使用字符流,除此之外都用字节流
IO流主要可以分为节点流和处理流两大类
一、节点流类型
该类型可以从或者向一个特定的地点或者节点读取数据。主要类型如下
类型 | 字符流 | 字节流 |
File(文件) |
FileReader FileWriter |
FileInputStream FileOutputStream |
Memory Array |
CharArrayReader CharArrayWriter |
ByteArrayInputStream ByteArrayOutputStream |
Memory String |
StringReader StringWriter |
|
Pipe(管道) |
PipedReader PipedWriter |
PipedInputStream PipedOutputStream |
二、处理流类型
该类型是对一个已经存在的流进行封装,通过封装流来实现数据的读写,处理流的构造方法总是要带一个其他流对象作为参数,一个流对象经过其他流的多次包装,叫做流的链接。主要可以分为以下几种:
1、缓冲流(BufferedInputStream / BufferedOutputStream / BufferedWriter / BufferedReader)
写入缓冲区对象: BufferedWriter bufw = new BufferedWriter(new FileWriter("buf.txt"));
读取缓冲区对象: BufferedReader bufr = new BufferedReader(new FileReader("buf.txt"));
该类型的流有一个特有的方法:readLine();一次读一行,到行标记时,将行标记之前的字符数据作为字符串返回,当读到末尾时,返回null,其原理还是与缓冲区关联的流对象的read方法,只不过每一次读取到一个字符,先不进行具体操作,先进行临时存储,当读取到回车标记时,将临时容器中存储的数据一次性返回
2、转换流(InputStreamReader / OutputStreamWriter)
该类型是字节流和字符流之间的桥梁,该流对象中可以对读取到的字节数据进行指定编码的编码转换
构造函数主要有:InputStreamReader(InputStream);
InputStreamReader(InputStream,String charSet);
OutputStreamWriter(OutputStream);
OutputStreamWriter(OutputStream,String charSet);
3、数据流(DataInputStream / DataOutputStream)
该数据流可以方便地对一些基本类型数据进行直接的存储和读取,不需要再进一步进行转换,通常只要操作基本数据类型的数据,就需要通过DataStream进行包装
构造方法:DataInputStream(InputStream)
DataOutputStream(OutputStream)
方法举例:
int readInt();
writeInt(int);
short readShort();
writeShort(short);
String readUTF();
writeUTF(String)
注意:在使用数据流读/存数据的时候,需要有一定的顺序,即某个类型的数据先写入就必须先读出,服从先进先出的原则
4、打印流
PrintStream是一个字节打印流,System.out对应的类型就是PrintStream,它的构造函数可以接受三种数据类型的值:1.字符串路径。2.File对象。3.OutputStream
PrintWriter是一个字符打印流
5、对象流
该类型的流可以把类作为一个整体进行存取,主要方法有:
Object readObject() 该方法抛出异常:ClassNotFountException
void writeObject(Object) :被写入的对象必须实现一个接口:Serializable,否则就会抛出:NotSerializableException
原文:http://www.cnblogs.com/keifer/p/4571334.html