缓冲流
缓冲流的作用
作用:缓冲流的作用主要是提高文件的读写效率
提高速度的原因:内部提供了一个缓冲区
实现非文件的复制
注意:
- 资源关闭,先关外面再关里面
- 说明:关闭外层流的同时,内层流也会自动的进行关闭。关于内层流的关闭,我们可以省略
步骤:
- 创建文件
- 创建节点流
- 创建缓冲流
- 读取与写入
package com.dreamcold.io;
import java.io.*;
public class Demo07 {
public static void main(String[] args) {
BufferedInputStream bis=null;
BufferedOutputStream bos=null;
try {
File srcFile=new File("image.jpg");
File destFile=new File("image1.jpg");
//造流
//创建节点流
FileInputStream fis=new FileInputStream(srcFile);
FileOutputStream fos=new FileOutputStream(destFile);
//造缓冲流
bis=new BufferedInputStream(fis);
bos=new BufferedOutputStream(fos);
//复制的细节写入
byte[] buffer=new byte[10];
int len;
while ((len=bis.read(buffer))!=-1){
bos.write(buffer,0,len);
}
}catch (IOException e){
e.printStackTrace();
}finally {
//资源关闭,先关外面再关里面
//说明:关闭外层流的同时,内层流也会自动的进行关闭。关于内层流的关闭,我们可以省略
try {
if (bos!=null)
bos.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
if (bis!=null)
bis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
效果
BufferReader和BufferWriter
- 使用char[]数组读取
package com.dreamcold.io;
import java.io.*;
public class Demo08 {
public static void main(String[] args) {
BufferedReader br=null;
BufferedWriter bw=null;
try {
br=new BufferedReader(new FileReader(new File("test.txt")));
bw=new BufferedWriter(new FileWriter(new File("test1.txt")));
char[] cbuf=new char[1024];
int len;
//读写操作
while((len=br.read(cbuf))!=-1){
bw.write(cbuf,0,len);
}
//关闭资源
br.close();
bw.close();
}catch (IOException e){
e.printStackTrace();
}finally {
try {
if (br!=null){
br.close();
}
}catch (IOException e){
e.printStackTrace();
}
try {
if (bw!=null){
bw.close();
}
}catch (IOException e){
e.printStackTrace();
}
}
}
}
效果:
- 使用String来进行读取
package com.dreamcold.io;
import java.io.*;
public class Demo09 {
public static void main(String[] args) {
BufferedReader br=null;
BufferedWriter bw=null;
try {
br=new BufferedReader(new FileReader(new File("test.txt")));
bw=new BufferedWriter(new FileWriter(new File("test1.txt")));
String data;
while ((data=br.readLine())!=null){
bw.write(data+"
");
}
//关闭资源
br.close();
bw.close();
}catch (IOException e){
e.printStackTrace();
}finally {
try {
if (br!=null){
br.close();
}
}catch (IOException e){
e.printStackTrace();
}
try {
if (bw!=null){
bw.close();
}
}catch (IOException e){
e.printStackTrace();
}
}
}
}
效果:
- 写入部分的代码还可以这样写:解决换行问题
String data;
while ((data=br.readLine())!=null){
bw.write(data);
bw.newLine();
}
缓冲流的练习
比较缓冲流与字节流效率
分别使用节点流: FilelnputStream、 FileOutputStream和缓冲流:BufferedInputStream、BufferedDutputStream实现文 木文件/图片/视频文件的复制。并比较二者在数据复制方面的效率
- 字节流可以实现文本的复制,但是推荐字符流来处理
- 缓冲流更有效率
实现图片加密操作
package com.dreamcold.io;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class Demo10 {
public static void main(String[] args) throws IOException {
FileInputStream fis=new FileInputStream("image.jpg");
FileOutputStream fos=new FileOutputStream("image1.jpg");
byte[] buffer=new byte[1024];
int len;
while ((len=fis.read(buffer))!=-1){
//字节数组进行加密操作
for (int i=0;i<len;i++){
buffer[i]=(byte)(buffer[i]^5);
}
fos.write(buffer,0,len);
}
if (fos!=null)
fos.close();
if (fis!=null)
fis.close();
}
}
加密效果:
解密:
package com.dreamcold.io;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class Demo10 {
public static void main(String[] args) throws IOException {
FileInputStream fis=new FileInputStream("image1.jpg");
FileOutputStream fos=new FileOutputStream("image3.jpg");
byte[] buffer=new byte[1024];
int len;
while ((len=fis.read(buffer))!=-1){
//字节数组进行加密操作
for (int i=0;i<len;i++){
buffer[i]=(byte)(buffer[i]^5);
}
fos.write(buffer,0,len);
}
if (fos!=null)
fos.close();
if (fis!=null)
fis.close();
}
}
结果:
统计字符出现次数
获取文本上每个字符出现的次数
提示:遍历文本的每一个字符:字符及出现的次数保存在Map中;将Map中数据写入文件
package com.dreamcold.io;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
public class Demo11 {
public static void main(String[] args) {
FileReader fr=null;
BufferedWriter bw=null;
try {
Map<Character,Integer> map=new HashMap<>();
fr=new FileReader("test.txt");
int c=0;
while ((c=fr.read())!=-1){
char ch=(char)c;
if(map.get(ch)==null){
map.put(ch,1);
}else{
map.put(ch,map.get(ch)+1);
}
}
}catch (IOException e){
e.printStackTrace();
}finally {
try {
if (fr!=null)
fr.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
if (bw!=null)
bw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
//将统计结果HashMap写入文件,略
}
}