概述
缓冲流也叫高效流,是对4个基本的FileXxx流的增强,按照数据类型分:
- 字节缓冲流:BufferedInputStream、BufferedOutputStream
- 字符缓冲流:BufferedReader,BufferedWriter
缓冲流的原理,在创建流对象时,会创建一个内置的默认大小的缓冲区数组,通过换冲区读写,减少系统IO次数,从而提高读写效率
字节缓冲输出流BufferedOutputStream
-
该类实现缓冲输出流。 通过设置这样的输出流,应用程序可以向底层输出流写入字节,而不必为写入的每个字节导致底层系统的调用。改类继承FilterOutputStream
-
构造方法
/* BufferedOutputStream(OutputStream out) 创建一个新的缓冲输出流,以将数据写入指定的底层输出流。 BufferedOutputStream(OutputStream out, int size) 创建一个新的缓冲输出流,以便以指定的缓冲区大小将数据写入指定的底层输出流。 */
- 方法
/* void flush() 刷新缓冲输出流。 void write(byte[] b, int off, int len) 从偏移量 off开始的指定字节数组写入 len字节到缓冲输出流。 void write(int b) 将指定的字节写入缓冲的输出流。 使用步骤: 1、创建FileOutputStream对象,构造方法中绑定要输出的目的地 2、创建BufferedOutputStream对象,构造方法中传递FileOutputStream对象,提高FileOutputStream对象效率 3、使用BufferedOutputStream对象中的write方法,把数据写入到内部缓冲区中 4、使用BufferedOutputStream对象中的flush方法,把内部缓冲区中的数据刷新到文件中 5、释放资源(会先调用flush方法刷新数据,第4步可以省略) */
try { FileOutputStream fos = new FileOutputStream("day14\\src\\g.txt"); BufferedOutputStream bos = new BufferedOutputStream(fos); bos.write("我把数据写入内部缓冲区".getBytes()); bos.close(); } catch (Exception e) { e.printStackTrace(); }
字节缓冲输入流BufferedInputStream
- BufferedInputStream为另一个输入流添加了功能,即缓冲输入并支持mark和reset方法的功能。 创建BufferedInputStream将创建一个内部缓冲区数组。 当从流中读取或跳过字节时,内部缓冲区将根据需要从所包含的输入流中重新填充,一次很多字节。mark操作会记住输入流中的一个点,并且reset操作会导致从最近的mark操作读取的所有字节在从包含的输入流中取出新字节之前重新读取。 改类叫字节缓冲输入流,继承FilterInputStream
- 构造方法
/* BufferedInputStream(InputStream in) 创建一个 BufferedInputStream并保存其参数,输入流 in供以后使用。 BufferedInputStream(InputStream in, int size) 创建具有指定缓冲区大小的 BufferedInputStream ,并保存其参数,输入流 in供以后使用。 */
- 方法
/* int read() 见 read法 InputStream的一般合同。 int read(byte[] b, int off, int len) 使用步骤 1、创建FileInputStream对象,构造方法中绑定要读取的数据源 2、创建BufferedInputStream对象,构造方法中传递FileInputStream对象,提高FileOutputStream对象效率 3、使用BufferedInputStream对象中的read方法,读取文件 4、释放资源 */
try { FileInputStream fis = new FileInputStream("day14\\src\\g.txt"); BufferedInputStream bis = new BufferedInputStream(fis); byte[] b=new byte[1024]; int len= bis.read(b); bis.close(); System.out.println(new String(b,0,len)); } catch (IOException e) { e.printStackTrace(); }
字符缓冲输出流BufferedWriter
-
将文本写入字符输出流,缓冲字符,以提供单个字符,数组和字符串的高效写入。
可以指定缓冲区大小,或者可以接受默认大小。 默认值足够大,可用于大多数用途。改类继承Writer -
构造方法
BufferedWriter(Writer out) 创建使用默认大小的输出缓冲区的缓冲字符输出流。 BufferedWriter(Writer out, int sz) 创建一个新的缓冲字符输出流,使用给定大小的输出缓冲区。
-
方法
void close() 关闭流,先刷新。 void flush() 刷新流。 void newLine() 写一行行分隔符。(根据不同的系统获取的行分隔符) void write(char[] cbuf, int off, int len) 写入字符数组的一部分。 void write(int c) 写一个字符 void write(String s, int off, int len) 写一个字符串的一部分。 使用步骤: 1、创建字符缓冲输出流对象,构造方法中传递字符输出流 2、调用字符缓冲输出流的方法write,把数据写入到内存缓冲区中 3、调用字符缓冲输出流的方法flush,把内存缓冲区中的数据刷新到文件中 4、释放资源
try { BufferedWriter bw=new BufferedWriter(new FileWriter("day14\\src\\h.txt")); bw.write("dndagnangaewop"); // 把dndagnangaewop写入h.txt bw.newLine(); // 把换行写入h.txt bw.write("hello"); // 把hello写入h.txt bw.flush(); bw.close(); } catch (IOException e) { e.printStackTrace(); }
字符缓冲输入流BufferedReader
-
从字符输入流读取文本,缓冲字符,以提供字符,数组和行的高效读取。可以指定缓冲区大小,或者可以使用默认大小。 默认值足够大,可用于大多数用途。通常,由读取器做出的每个读取请求将引起对底层字符或字节流的相应读取请求。 因此,建议将BufferedReader包装在其read()操作可能昂贵的读取器上,例如FileReaders和InputStreamReaders。 改类继承Reader
-
构造方法
BufferedReader(Reader in) 创建使用默认大小的输入缓冲区的缓冲字符输入流。 BufferedReader(Reader in, int sz) 创建使用指定大小的输入缓冲区的缓冲字符输入流。
-
方法
void close() 关闭流并释放与之相关联的任何系统资源。 int read() 读一个字符 int read(char[] cbuf, int off, int len) 将字符读入数组的一部分。 String readLine() 读一行文字。 一行被视为由换行符('\ n'),回车符('\ r')中的任意一个,紧跟换行符的回车符或通过到达文件末尾终止(EOF)。 结果:一个包含行的内容的字符串,不包括任何行终止字符,如果没有读取任何字符,如果流的结尾已经到达,则为null 使用步骤: 1、创建字符缓冲输入流对象,构造方法中传递字符输入流 2、使用字符缓冲输入流对象中的方法read/readLine读取文本 3、释放资源
try { BufferedReader br = new BufferedReader(new FileReader("day14\\src\\h.txt")); String s; while ((s=br.readLine())!=null){ System.out.println(s); } br.close(); } catch (Exception e) { e.printStackTrace(); }
案例
-
对文本的内容进行排序
// 文本内容如下 5.你好 2.hello 4.风景 3.山峰 1.river
HashMap<String,String> map=new HashMap<>(); try { BufferedReader br = new BufferedReader(new FileReader("day14\\src\\h.txt")); BufferedWriter bw = new BufferedWriter(new FileWriter("day14\\src\\i.txt")); String line; while ((line=br.readLine())!=null){ String[] arr=line.split("\\."); map.put(arr[0],arr[1]); } for(String key:map.keySet()){ String value=map.get(key); line=key+"."+value; bw.write(line); bw.newLine(); } bw.close(); } catch (Exception e) { e.printStackTrace(); }
// 排序后文件内容 1.river 2.hello 3.山峰 4.风景 5.你好