I/O流的高级用法又称高级流

一.什么是高级流

  • 高级流不能直接作用于文件,需要装载普通流或转换流
  • 高级流可分为:缓冲流/二进制流/对象流
  • 缓冲流:BufferedReader/BufferedWriter类
  • 二进制流:DataInputStream/DataOutputStream类
  • 对象流:ObjectInputStream/ObjectOutputStream类

二.缓冲流的用法

  • 缓冲流具有缓冲区,其.readLine()可以读取一行的数据,可以提高文件读取效率
  • 操作步骤:
    1.创建文件对象
    2.创建流对象并载入文件对象
    3.创建缓冲流对象并载入转换流对象
    4.读取数据
    5.关闭流操作
  • 代码示例 BufferedReader.readLin()
import java.io.*;

/**
 * @ Author: Zhangyu
 * @ Date: 2020/8/5
 * @ Description:
 */
public class Test {
    public static void main(String[] args) {
        File f=new File("D:\\1.txt");//创建文件类对象
        FileReader fr=null;//创建转换流对象,声明在外面,方便后面关流操作
        BufferedReader bf=null;//同理
        try {
           fr=new FileReader(f);//实例化对象,并载入文件对象置流中
           bf=new BufferedReader(fr);//实例化缓冲流对象,将流载入其中
            String s = bf.readLine();//获取第一行数据,并赋值到字符串对象中
            System.out.println(s);//输出读取到的字符串
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
                bf.close();//关闭流操作
                fr.close();//关闭流操作
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }
}

  • 代码示例 BufferedWriter.writer(String s)
import java.io.*;

/**
 * @ Author: Zhangyu
 * @ Date: 2020/8/5
 * @ Description:
 */
public class Test {
    public static void main(String[] args) {
        File f=new File("D:\\1.txt");//创建文件类对象
        FileWriter fw=null;//创建转换流对象,声明在外面,方便后面关流操作
        BufferedWriter bw=null;//同理
        try {
            fw=new FileWriter(f);//实例化对象,并载入文件对象置流中
           bw=new BufferedWriter(fw);//实例化缓冲流对象,将流载入其中
            String s ="好好学习java";
            bw.write(s);//将字符串s写入文件对象中
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
                bw.close();
                fw.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }
}

三.二进制流

  • 将文件以二进制格式存储,提高存储效率
  • 下面实现,将读取系统内的图片,并复制到项目工程中
  • 实现步骤:
    1.创建文件对象传入图片路径
    2.创建普通输入流并传入文件对象
    3.创建DataInputStream对象并载入普通输入流对象
    4.读取文件数据内容保存至byte数组,数组长度为文件内容长度即:File.length();
    5.创建普通输出流对象并载入输出文件路径
    6.创建DataOutputStream对象并载入普通输出流对象
    7.将byte数组的数据写入路径对应文件位置
  • 代码实现
import java.io.*;

/**
 * @ Author: Zhangyu
 * @ Date: 2020/8/5
 * @ Description:
 */
public class Test {
    public static void writePhoto(String readPath,String writePath){//readPath为读取文件的路径,writePath为写入文件的路径
        File f=new File(readPath);
        FileInputStream fis=null;
        DataInputStream dis=null;
        FileOutputStream fos=null;
        DataOutputStream dos=null;
        try {
            fis=new FileInputStream(f);
            dis=new DataInputStream(fis);
            fos=new FileOutputStream(writePath);
            dos=new DataOutputStream(fos);
            byte[] b=new byte[(int)f.length()];
            dis.read(b);
            dos.write(b);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally{
            try {
                dos.close();
                fos.close();
                dis.close();
                fis.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }
    public static void main(String[] args) {
    writePhoto("D:1.jpg","1.jpg");//调用方法,指定读取文件路径,与写入文件路径

    }
}

四.对象流

  • 配合序列化Serializable,将内存中的数据对象永久存储在磁盘中(持久化)

  • 操作步骤:
    1.创建一个类绑定接口Serializable
    2.创建FileOutputStream对象并传入保存文件路径
    3.创建ObjectOutputStream对象并载入输出流
    4.调用writeObject()方法传入需要存储至文件中的对象
    5.关闭流操作

  • 代码实现

//学生类
public class Student implements Serializable {
    private String name;
    private int age;

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}
import java.io.*;

/**
 * @ Author: Zhangyu
 * @ Date: 2020/8/5
 * @ Description:
 */
public class Test {
    public static void writePhoto(Student student,String writePath){//需要存储的文件对象,writePath为写入文件的路径
        FileOutputStream fos=null;
        ObjectOutputStream oos=null;
        try {
            fos=new FileOutputStream(writePath);
            oos=new ObjectOutputStream(fos);
            oos.writeObject(student);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
                oos.close();
                fos.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }
    public static void main(String[] args) {
        Student student=new Student("张宇",25);
        writePhoto(student,"2.txt");

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值