• Java-IO流系列-缓冲流


    缓冲流

    缓冲流的作用

    作用:缓冲流的作用主要是提高文件的读写效率

    提高速度的原因:内部提供了一个缓冲区

    实现非文件的复制

    注意:

    1. 资源关闭,先关外面再关里面
    2. 说明:关闭外层流的同时,内层流也会自动的进行关闭。关于内层流的关闭,我们可以省略

    步骤:

    1. 创建文件
    2. 创建节点流
    3. 创建缓冲流
    4. 读取与写入
    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();
                }
            }
         
        }
    }
    
    

    效果

    image-20210117204239136

    BufferReader和BufferWriter

    1. 使用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();
               }
           }
        }
    }
    

    效果:

    image-20210118155811118

    1. 使用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();
                }
            }
        }
    }
    

    效果:

    image-20210118160322533

    1. 写入部分的代码还可以这样写:解决换行问题
     			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();
        }
    }
    

    加密效果:

    image-20210118162018797

    解密:

    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();
        }
    }
    

    结果:

    image-20210118162151608

    统计字符出现次数

    获取文本上每个字符出现的次数
    提示:遍历文本的每一个字符:字符及出现的次数保存在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写入文件,略
        }
    }
    
    
  • 相关阅读:
    [luogu1540]机器翻译 (模拟/vector练习)
    牛客网数据库SQL实战解析(1-10题)
    Spark本地配置
    zookeeper基本配置以及一些坑
    更改默认Xcode
    速记OSI七层协议模型
    实用的git log用法
    Mac上如果看不到.git目录的解决方法
    Mac上Safari不能关键字搜索
    今天开始写技术博客,聊技术,聊梦想,共同成长!
  • 原文地址:https://www.cnblogs.com/mengxiaoleng/p/14940206.html
Copyright © 2020-2023  润新知