1. 缓冲流的原理
今天我们要见识一些更强大的流。比如能够高效读写的缓冲流,能够转换编码的转换流,能够持久化存储对象的序列化流等等。这些功能更为强大的流,都是在基本的流对象基础之上创建而来的,就像穿上铠甲的武士样,相当于是对基本流对象的一种增强。
2. BufferedOutputStream:字节缓冲
缓冲流,也叫高效流,是对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();
}
}
3. BufferedInputStream:字节缓冲
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();
}
}
4. 文件复制练习
文件复制练习:一读一写
明确:
数据源: 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)+ "毫秒");
}
}
5. 字符缓冲输出流:BufferedWriter
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();
}
}
6. 字符缓冲输入流:BufferedReader
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();
}
}
7. 练习:对文本的内容进行排序
练习:
对文本的内容进行排序
按照(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();
}
}