zoukankan      html  css  js  c++  java
  • 【Java】Input,Output,Stream I/O流 02 文件流 & 缓冲流

    Reader & Writter 只适合文本的输入输出 【.txt .java .c .cpp】

    传输文件,不能使用文本IO进行读写,需要使用文件输入输出流

    public class IOTest {
        public static void main(String[] args) throws Exception {
            // 文件输入输出
    
            // 图片文件测试复制
            File srcImg = new File("1774415.jpg");
            // 新图片文件
            File destImg = new File("new.jpg");
    
            // 写入对象
            InputStream inputStream = new FileInputStream(srcImg);
    
            // 写出对象
            OutputStream outputStream = new FileOutputStream(destImg);
    
            // 缓冲字节数组
            byte[] bytesBuffer = new byte[10];
            // 返回个数
            int len;
            while ( (len = inputStream.read(bytesBuffer)) != -1){
                // 写入数据
                outputStream.write(bytesBuffer,0,len);
            }
            inputStream.close();
            outputStream.close();
        }
    }

    文件复制的方法封装

        static void fileCopy(String srcPath,String destPath){ // 文件复制的方法封装
            File srcFile = new File(srcPath);
            File destFile = new File(destPath);
            InputStream inputStream = null;
            OutputStream outputStream = null;
            try{
                inputStream = new FileInputStream(srcFile);
                outputStream = new FileOutputStream(destFile);
                byte[] bytesBuffer = new byte[1024]; //2的十次方
                int length; // 当前读取个数
                while ((length = inputStream.read(bytesBuffer)) != -1){
                    outputStream.write(bytesBuffer,0,length);
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                try {
                    outputStream.close();
                    inputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

    缓冲流,提高文件读写效率

    - BufferedInputStream

    - BufferedOutputStream

    - BufferedReader

    - BufferedWritter

        static void bufferFileCopy(String srcPath,String destPath){ // 文件复制的方法封装
            File srcFile = new File(srcPath);
            File destFile = new File(destPath);
            
            InputStream inputStream = null;
            OutputStream outputStream = null;
            
            InputStream bufferInput = null;
            OutputStream bufferOutput = null;
            
            try{
                inputStream = new FileInputStream(srcFile);
                outputStream = new FileOutputStream(destFile);
                
                // 多添加一次缓冲流对象装载
                bufferInput = new BufferedInputStream(inputStream);
                bufferOutput = new BufferedOutputStream(outputStream);
                
                // 调用缓冲输入输出读写文件
                byte[] bytesBuffer = new byte[1024]; //2的十次方
                int length; // 当前读取个数
                while ((length = bufferInput.read(bytesBuffer)) != -1){
                    bufferOutput.write(bytesBuffer,0,length);
              // bufferOutput.flush(); 刷新缓冲数组,但是write已经自带此方法了,所以不用再调用了 } }
    catch (Exception e) { e.printStackTrace(); } finally { try {
              // 先关闭缓冲输入输出对象 bufferInput.close(); bufferOutput.close(); // 在关闭文件输入输出对象 关闭外层流的同时,内存流也会被关闭,这一步可以省略 //outputStream.close(); //inputStream.close(); }
    catch (IOException e) { e.printStackTrace(); } } }

    - BufferedReader 和 BufferedWritter 也是一样套接实现的流对象上

        static void bufferFileCopy(String srcPath,String destPath){ // 文件复制的方法封装
            File srcFile = new File(srcPath);
            File destFile = new File(destPath);
    
            Reader reader = null;
            Writer writer = null;
    
            BufferedReader bufferReader = null;
            BufferedWriter bufferWriter = null;
    
            try{
                reader = new FileReader(srcFile);
                writer = new FileWriter(destFile);
    
                // 多添加一次缓冲流对象装载
                bufferReader = new BufferedReader(reader);
                bufferWriter = new BufferedWriter(writer);
    
                // 调用缓冲输入输出读写文件
                /*byte[] bytesBuffer = new byte[1024]; //2的十次方
                int length; // 当前读取个数
                while ((length = bufferInput.read(bytesBuffer)) != -1){
                    bufferOutput.write(bytesBuffer,0,length);
                }*/
    
                // 采用String读取
                String data;
                while( (data = bufferReader.readLine()) != null){
                    System.out.println(data);
                    bufferWriter.write(data + "\n");// data 不包含换行字符 或者bufferWriter.newLine();
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                try {
                    bufferReader.close();
                    bufferWriter.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

    转换流

    - InputStreamReader 一个字节输入流 转换至 字符输入流

    - OutputStreamWriter 一个字节输出流 转换至 字符输出流

    解码 : 字节 字节数组 -> 字符串 字符数组

    编码: 字符串 字符数组 -> 字节 字节数组

    - 字符集问题  https://www.bilibili.com/video/BV12741127qm

    ASCII 美国标准信息交换码,阿斯克码

    GBK 中国中文编码表升级,兼容更多中文,原GB2312

    Unicode 国际标准码

    UTF-8 中英通用

        static void readFile(String srcPath) throws Exception {
            File file = new File(srcPath);
            InputStream inputStream = new FileInputStream(file);
            InputStreamReader inputReader = new InputStreamReader(inputStream,"UTF-8");
            // new InputStreamReader(inputStream, StandardCharsets.UTF_8);
            // new InputStreamReader(inputStream, "UTF-8"); 一般不写字符集参数,默认使用系统字符集[文件创建时,设置的字符集]
            char[] charsBuffer = new char[12];
            int len;
            while ((len = inputReader.read(charsBuffer)) != -1 ){
                String str = new String(charsBuffer,0,len);
                System.out.println(str);
            }
            inputReader.close();
        }

    文件字符转换的输入输出问题

        static void transFileCopy(String srcPath,String destPath) throws Exception {
            // 创建文件、创建流对象
            File srcFile = new File(srcPath);
            File destFile = new File(destPath);
    
            InputStream inputStream = new FileInputStream(srcFile);
            OutputStream outputStream = new FileOutputStream(destFile);
    
            InputStreamReader inputStreamReader = new InputStreamReader(inputStream,"UTF-8");
            OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream,"GBK");
    
            // 读写过程
            char[] charsBuffer = new char[10];
            int len;
            while ((len = inputStreamReader.read(charsBuffer)) != -1){
                outputStreamWriter.write(charsBuffer,0,len);
            }
    
            // 释放资源
            inputStreamReader.close();
            outputStreamWriter.close();
        }
  • 相关阅读:
    mysql 中 时间函数 now() current_timestamp() 和 sysdate() 比较
    在spring boot 中使用itext和itextrender生成pdf文件
    dockerfile构建的镜像
    在linux环境下使用itext生成pdf
    在spring data jpa中使用自定义转换器之使用枚举转换
    Sping Boot返回Json格式自定义
    【强化学习RL】model-free的prediction和control — MC, TD(λ), SARSA, Q-learning等
    【强化学习RL】必须知道的基础概念和MDP
    【GAN与NLP】GAN的原理 —— 与VAE对比及JS散度出发
    【NLP】使用bert
  • 原文地址:https://www.cnblogs.com/mindzone/p/12751359.html
Copyright © 2011-2022 走看看