IO流初学(中)

先看一下IO流的主要分类   非常之多(麻了.jpg)

目录

一 节点流和处理流

1.1概念

1.2字符流

1.2.1   BufferedReader

1.2.2 BufferedWriter

1.2.3 Buffered拷贝

1.3字节流

1.3.1BufferedInputStream 

1.3.2 BufferedOutputStream 

1.3.3 字节流拷贝

二 对象处理流

2.1ObjectOutputStream

2.2 ObjectInputStream

2.3注意事项

三 标准输入输出流

3.1System.in

3.2System.out

3.3 总结

四 转换流

五 打印流

5.1字节打印流

5.2字符打印流


一 节点流和处理流

1.1概念

节点流:节点流是对单一数据源(数组 文件 管道 字符串 )进行读写操作的一种流  如专门读写文件的FileReader FileWriter

处理流:处理流也叫包装流 连接在已存在的流(节点流或者包装流) 为程序提供更为强大的读写功能 也更加灵活 数据源可以是数组也可以是文件

ps:节点流相当于一个只能做椅子的工匠 只能对木头进行操作

处理流相当于多功能工匠 可以对木头进行操作 也可以对石头 沙子进行操作 

可能形容的不太准确 但大致是这么个意思  处理流能处理的范围明显多于节点流

BufferedReader 类中 有属性Reader 即可以封装一个节点流 该节点流可以是任意的 只要是Reader子类

BufferedWriter类中 有属性Writer 即可以封装一个节点流 该节点流可以是任意的只要是Writer子类

节点流和处理流的区别和联系

1.节点流是底层流/低级流 直接跟数据源(文件 管道)相接

2.处理流包装节点流 既可以消除不同节点流的实现差异 也可以提供更方便的方法来完成输入输出

3.处理流对节点流进行包装 使用了修饰器设计模式 不会直接与数据源相连接

备注:处理流处理的是节点流 节点流直接跟数据源相连接 所以处理流是间接的与数据源相连接

处理流的功能主要体现在以下两个方面

1.性能的提高:主要以增加缓冲的方式来提高输入输出的效率

备注:Buffered提供了一个八个字节大小的缓冲区 当程序与磁盘进行交互时 效率很低速度很慢 普通流每次读写一个字节 而缓冲流在内存中设置了一个缓冲区 缓冲区存够足够大的数据后 再与内存或者磁盘进行交换 减少了需要交换的次数  提高了处理的效率

2.操作的便捷:处理流可能提供了一系列便捷的方法来一次输入输出大批量的数据 使用更加灵活方便

1.2字符流

1.2.1   BufferedReader

 public static void main(String[] args) throws IOException {
        String filepath="d:\\1.txt";
        FileReader reader = new FileReader(filepath);
        BufferedReader bufferedReader = new BufferedReader(reader);

        //一个字符一个字符读入
        int readline;
        while((readline=bufferedReader.read())!=-1){
            System.out.print((char)(readline));
        }
        //一行一行读入
        String read;
        while ((read=bufferedReader.readLine())!=null){
            System.out.println(read);
        }
        //只需要关闭外层流即可
        reader.close();
    }

1.2.2 BufferedWriter

 public static void main(String[] args) throws IOException {
        String filepath = "d:\\1.txt";
        FileWriter fileWriter = new FileWriter(filepath);
        BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);
        bufferedWriter.write("大二实习冲冲冲");
        bufferedWriter.write("15");
        bufferedWriter.write('F');
        bufferedWriter.close();
    }

1.2.3 Buffered拷贝

 public static void main(String[] args) throws IOException {
        //拷贝一边读入一边写入
        String filepath1 = "d:\\hello.txt";//读入流
        String filepath2 = "d:\\1.txt";//输出流
        FileReader fileReader = new FileReader(filepath1);
        FileWriter fileWriter = new FileWriter(filepath2);
        BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);
        BufferedReader bufferedReader = new BufferedReader(fileReader);
        String readline;
        while ((readline=bufferedReader.readLine())!=null){
            bufferedWriter.write(readline);
        }
        bufferedReader.close();
        bufferedWriter.close();

    }

1.3字节流

1.3.1BufferedInputStream 

  public static void main(String[] args) throws IOException {
        String filepath = "d:\\hello.txt";
        FileInputStream fileInputStream = new FileInputStream(filepath);
        BufferedInputStream bufferedInputStream = new BufferedInputStream(fileInputStream);
        //按字节读
        int read;
        while ((read=bufferedInputStream.read())!=-1){
            System.out.print((char) read);
        }
        //字节数组读
        byte[] buf = new byte[1024];
        int readbuf;
        while((readbuf=bufferedInputStream.read(buf))!=-1){
            System.out.println(new String(buf,0,readbuf));
        }
        bufferedInputStream.close();

    }

1.3.2 BufferedOutputStream 

