IO流基础

IO

Input/Output,用于设备之间的数据传输。Java中以流的方式进行数据输入输出。

流的分类:

  • 字节流(8bit)非文本
  • 字符流(16bit)文本类
  • 输入流(数据流向程序)
  • 输出流(程序流出数据)
  • 节点流
  • 处理流(对节点流进行包装优化)
抽象基类字节流字符流
输入流InputStreamReader
输出流OutputStreamWriter

常用流

  • 访问文件(节点流):FileInputStream 。。。
  • 缓冲流(处理流):BufferedInputStream 。。。
  • 对象流:ObjectInputStream 。。。

文件流(节点流)

读取文件(字符流)

一个一个字节读
FileReader fileReader = null;
        try {
            //1.实例化File对象,指定操作的文件
            File file = new File("hello.txt");
            //2.提供具体的流
            fileReader = new FileReader(file);
            //3.数据的读入
            //read()返回值为-1表示读到文件末尾
            int read;
            while ((read = fileReader.read()) != -1){
                System.out.println((char)read);
            }
        }catch (IOException e){
            e.printStackTrace();
        }finally {
            //4.流必须手动关闭,垃圾回收处理不了
            try {
                if(fileReader != null) {
                    fileReader.close();
                }
            }catch (IOException e){
                e.printStackTrace();
            }
        }
多个字节读
        FileReader fileReader = null;
       try {
           File file = new File("hello.txt");
           fileReader = new FileReader(file);
           char[] cbuf = new char[5];
           int len;
           while ((len = fileReader.read(cbuf)) != -1){
               /*for (int i = 0; i < len; i++) {
                   System.out.println(cbuf[i]);
               }*/
               String str = new String(cbuf,0,len);
               System.out.println(str);
           }
       }catch (IOException e){
           e.printStackTrace();
       }finally {
           try {
               if(fileReader != null) {
                   fileReader.close();
               }
           }catch (IOException e){
               e.printStackTrace();
           }
       }

写出数据

FileWriter fileWriter = null;
        try {
            //1.指定写出文件,不存在则会创建
            File file = new File("hello1.txt");
            //2.提供写出流对象,true表示不覆盖原文件,而是追加内容
            fileWriter = new FileWriter(file,true);
            //3.写出操作
            fileWriter.write("Hello FileWriter\n");

        }catch (IOException e){
            e.printStackTrace();
        }finally {
            try {
                if(fileWriter != null) {
                    fileWriter.close();
                }
            }catch (IOException e){
                e.printStackTrace();
            }
        }

读加写

FileReader fileReader = null;
        FileWriter fileWriter = null;
        try {
            File srcFile = new File("hello.txt");
            File destFile = new File("hello2.txt");

            fileReader = new FileReader(srcFile);
            fileWriter = new FileWriter(destFile,true);

            char[] cbuf = new char[5];
            int len;
            while ((len=fileReader.read(cbuf))!=-1){
                fileWriter.write(cbuf,0,len);
            }
        }catch (IOException e){
            e.printStackTrace();
        }finally {
            try {
                if (fileReader!=null){
                    fileReader.close();
                }
                if (fileWriter!=null){
                    fileWriter.close();
                }
            }catch (IOException e){
                e.printStackTrace();
            }
        }
    }

读取和输出图片 (字节流)

FileInputStream fi = null;
        FileOutputStream fo = null;
        try {
            File srcFile = new File("1.jpg");
            File destFile = new File("2.png");

            fi = new FileInputStream(srcFile);
            fo = new FileOutputStream(destFile,true);

            byte[] b = new byte[5];
            int len;
            while ((len=fi.read(b))!=-1){
                fo.write(b,0,len);
            }
        }catch (IOException e){
            e.printStackTrace();
        }finally {
            try {
                if (fi!=null){
                    fi.close();
                }
                if (fo!=null){
                    fo.close();
                }
            }catch (IOException e){
                e.printStackTrace();
            }
        }

缓冲流(处理流)

处理流对节点流进行包装,提高流的读取、写入速度,利于处理大文件,小文件没必要

所以写的时候也要先写节点流

BufferedInputStream bis = null;
        BufferedOutputStream bos = null;

        FileInputStream fis;
        FileOutputStream fos;
        try {
            File srcFile = new File("hello.txt");
            File destFile = new File("hello2.txt");

            fis = new FileInputStream(srcFile);
            fos = new FileOutputStream(destFile,true);

            bis = new BufferedInputStream(fis);
            bos = new BufferedOutputStream(fos);

            byte[] b = new byte[5];
            int len;
            while ((len=bis.read(b))!=-1){
                bos.write(b,0,len);
            }
        }catch (IOException e){
            e.printStackTrace();
        }finally {
            try {
                //外层关闭后内层自动关闭
                if (bis!=null){
                    bis.close();
                }
                if (bos!=null){
                    bos.close();
                }
            }catch (IOException e){
                e.printStackTrace();
            }
        }

高速度的原因:提供了一个内部缓存区,flush()刷新缓冲区

转换流

提供字节流与字符流之间的转换

  • InputStreamReader(解码)
  • OutputStreamWriter(编码)
FileInputStream fis = new FileInputStream("hello.txt");
        FileOutputStream fos = new FileOutputStream("hello6.txt",true);
        
        InputStreamReader isr = new InputStreamReader(fis,"UTF-8");
        OutputStreamWriter osw = new OutputStreamWriter(fos,"gbk");
        
        char[] cbuf = new char[5];
        int len;
        while ((len = isr.read(cbuf)) != -1){
            osw.write(cbuf,0,len);
        }
        isr.close();
        osw.close();

标准的输入输出流

输入

InputStreamReader isr = new InputStreamReader(System.in);
        
        BufferedReader br = new BufferedReader(isr);
        System.out.println("程序开始");
        while (true){
            String data = br.readLine();
            if ("e".equalsIgnoreCase(data)||"exit".equalsIgnoreCase(data)){
                System.out.println("程序结束");
                break;
            }

            System.out.println(data);
        }

        br.close();

输出

FileOutputStream fos = new FileOutputStream("D:\\t1.txt");
        //创建打印输出流,设置自动刷新模式(写入换行会刷新出缓冲区)
        PrintStream ps = new PrintStream(fos,true);
        //将标准输出流改成文件
        System.setOut(ps);
        //现在sout将会输出至文件
        for (int i = 0; i < 256; i++) {
            System.out.print((char)i);
            if (i%50==0){
                System.out.println();
            }
        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值