今天我们要见识一些更强大的流。比如能够高效读写的缓冲流,能够转换编码的转换流,能够持久化存储对象的序列化流等等。这些功能更为强大的流,都是在基本的流对象基础之上创建而来的,就像穿上铠甲的武士样,相当于是对基本流对象的一种增强。
缓冲流,也叫高效流,是对4个基本的FileXxx流的增强,所以也是4个流,按照数据类型分类:
字节缓冲流: BufferedInputStream,BufferedoutputStream字符缓冲流: BufferedReadeF,BufferedWriter缓冲流的基本原理, 是在创建流对象时,会创建一个内置的默认大小的缓冲区数组 ,通过缓冲区读写,减少系统I/O次数,从而提高读写的效率.
java. io. BufferedOutputStream extends OutputStream BufferedoutputStream:字节缓冲输出流 继承自父类的共性成员方法:
public void close() :关闭此输出流并释放与此流相关联的任何系统资源。public void flush() :刷新此输出流并强制任何缓冲的输出字节被写出。public void write(byte[] b):将b. length字节从指定的字节数组写入此输出流。public void write(byte[] b, int off, int len) :从指定的字节数组写入Len字节, 从偏移量off开始输出到此输出流。public abstract void write(int b) :将指定的字节输出流。构造方法:
BufferedoutputStream(OutputStream out)创建一 个新的缓 冲输出流,以将数据写入指定的底层输出流。Bufferedoutputstream(OutputStream out, int size)创建一 个新的缓冲输出流,以将具有指定缓冲区大小的数据写入指定的底层输参数:
OutputStream out :字节输出流。我们可以传递FileOutputStream,缓冲流会给FiLeOutputStream增加一个缓冲区,提高FiLeOutputStream的写入效率int size :指定缓冲流内部缓冲区的大小,不指定默认使用步骤(重点)
创建FiLeOutputStream对象,构造方法中绑定要输出的目的地创建BufferedOutputStream对象,构造方法中传递FileOutputStream对象对象,提高FiLeOutputStream对象效率使用BufferedoutputStream对象中的方法write,把数据写入到内部缓冲区中使用Buffered0utputStream对象中的方法flush,把内部缓冲区中的数据,刷新到文件中释放资源(会先调用fLush方法刷新数据,第4部可以省略) package cn.itcast.day13.demo05; import java.io.BufferedOutputStream; import java.io.FileOutputStream; import java.io.IOException; public class BufferedOutputStream01 { public static void main(String[] args) throws IOException { FileOutputStream fos = new FileOutputStream("C:\\Users\\x\\Desktop\\All of D\\test2\\out.txt"); BufferedOutputStream bos = new BufferedOutputStream(fos); bos.write("把数据写入到缓冲区中".getBytes()); bos.flush(); bos.close(); } }jjava. io. BufferedInputStream extends InputStream jBufferedInputStream:字节缓冲输入流 继承自父类的成员方法:
int read()从输入流中读取数据的下一个字节。int read(byte[] b)从输入流中读取一定数量的字节,并将其存储在缓冲区数组b中。void close() 关闭此输入流并释放与该流关联的所有系统资源。构造方法:
BufferedInputstream( InputStream in)创建一个BufferedInputstream 并保存其参数,即输入流in, 以便将来使用。BufferedInputStream( InputStream in, int size) 创建具有指定缓冲区大小的BufferedInputStream 并保存其参数,即输入流.参数:
InputStream in:字节输入流 我们可以传递FileInputStream,缓冲流会给FileInputStream增加一个缓冲区,提高FileInputStream的读取效率int size:指定缓冲流内部缓冲区的大小,不指定默认使用步骤(重点):
创建FileInputStream对象,构造方法中绑定要读取的数据源创建BufferedInputStream对象,构造方法中传递FiLeInputStream对象,提高FiLeInputStream对象的读取效率使用BufferedInputStream对象中的方法read,读取文件释放资源 package cn.itcast.day13.demo05; import java.io.BufferedInputStream; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; public class BufferedInputStream01 { public static void main(String[] args) throws IOException { FileInputStream fis = new FileInputStream("C:\\Users\\x\\Desktop\\All of D\\test2\\out.txt"); BufferedInputStream bis = new BufferedInputStream(fis); int len = 0; while((len = bis.read())!=-1){ System.out.println(len); } bis.close(); } }文件复制练习:一读一写 明确: 数据源: c:\1.jpg 数据的目的地: d:\1.jpg 文件复制的步骤:
创建字节缓冲输入流对象,构造方法中传递字节输入流创建字节缓冲输出流对象,构造方法中传递字节输出流使用字节缓冲输入流对象中的方法read,读取文件使用字节缓冲输出流中的方法write,把读取的数据写入到内部缓冲区中释放资源(会先把缓冲区中的数据,刷新到文件中) package cn.itcast.day13.demo05; import java.io.*; public class CopyFile { public static void main(String[] args) throws IOException { long s = System.currentTimeMillis(); BufferedInputStream bis = new BufferedInputStream(new FileInputStream("C:\\Users\\x\\Desktop\\All of D\\test2\\2.jpg")); BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("C:\\Users\\x\\Desktop\\All of D\\2.jpg")); // int len = 0; // while((len = bis.read())!=-1){ // bos.write(len); // } //使用数组缓冲读取多个字节,写入多个字节 byte[] bytes = new byte[1024]; int len = 0; while((len = bis.read())!=-1){ bos.write(bytes,0,len); } bos.close(); bis.close(); long e = System.currentTimeMillis(); System.out.println("复制文件共耗时:" + (e-s)+ "毫秒"); } }java. io. Bufferedwriter extends writer Bufferedwriter :字符缓冲输出流 继承自父类的共性成员方法: void write(int c)写入单个字符。 void write(char[] cbuf)写入字符数组。 abstract void write(char[] cbuf, int off, int len)写入字符数组的某- 一部分, off数组的开始索引, len写的字符个数。 void write(String str)写入字符串。 void write(String str, int off, int Len) 写入字符串的某-部分, off字符串的开始索引, len写的字符个数。 void flush()刷新该流的缓冲。 void close() 关闭此流,但要先刷新它。
构造方法: Bufferedwriter(Writer out)创建一个使用默认大小输出缓冲区的缓冲字符输出流。 Bufferedwriter(writer out, int sz)创建一一个使用给定大小输出缓冲区的新缓冲字符输出流。 参数: Writer out :字符输出流 我们可以传递Filewriter,缓冲流会给FileWriter增加一-个缓冲区, 提高Filewriter的写入效率 int sz:指定缓冲区的大小,不写默认大小
void newLine()写入一个行分隔符。会根据不同的操作系统,获取不同的行分隔符 换行:换行符号 windows: \r\n linux:/n mac:/r 使用步骤: 1.创建字符缓冲输出流对象,构造方法中传递字符输出流 2.调用字符缓冲输出流中的方法write ,把数据写入到内存缓冲区中 3.调用字符缓冲输出流中的方法flush,把内存缓冲区中的数据,刷新到文件中 4.释放资源
package cn.itcast.day13.demo05; import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException; public class BufferedWriter01 { public static void main(String[] args) throws IOException { BufferedWriter bw = new BufferedWriter(new FileWriter("C:\\Users\\x\\Desktop\\All of D\\test2\\buf.txt")); for(int i = 0; i < 10; i++ ){ bw.write("刘亦菲"); bw.newLine(); } bw.flush(); bw.close(); } }java. io. BufferedReader extends Reader 继承自父类的共性成员方法: int read() 读取单个字符并返回。. int read(char[] cbuf)一次读取多个字符,将字符读入数组。 void close() 关闭该流并释放与之关联的所有资源。
构造方法: BufferedReader(Reader in)创建一 个使 用默认大小输入缓冲区的缓冲字符输入流。 BufferedReader(Reader in, int SZ) 创建一-个使用指定大小输入缓冲区的缓冲字符输入流。 参数: Reader in:字符输入流 我们可以传递FileReader, 缓冲流会给FileReader增加一-个缓冲区。提高FileReader的读取效率 特有的成员方法: String readline() 读取- -个文本行。读取- -行数据 行的终止符号:通过下列字符之一即可认为某行已终止: 换行(’\n’). 回车(’\r’) 或回车后直接跟着换行(\r\n)。 返回值: 包含该行内容的字符串,不包含任何行终止符,如果已到达流末尾,则返回null 使用步骤: 1.创建字符缓冲输入流对象,构造方法中传递字符输入流 2.使用字符缓冲输入流对象中的方法read/readL ine读取文本 3.释放资源
package cn.itcast.day13.demo05; import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; public class BufferedReader01 { private static String NUll; public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new FileReader("C:\\Users\\x\\Desktop\\All of D\\test2\\buf.txt")); String line; while((line = br.readLine())!=NUll){ System.out.println(line); } br.close(); } }练习: 对文本的内容进行排序 按照(1,2,3… )顺序排序. 分析: 1.创建一个HashMap集合对象, 可以:存储每行本的序号CI 2日,小uolue:存储每行的文 本 2.创建字符缓冲输入流对象,构造方法中绑定字符输入流 3.创建字符缓冲输出流对象,构造方法中绑定字符输出流 4.使用字符缓冲输入流中的方法readline,逐行读取文本 5.对读取到的文本进行切割,获取行中的序号和文本内容 6.把切割好的序号和文本的内容存储到HashMap集合中(key序号是有序的,会自动排序1,2,3,4…) 7.遍历HashMap集合,获取每一个键值对 8.把每一一个键值对,拼接为一-个文本行 9.把拼接好的文本,使用字符缓冲输出流中的方法write,写入到文件中 10.释放资源
package cn.itcast.day13.demo05; import java.io.*; import java.util.HashMap; public class Practice { public static void main(String[] args) throws IOException { HashMap<String,String> map = new HashMap<>(); BufferedReader br = new BufferedReader(new FileReader("C:\\Users\\x\\Desktop\\All of D\\in.txt")); BufferedWriter bw = new BufferedWriter(new FileWriter("C:\\Users\\x\\Desktop\\All of D\\out.txt")); String line0; while((line0 = br.readLine())!=null){ String[] arr = line0.split("\\."); map.put(arr[0],arr[1]); } for(String key : map.keySet()){ String value = map.get(key); line0 = key + "." + value; bw.write(line0); bw.newLine(); } bw.close(); br.close(); } }