public static void main(String[] args) throws IOException {
       String filepath = "d:\\hello.txt";
        FileOutputStream fileOutputStream = new FileOutputStream(filepath);
        BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(fileOutputStream);
        bufferedOutputStream.write("I LOVE YOU THREE THOUSANDS TIMES".getBytes());//转化为字节数组
        bufferedOutputStream.close();
    }

1.3.3 字节流拷贝

public static void main(String[] args) throws IOException {
    //两个地址
        String filepath = "d:\\hello.txt";
        String filepath1 = "d:\\hsp.txt";
        FileInputStream fileInputStream = new FileInputStream(filepath);
        FileOutputStream fileOutputStream = new FileOutputStream(filepath1);
        byte buf[]=new byte[1024];
        int readlen;
        while((readlen=fileInputStream.read(buf))!=-1){
            fileOutputStream.write(buf,0,readlen);
        }
        fileInputStream.close();
        fileOutputStream.close();
    }

二 对象处理流

需求

保存一个Dog类对象 Dog dog = new Dog("小花农夫",3) 保存到文件中 并且能够从文件恢复

保存值和数据类型 序列化

将保存在文件中的数据(值和数据类型重新恢复 称之为反序列化

为了让类是可序列化的 我们必须要实现这两个接口之一

Serializable(标记接口 没有方法 推荐+)

Externalizable

ObjectInputStream 提供反序列化功能

ObjectOutputStream 提供序列化功能

2.1ObjectOutputStream

 public static void main(String[] args) throws IOException {
        //序列化
        String filepath = "d:\\hello.txt";
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream(filepath));
        //写入一个数字
        objectOutputStream.writeInt(100);
        //写入一个浮点数
        objectOutputStream.writeDouble(5.20);
        //写入一个字符串
        objectOutputStream.writeUTF("love");
        //写入一个Boolean值
        objectOutputStream.writeBoolean(true);
        //写入一个字符
        objectOutputStream.writeChar('a');
        //写入一个对象
        objectOutputStream.writeObject(new Dog("小花❀",5));
        objectOutputStream.close();
    }

2.2 ObjectInputStream

public static void main(String[] args) throws IOException, ClassNotFoundException {
        String filepath = "d:\\hello.txt";
        ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream(filepath));
        System.out.println(objectInputStream.readInt());
        System.out.println(objectInputStream.readDouble());
        System.out.println(objectInputStream.readUTF());
        System.out.println(objectInputStream.readBoolean());
        System.out.println(objectInputStream.readChar());
        System.out.println(objectInputStream.readObject());
    }

Dog.java

public class Dog {
        private String name;
        private  int age;
        public Dog(String name, int age) {
            this.name = name;
            this.age = age;
        }

    }

2.3注意事项

1.读写顺序要一致

2.要求序列化或反序列化对象 类需要实现Serializable接口

3.序列化的类中建议添加SerialVersionUID 为了提高版本的兼容性

 private static final long serialVersionUID=1L;

4.序列化对象时 默认将里面所有属性都进行序列化 但除了static或transient修饰的成员

5.序列化对象时 要求里面属性的数据类型也需要实现序列化接口

6.序列化具备可继承性 也就是说如果某类已经实现了序列化 那么它的所有子类也已经默认实现了序列化

三 标准输入输出流

3.1System.in

标准输入流

   public static void main(String[] args) throws IOException {
        InputStream in = System.in;
        int by;
        while((by=in.read())!=-1){
            System.out.println((char) by);
        }

3.2System.out

标准输出流

  public static void main(String[] args) throws IOException {
        PrintStream out = System.out;
        out.println(5);
        out.println('a');
    }

3.3 总结

//标准输入 键盘
 //编译类型  InputStream
 //运行类型  BufferedInputStream
 System.out.println(System.in.getClass());
 //标准输出 显示器
 //编译类型  PrintStream
 //运行类型  PrintStream
 System.out.println(System.out.getClass());

四 转换流

作用 把字节流转换为字符流 提高处理字符效率

public static void main(String[] args) throws IOException {
        //将字节流转换为字符流
        String filepath = "d:\\1.txt";
        //把FileInputStream转成InputStreamReader
        //指定编码 gbk
        InputStreamReader gbk = new InputStreamReader(new FileInputStream(filepath), "gbk");
        //把InputStreamReader传入BufferedReader
        BufferedReader reader = new BufferedReader(gbk);
        //读取
        String s = reader.readLine();
        System.out.println(s);
        reader.close();
    }

五 打印流

5.1字节打印流

         //字节打印流
        PrintStream out = System.out;
        //默认情况下 PrintStream 输出数据的位置 是标准输出 即显示器
        out.println("hello");//本质就是write
        out.write("a hh".getBytes());

        out.close();
        System.setOut(new PrintStream("d:\\1.txt"));//改变路径 输出新文件下
        System.out.println("hello 韩顺平焦虑");	

5.2字符打印流

public static void main(String[] args) throws IOException {
        PrintWriter printWriter = new PrintWriter(new FileWriter("d:\\1.txt"));
        printWriter.print("hi 背景");
        printWriter.close();
    }

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值