缓冲流
-
处理流:缓冲流为处理流的一种,处理流,即“套装”在已有的流的基础上
-
缓冲流动的作用:提高流的读取、写入的速度
-
提高读写速度的原因:内部提供了一个缓冲区
-
BufferedInputStream
-
BufferedOutputStream
package www.bh.c.iotest;
import java.io.*;
public class Test8 {
public static void main(String[] args) {
BufferedInputStream bufferedInputStream = null;
BufferedOutputStream bufferedOutputStream = null;
try {
//1.创建File类的对象,指明文件读取和写入的对象
File file = new File("calss\\Java.png");
File file1 = new File("calss\\Java2.png");
//2.创建流
//2.1创建节点流
FileInputStream fileInputStream = new FileInputStream(file);
FileOutputStream fileOutputStream = new FileOutputStream(file1);
//2.1创建缓冲流
bufferedInputStream = new BufferedInputStream(fileInputStream);
bufferedOutputStream = new BufferedOutputStream(fileOutputStream);
//3.复制图片
byte[] b=new byte[10];
int len;
while ((len=fileInputStream.read(b))!=-1){
fileOutputStream.write(b,0,len);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
//4.关闭流资源
//先关闭外面的流,再关闭里面的流
//注:关闭外层流的同时,内层流也会关闭
try {
if (bufferedInputStream!=null){
bufferedInputStream.close();
}
} catch (IOException e) {
e.printStackTrace();
}
try {
if (bufferedOutputStream!=null){
bufferedOutputStream.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
- BufferedReader
- BufferedWriter
package www.bh.c.iotest;
import java.io.*;
//使用BufferedReader和BufferedWrite实现文本的复制
public class Test9 {
public static void main(String[] args) {
Test9 test9 = new Test9();
String srcPath="E:\\Test\\calss\\hello1.txt";
String destPath="E:\\Test\\calss\\hello3.txt";
long startTime=System.currentTimeMillis();
test9.bufferedTest(srcPath,destPath);
long endTime=System.currentTimeMillis();
System.out.println("处理时间为:"+(endTime-startTime));
}
public void bufferedTest(String srcPath,String destPath) {
//创建文件
BufferedReader bufferedReader = null;
BufferedWriter bufferedWriter = null;
try {
File file = new File(srcPath);
File file1 = new File(destPath);
//创建流
//创建节点流
FileReader fileReader = new FileReader(file);
FileWriter fileWriter = new FileWriter(file1);
//创建缓冲流
bufferedReader = new BufferedReader(fileReader);
bufferedWriter = new BufferedWriter(fileWriter);
//读写文件
char[] chars = new char[5];
int len;
while ((len=bufferedReader.read(chars))!=-1){
bufferedWriter.write(chars,0,len);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
//关闭流资源
try {
if (bufferedReader!=null){
bufferedReader.close();
}
} catch (IOException e) {
e.printStackTrace();
}
try {
if (bufferedWriter!=null){
bufferedWriter.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
- 总结:
- FileInputStream:read(byte[] buffer)
- FileOutputStream:write(byte[] buffer,0,len)
- FileReader:read(char[] cbuf)
- FileWrite:write(char[] cbuf,0,len)
- BufferedInputStream:read(byte[] buffer)
- BufferedOutputStream:write(byte[] buffer,0,len)
- BufferedReader:read(char[] cbuf)/readerLine()
- BufferedWriter:write(char[] cbuf,0,len)
- 练习1:图片的加密和解密
package www.bh.c.iotest;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class Test10 {
public static void main(String[] args) {
FileInputStream fileInputStream = null;
FileOutputStream fileOutputStream = null;
try {
//创建文件对象
File file = new File("calss\\Java.png");
File file1 = new File("calss\\Java1.png");
//创建流
fileInputStream = new FileInputStream(file);
fileOutputStream = new FileOutputStream(file1);
//复制图片并加密
byte[] b=new byte[20];
int len;
while ((len=fileInputStream.read(b))!=-1){
for (int i=0;0<len;i++){
b[i]=(byte)(b[i] ^ 5);//图片加密,字节数组进行修改
}
// for (int i=0;0<len;i++){
// b[i]=(byte)(b[i]^5);//图片解密
// }
fileOutputStream.write(b,0,len);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
//关闭流资源
if (fileInputStream!=null){
try {
fileInputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (fileOutputStream!=null){
try {
fileOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
- 练习2:获取文本上字符出现的次数并输出
/*
思路:1.遍历文本每一个字符
2.字符出现的次数存到map中
3.把map中的数据写入文件*/
package www.bh.c.iotest;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class Test11 {
public static void main(String[] args) {
FileReader fileReader = null;
BufferedWriter bufferedWriter = null;
try {
//1.创建map集合
Map<Character, Integer> map = new HashMap<>();
//2.遍历每一个字符,每一个字符出现的次数放到map中
fileReader = new FileReader("calss\\hello1.txt");
int len=0;
while ((len=fileReader.read())!=-1){
//int还原char
char c=(char) len;
//判断char是否在map中第一次出现
if (map.get(c)==null){
map.put(c,1);
}else {
map.put(c,map.get(c)+1);
}
}
//3.将map中数据存放到文件中
//3.1创建Writer
FileWriter fileWriter = new FileWriter("calss\\hello2.txt");
bufferedWriter = new BufferedWriter(fileWriter);
//3.2遍历map,再写入数据
Set<Map.Entry<Character, Integer>> entries = map.entrySet();
for (Map.Entry<Character, Integer> enter:entries){
switch (enter.getKey()){
case ' ':
bufferedWriter.write("空格="+enter.getValue());
break;
case '\t'://"\t"表示tab键字符
bufferedWriter.write("tab键="+enter.getValue());
break;
case '\r':
bufferedWriter.write("回车="+enter.getValue());
break;
case '\n':
bufferedWriter.write("换行="+enter.getValue());
break;
default:
bufferedWriter.write(enter.getKey()+"="+enter.getValue());
break;
}
bufferedWriter.newLine();
}
} catch (IOException e) {
e.printStackTrace();
} finally {
//4.关闭流资源
if (fileReader!=null){
try {
fileReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (bufferedWriter!=null){
try {
bufferedWriter.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}