JavaIO流

IO流概述

IO(Input\Output)用于处理设备之间的数据的传输。在Java中以流的方式对数据的输入和输出进行管理。在Java.io包中提供了许多”流“类和接口来进行对不同数据的操作。

流的分类

1、按操作数据的单位可分为字节流 和字符流
2、按数据的流向划分为输入流、输出流
3、按照流的角色划分为节点流、处理流

流的体系结构

抽象基类节点流(文件流) \ 缓冲流(处理流的一种)
InputStreamFileInputStream \ BufferedInputStream
OutputStreamFileOutputStream \BufferedOutputStream
ReaderFileReader \ BufferedReader
WriterFileWriter \ BufferedWriter

节点流

FileReader

从指定文件读取数据并打印

 public void Test01() {
        FileReader f2 = null;
        try {
//        1、实例化File类的对象,指明要操作的文件
            File file = new File("hi.txt");
//        2、提供具体的流
            f2 = new FileReader(file);
//        3数据的读入
            //read()返回读入的一个字节,若无返回-1
            int data;
            while((data= f2.read())!=-1){
                System.out.println((char) data);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally{
        //  流的关闭操作
        try {
            if(f2!=null) //防止文件没有创建就结束
            f2.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
     }
    }
1、read()返回读入的一个字节,若无返回-1
2、异常的处理:为了保证资源一定可以执行关闭操作。需要try-catch-finally
3、读入的文件一定要存在,不然会报错FileNotFoundException

FileWriter

将数据从内存中写到硬盘

  public void Test03() throws IOException {
        FileWriter f2 = null;
        try {
//      1、创建File类对象,指明文件
            File file = new File("hi.txt");
//      2、提供要操作的流
            f2 = new FileWriter(file,true);
//      3、具体操作
            f2.write("I hava a apple\n");
            f2.write("I hava a iPhone");
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (f2!=null) {
                //      4、关闭流
                try {
                    f2.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
输出数据,指定文件可以不存在,会自动创建。
使用的流的构造器:
        FileWriter(file,false)/ FileWriter(file):会对原有的文件覆盖
        FileWriter(file,true):不会覆盖原有的文件,在原有文件基础上追加内容

FileInputStream FileOutputStream

实现图片的复制

  public void Test01()  {
        FileInputStream f1 = null;
        FileOutputStream f2 = null;
        try {
//        1、实例化File类对象
            File file = new File("屏幕截图.png");
            File file1 = new File("屏幕截图1.png");
//        2、提供操作流
            f1 = new FileInputStream(file);
            f2 = new FileOutputStream(file1);
//        3、具体操作 复制过程
            byte[] bytes = new byte[5];
            int len;
            while((len=f1.read(bytes))!=-1){
                f2.write(bytes,0,len);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
 //        4、关闭流
            if(f1!=null){
                try {
                    f1.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (f2!=null) {
                try {
                    f2.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

该流常用于非文本文件,如视频、图片。

处理流

转换流

  • 转换流——实现字节流和字符流的转换(属于字符流)
    InputStreamReader:将一个字节的输入流转换为字符的输入流
    OutputStreamWriter:将一个字符的输出流转换为字节的输出流
  • 实现字节流和字符流的转换
  • 编码:字节、字节数组——>字符数组、字符串
    解码:字符、字符数组——>字节、字节数组
  public void Test01(){
        InputStreamReader i1 = null;//指定字符集
        try {
            //输入流(字节流-->字符流)
            FileInputStream f1 = new FileInputStream("doclan.txt");
//        InputStreamReader f2 = new InputStreamReader(f1);  使用系统默认的字符集
//            实现字节流->字符流
            i1 = new InputStreamReader(f1, StandardCharsets.UTF_8);//指定字符集,但字符集必须与文件字符集一致
            char[] chars = new char[20];
            int len;
            while((len=i1.read(chars))!=-1){
                String s = new String(chars, 0, len);
                System.out.println(s);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if ( i1!=null){
                try {
                    i1.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

缓冲流

  • 缓冲流:
    BufferedInputStream
    BufferedOutputStream
    BufferedReader
    BufferedWriter
  • 提高数据流读取、写入的速度
  • 处理流就是“套接”在已有流的基础上
//    用缓冲流提高文件复制速度
//      BufferedInputSystem
//      BufferedOutputSystem
    @Test
    public void Test01(){
        BufferedInputStream b1 = null;
        BufferedOutputStream b2 = null;
        try {
//      1、  造目标文件
            File file = new File("测试.png");
            File file1 = new File("测试2.png");
//      2、造流
//        2.1造节点流
            FileInputStream f1 = new FileInputStream(file);
            FileOutputStream f2 = new FileOutputStream(file1);
//        2.2造处理流
            b1 = new BufferedInputStream(f1);
            b2 = new BufferedOutputStream(f2);
//        3、复制操作
            byte[] bytes = new byte[5];
            int len;
            while((len=b1.read(bytes))!=-1){
                b2.write(bytes,0,len);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally
//        4、关闭流
        /*
        要求:先关闭外层流,在关闭内层流
        说明:关闭外层流的同时,内层流也会自动关闭。
         */
        {
            if (b1!=null){
                try {
                    b1.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (b2!=null){
                try {
                    b2.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值