Java中的IO流在处理上分为字节流和字符流。字节流和字符流的区别 : 1.字节流读取的时候,读到一个字节就返回一个字节; 字符流使用了字节流读到一个或多个字节(中文对应的字节数是两个,在UTF-8码表中是3个字节)时。先去查指定的编码表,将查到的字符返回。
2.字节流可以处理所有类型数据,如:图片,MP3,AVI视频文件,而字符流只能处理字符数据。只要是处理纯文本数据,就要优先考虑使用字符流,除此之外都用字节流。
按照流向则分未输入流和输出流。
JavaIO流体系可如下表示 :
|----流
|-----字符流
|-----Reader
//××××××Reader
|-----Writer
|-----字节流
|-----InputStream
|-----OutputStream
即所有的字符流都继承自Reader/Writer 这两个抽象基类 , 而所有的字节流都继承自InputStream和OutputStream。
IO流可分为 节点流和处理流两大类。
节点流:可以从或向一个特定的地方(节点)读写数据。主要有下:
类型 | 字符流 | 字节流 |
File(文件) |
FileReader
FileWriter
|
FileInputStream
FileOutputSream
|
Memory Array |
CharArrayReader
CharArrayWriter
|
ByteArrayInputStream
ByteArrayOutputSream
|
Memory String |
StringReader
StringWriter
|
- |
Pipe(管道) |
PipedReader
PipedWriter
|
PipedInputSream
PipedOutputSream
|
处理流:是对一个已存在的流的连接和封装,通过所封装的流的功能调用实现数据读写,处理流的构造方法总是要带一个其他流对象作为参数(装饰模式),一个流对象进过其他流的多次包装,叫做流的链接。主要可以分为以下几种:
a. 缓冲流 (BufferedReader / BufferedWriter 和 BufferedInputStream / BufferedOutputSream) 可以提高流的读写效率。
缓冲流读写对象:
BufferedReader bufr=new BufferedReader(new FileReader("buf.txt"));
BufferedWriter bufw=new BufferedWriter(new FileWriter("buf.txt"));
缓冲流有一个特有方法:readLine();一次读一行,到行标记时,将行标记之前的字符数据作为字符串返回,当读到末尾时,返回null,其原理还是与缓冲区关联的流对象的read方法,只不过每一次读取到一个字符,先不进行具体操作,先进行临时储存,当读取到回车标记时,将临时容器中储存的数据一次性返回。
b. 转换流(InputStreamReader / OutputStreamReader) 它是字符流和字节流之间的桥梁,该流对象中可以对读取到的字节数据进行指定编码的编码转换。 构造方法有
InputStreamReader(InputStream); //通过构造函数初始化,使用的是本系统默认的编码表GBK。
InputStreamReader(InputStream,String charSet); //通过该构造函数初始化,可以指定编码表。
OutputStreamWriter(OutputStream); //通过该构造函数初始化,使用的是本系统默认的编码表GBK。
OutputStreamwriter(OutputStream,String charSet); //通过该构造函数初始化,可以指定编码表。
c. 数据流(DataInputStream / DataOutputStream) 数据流可以方便地对一些基本类型数据进行直接的存储和读取,不需要再进一步进行转换。
int readInt();//一次读取四个字节,并将其转成int值
writeInt(int);//一次写入四个字节,注意和write(int)不同,write(int)只将该整数的最低一个8位写入,剩余三个8为丢失
short readShort();
writeShort(short);
String readUTF();//按照utf-8修改版读取字符,注意,它只能读writeUTF()写入的字符数据。
writeUTF(String);//按照utf-8修改版将字符数据进行存储,只能通过readUTF读取。
在使用数据流进行数据存储的时候要按照一定的先进先出的顺序进行。
d. 打印流(PrintStream / PrintWriter)
PrintStream是一个字节打印流,System.out对应的类型就是PrintStream,它的构造函数可以接受三种数据类型的值:1.字符串路径。2.File对象 3.OutputStream
。