一阶段课堂笔记——IO流(1)

1.IO流

1.1概念

磁盘上的文件和内存之间进行交互需要媒介或者管道,把这个管道或者媒介成为IO流,也成为输入、输出流

输入:从外部存储设备到内存叫输入或读取

输出:从内存到外部存储设备叫输出或写入

1.2流的作用和原理

流的本质就是数据传输,根据数据传输特性将流抽象为各种类,方便更直观(扯淡)的进行数据操作

1.3 IO流的种类

(1)按照流的方向分:输入流、输出流

(2)按照处理单位分:字节流、字符流

字节流: 将数据以字节的形式传输,一次性传输一个字节数据

字符流: 将数据以字符的形式传输,一次性传输一个字符(utf-8编码 1、2或3个字节)

(3)按照功能分:节点流、处理流

节点流: 可以从一个特定的地方(节点)读写字节数据(例如:FileInputStream FileOutputStrean FileReader FileWriter )

处理流: 是对一个已经存在的流的连接和封装,通过所封装的流的功能调用实现数据读写,所以处理流的构造方法总是要带一个其他的流对象做参数。(例如:BufferedInputStrean BufferedOutputStream BufferedReader BufferedWriter)

1.4字节输入流(InputStream)

InputStream是一个抽象类,不能实例化对象

它的子类:文件输入流 FileInputStream

public static void main(String[] args) throws Exception{
        //1.创建流
        FileInputStream fis=new FileInputStream("g:\\gp4.txt");

        //2.读取文件
        //2.1一次读取一个
        /*int data=-1;
        //一次读一个字节所以有多少字节就读多少次
        while ((data=fis.read())!=-1){
            System.out.print((char)data);
        }*/

        //2.2一次读取多个
        byte[] buf=new byte[1024*4];
        int len=-1;
        //一次读取多个,while循环表示读取的次数
        while ((len=fis.read(buf))!=-1){
            //for循环表示每次读取的元素
            for (int i = 0; i <len ; i++) {
                System.out.print((char)buf[i]);
            }
        }

        //3.关闭
        fis.close();
    }

 1.5字节输出流(OutputStream)

OutputStream是一个抽象类,不能实例化对象

它的子类: 文件输出流 FileOutputStream

public static void main(String[] args) throws Exception{
        //1.创建输出流
        true表示可以添加,false表示不可以添加会将原来的结果覆盖掉
        FileOutputStream fos=new FileOutputStream("g:\\info.txt",true);
        //2.写入
        String content="helloworld\r\n";
        fos.write(content.getBytes());
        fos.write(97);//这里写入的是a
        //3.关闭
        fos.close();
        System.out.println("写入完毕");
    }

 1.6字符输入流(Reader)

是所有字符输入流的父类,是一个抽象类,不能实例化对象

使用它的子类FileReader类实例化

注意:这里读取时编码格式要对应否则就会出现乱码现象

public static void main(String[] args) throws Exception{
        //1.创建流
        FileReader reader=new FileReader("g:\\gp4.txt");
        //2.读取
        int data=-1;
        while ((data=reader.read())!=-1){
            System.out.print((char)data);
        }

        //3.关闭
        reader.close();
    }

 1.7字符输出流(Writer)

是所有字符输出类的父类,是一个抽象类,不能实例化

使用它的子类FileWriter类实例化

public static void main(String[] args) throws Exception{
        //1.创建字符输出流
        FileWriter fw=new FileWriter("g:\\info.txt");
        //2.写入
        for (int i = 0; i <10; i++) {
            fw.write("好好学习,天天向上\r\n");
            fw.flush();//缓存刷新
        }
        //3.关闭
        fw.close();
        System.out.println("执行完成");
    }

1.8 扩展案例:

(1)使用字节流复制文件

public static void main(String[] args) throws Exception{
        //1.创建字节输入流
        FileInputStream fis=new FileInputStream("g:\\gp4.txt");
        FileOutputStream fos = new FileOutputStream("g:\\gp5.txt");
        //2.读取和写入
        byte[] buf=new byte[1024*4];
        int len=-1;
        while ((len=fis.read(buf))!=-1){
            fos.write(buf,0,len);
        }
        //3.关闭
        fis.close();
        fos.close();
        System.out.println("复制完毕");
    }

(2)使用字符流复制文件 

public static void main(String[] args) throws Exception{
        FileReader fr=new FileReader("g:\\info.txt");
        FileWriter fw=new FileWriter("g:\\info1.txt");

        char[] buf=new char[1024*4];
        int len=-1;
        while ((len=fr.read(buf))!=-1){
            fw.write(buf, 0, len);
        }
        fr.close();
        fw.close();

        System.out.println("复制完成");
    }

1.9 总结

如果复制的文件是文本文件,用字节流和字符流都可以

如果复制的文件是图片、音乐和电影,使用字节流

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值