Java-缓冲流
一、缓冲流概述
缓冲流:增强基本流的功能,在基本流的基础上演变而来。
按照数据类型进行分类分为:
字节缓冲流:BufferedInputStrem BufferedOutputStream
字符缓冲流:BufferedReader BufferedWriter
缓冲流的基本原理:是在创建流对象时会创建一个内置的默认大小的缓冲区数组,通过缓冲区读写,减少系统的IO次数,提高读写的效率。
二、字节缓冲输出流BufferedOutputStream
字节缓冲输出流构造方法:
BufferedOutputStream(OutputStream out):创建一个新的缓冲输出流。
OutputStream out:字节输出流对象
BufferedOutputStream(OutputStream out, int size)创建一个新的缓冲输出流,以便以指定的缓冲区大小将数据写入指定的底层输出流。
OutputStream out;字节输出流对象
int size:指定字节缓冲区大小,不指定使用默认值
其它常用成员方法可以使用父类OutputStream中常用方法:
public void close():关闭此输出流并释放与此流相关联的任何系统资源。
public void flush():刷新此输出流并强制任何缓冲的输出字节流。
public void write(byte[] b):将b.lengh字节从指定的字节数组写入输出流。一次性写入多个字节,如果写的第一个字节是正数(0-127),显示的时候会查询ASCII表,如果写的第一个字节是负数 ,那么第一个字节会和第二个字节,两个字节组成一个中文显示,查询系统默认编码表(简体中文是GBK)。
public void write(byte[] b,int off,int len):从指定的字节数组写入len字节,从偏移量off(开始的索引)开始输出到此输出流。
public void write(int b):将指定的字节写入输出流。
使用方法:
1.创建一个FileoutputStream对象,指定数据输出路径。
2.创建一个BufferedOutputStream对象,构造方法中传递FileoutputStream对象,和指定缓冲区大小,不指定则使用默认值。
3.调用BufferedOutputStream对象的write方法,把数据写入到缓冲区中。
4.使用BufferedOutputStream对象的flush方法,将缓冲区中的数据刷新到指定路径的文件中去。
5.释放资源,在调用close方法之前,其实会先调用flush方法,将数据刷新到文件中去,所以第4步可选择性省略。
import java.io.BufferedOutputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class IoDemo09 {
public static void main(String[] args) throws IOException {
//1.创建一个FileoutputStream对象,指定数据输出路径
FileOutputStream out = new FileOutputStream("D:\\eclipse\\eclipse\\example\\study\\io\\1.txt");
//2.创建一个BufferedOutputStream对象,构造方法中传递FileoutputStream对象,和指定缓冲区大小,不指定则使用默认值
BufferedOutputStream bout = new BufferedOutputStream(out,100);
//3.调用BufferedOutputStream对象的write方法,把数据写入到缓冲区中
//写入单个数据
// bout.write(97);//a
//写入一个字节数组
byte[] bytes = {98,99,97};
bout.write(bytes);//bca
//写入一个字节数组的指定长度部分
// bout.write(bytes, 0, 1);//a
// 4.使用BufferedOutputStream对象的flush方法,将缓冲区中的数据刷新到指定路径的文件中去
bout.flush();
//5.释放资源,在调用close方法之前,其实会先调用flush方法,将数据刷新到文件中去,所以第4步可选择性省略
out.close();
bout.close();
}
}
三、字节缓冲输入流BufferedInputStream
构造方法:
BufferedInputStream(InputStream in)创建一个BufferedInputStream并保存其参数,输入流 in ,供以后使用。
InputStream in;字节输入流对象
BufferedInputStream(InputStream in, int size)创建 BufferedInputStream具有指定缓冲区大小,并保存其参数,输入流 in ,供以后使用。
InputStream out;字节输入流对象
int size:指定字节缓冲区大小,不指定使用默认值
常用方法继承自父类InputStream:
int read():从输入流中读取数据的下一个字节,读取到文件末尾返回-1。
int read(byte[] b):从输入流中读取一定数量的字节,并将其存入缓冲区数组b中。
void close():关闭此输入流并释放有关的所有系统资源。
使用步骤:
1.创建一个InputStream流对象,构造方法中指定读取的路径或者文件。
2.创建BufferedInputStream对象,构造方法中传入InputStream流对象,可以指定大小,也可以不写,使用默认值。
3.调用BufferedInputSteram的read方法,进行文件的读取。
4.释放资源。
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class IoDemo10 {
public static void main(String[] args) throws IOException {
// 1.创建一个InputStream流对象,构造方法中指定读取的路径或者文件
FileInputStream f = new FileInputStream("D:\\eclipse\\eclipse\\example\\study\\io\\1.txt");
//2.创建BufferedInputStream对象,构造方法中传入InputStream流对象,可以指定大小,也可以不写,使用默认值
BufferedInputStream bf = new BufferedInputStream(f);
//3.调用BufferedInputSteram的read方法,进行文件的读取
byte[] bytes = new byte[100];//定义存储数据
while(f.read(bytes)!=-1){//和InputStream一样,读取文件末尾为-1
System.out.print(new String(bytes,0,3));//bca
}
// 4.释放资源
bf.close();
}
}
四、字符缓冲输出流BufferedWriter
构造方法:
BufferedWriter(Writer out)创建使用默认大小的输出缓冲区的缓冲字符输出流。
Writer out;字符输出流对象。
BufferedWriter(Writer out, int size)创建一个新的缓冲字符输出流,使用给定大小的输出缓冲区。
Writer out;字符输出流对象。
int size:指定字节缓冲区大小,不指定使用默认值。
特有操作方法:
void newLine()写一行行分隔符,会根据不同的操作系统获取不同的行分隔符。
其它常用操作方法继承自父类Writer:
void write(int c) 写入单个字符
void write(char[] ch)写入字符数组
void write(String str)写一个字符串
void write(String str, int off, int len)写一个字符串的一部分
abstract void write(char[] ch, int off, int len)写一个字符数组的一部分。
void flush()刷新该流的缓冲
void close():关闭此流,但要先刷新
使用步骤:
1.创建一个FileWriter流对象,构造方法中指定数据输出路径。
2.创建一个BufferedWriter对象,构造方法中传递Writer流对象,根据需要指定缓冲区大小,可以不指定大小,使用默认值。
3.调用BufferedWriter对象中的write方法,进行数据写入到内存缓冲区。
4.使用BufferedWriter中的方法flush,将内存缓冲区中的数据刷新到文件中。
5.释放资源。
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
public class IoDemo11 {
public static void main(String[] args) throws IOException {
//1.创建一个FileWriter流对象,构造方法中指定数据输出路径
FileWriter f = new FileWriter("D:\\eclipse\\eclipse\\example\\study\\io\\1.txt");
// 2.创建一个BufferedWriter对象,构造方法中传递Writer流对象,根据需要指定缓冲区大小,可以不指定大小,使用默认值
BufferedWriter bw = new BufferedWriter(f);
// 3.调用BufferedWriter对象中的write方法,进行数据写入到内存缓冲区
// void write(int c) 写入单个字符
bw.write(99);//c
// void write(char[] ch)写入字符数组
char[] ch={'a','b','c'};
bw.write(ch);//abc
//void newLine()写一行行分隔符,会根据不同的操作系统获取不同的行分隔符
bw.newLine();
//void write(String str)写一个字符串
bw.write("哈哈");//哈哈
// void write(String str, int off, int len)写一个字符串的一部分
String str = "hello";
bw.write(str,0,3);//hel
// 4.使用BufferedWriter中的方法flush,将内存缓冲区中的数据刷新到文件中
bw.flush();
//5.释放资源
bw.close();
}
}
五、字符缓冲输入流BufferedReader
构造方法:
BufferedReader(Reader in)创建使用默认大小的输入缓冲区的缓冲字符输入流。
BufferedReader(Reader in, int size)创建使用指定大小的输入缓冲区的缓冲字符输入流。
特有操作方法:
String readLine()读一行文字(读一行文字。 一行被视为由换行符(’\ n’),回车符(’\ r’)中的任何一个或随后的换行符终止)。
返回值:包含行的内容的字符串,不包括任何行终止字符,如果已达到流的末尾,则为null。
常用操作其它方法继承自父类Reader:
int read():读取单个字符并返回。
int read(char[] ch):一次读取多个字符,将字符存入数组。
void close():关闭流并释放资源。
使用步骤:
1.创建一个FileReader流对象,构造方法中传递读取的文件路径。
2.创建BuffedReader对象,构造方法中传递FileReader流对象,并可以指定缓冲区大小,也可不指定,使用默认大小。
3.调用BufferedReader中的read/readLine方法,进行文本读取。
4.释放资源。
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
public class IoDemo12 {
public static void main(String[] args) throws IOException {
// 1.创建一个FileReader流对象,构造方法中传递读取的文件路径
FileReader f = new FileReader("D:\\eclipse\\eclipse\\example\\study\\io\\1.txt");
//2.创建BuffedReader对象,构造方法中传递FileReader流对象,并可以指定缓冲区大小,也可不指定,使用默认大小
BufferedReader br = new BufferedReader(f);
//3.调用BufferedReader中的read/readLine方法,进行文本读取
int a = br.read();
String str = br.readLine();
System.out.println((char)a);//输出结果:c
System.out.println(str);//输出结果:abc
// 4.释放资源
br.close();
}
}