IO流有字符流和字节流
FileReader
FileWriter。
BufferedReader
BufferedWriter
字节流:
FileInputStream
FileOutputStream
BufferedInputStream
BufferedOutputStream
其中加入buffered的前缀的是缓冲区对象,缓冲区对象的创建要先有流对象的存在,缓冲的存在是为了增强流的功能而存在,其实缓冲区内部也是使用流对象方法,只不过是将数据先存在临时创建的数组对象中,为了提高程序的效率
建立缓冲区对象必须把流对象作为参数传递给缓冲区的构造函数。
BufferedWriter bufw = new BufferedWriter(new FileWriter("buf.txt")); bufw.write("abce");//将数据写入到了缓冲区。
bufw.flush();//对缓冲区的数据进行刷新。将数据刷到目的地中。
bufw.close();//关闭缓冲区,其实关闭的是被包装在内部的流对象。
字节流和字符流的区别:
1,字节流读取的时候,读到一个字节就返回一个字节。 字符流使用了字节流读到一个或多个字节(中文对应的字节数是两个,在UTF-8 码表中是3个字节)时。先去查指定的编码表,将查到的字符返回。
2,字节流可以处理所有类型数据,如图片,mp3,avi。 而字符流只能处理字符数据。所以若是是处理纯文本数据,就要优先考虑使用字符流。除此之外都用字节流。
在IO流中,当流对象使用完后必须关闭,否则会消耗系统资源。
以下是IO流缓冲区对象的读写:
public static void main(String[] args) {
BufferedReader bufr = new BufferedReader(new FileReader("a.txt"));
BufferedWriter bufw = new BufferedWriter(new FileWriter("b.txt"));
String line = null;
while((line=bufr.readLine())!=null) {
bufw.write(line);
bufw.newLine();
bufw.flush();
}
bufw.close();
bufr.close();
}
readLine():方法的原理: 其实缓冲区中的该方法,用的还是与缓冲区关联的流对象的read方法。 只不过,每一次读到一个字符,先不进行具体操作,先创建数组进行临时存储数据。 当读取到回车标记时,将临时容器中存储的数据一次性返回。
当read的方法都读完是会返回一个-1,这是因为而在所操作的数据中的很容易出现连续多个1的情况,而连续读到8个1,就是-1. 导致读取会提前停止。
转换流:
特点:
1,是字节流和字符流之间的桥梁。
2,该流对象中可以对读取到的字节数据进行指定编码表的编码转换。
什么时候使用呢?
1,当字节和字符之间有转换动作时。
2,流操作的数据需要进行编码表的指定时。 具体的对象体现:
1,InputStreamReader:字节到字符的桥梁。
2,OutputStreamWriter:字符到字节的桥梁。
这两个流对象是字符流体系中的成员。
那么它们有转换作用,而本身又是字符流。所以在构造的时候,需要传入字节流对象进 来。
构造函数:
InputStreamReader(InputStream):通过该构造函数初始化,使用的是本系统默认的编码表。 InputStreamReader(InputStream,String charSet):通过该构造函数初始化,可以指定编码表。
OutputStreamWriter(OutputStream):通过该构造函数初始化,使用的是本系统默认的编码表。 OutputStreamWriter(OutputStream,String charSet):通过该构造函数初始化,可以指定编码 表
操作文件的字符流对象是转换流的子类。
如:FileRead是InputStreamReader的子类,FileWritre是OutputStreamWriter的子类
如果要使用指定编码时,要使用字符流