IO流第36天(BufferedWriter,使用Buffered完成字符流和字节流的拷贝,Object对象流)

BufferedWriter

案例,将”hello,龚嘉乐”写入到文件中

public static void main(String[] args) throws Exception {
    //创建文件及位置
    String filePath="d:\\BufferWrite.txt";
    //创建写入
    BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(filePath));
    bufferedWriter.write("1hello,龚嘉乐");
    bufferedWriter.newLine();//插入一个和系统相关的换行
    bufferedWriter.write("2hello,龚嘉乐");
    bufferedWriter.newLine();//插入一个和系统相关的换行
    bufferedWriter.write("3hello,龚嘉乐");
    bufferedWriter.newLine();//插入一个和系统相关的换行
    bufferedWriter.close();
}

注意:
写入模式为追加时,在节点流出加一个参数true即可
覆盖:BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(filePath));
追加:BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(filePath,true));

使用BufferedReader和BufferedWriter完成拷贝

注意:BufferedReader和BufferedWriter是按字符操作的,不要去操作二进制文件,否则可能会造成文件损坏

public static void main(String[] args) throws Exception {
    //创建文件的源路径和目标路径
    String srcFilePath="d:\\note.txt";
    String desFilePath="c:\\note.txt";
    //创建字符串,用于接收读取的字符
    String len=null;
    //创建BufferedReader和BufferedWriter
    BufferedReader bufferedReader = new BufferedReader(new FileReader(srcFilePath));
    BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(desFilePath));
    //循环读取,每次读取一行
    //readLine()每次读取一行的内容,但是没有换行符
    while ((len= bufferedReader.readLine())!=null){
        //每读取一行就写入,边读边写入
        bufferedWriter.write(len);
        //每读取一行就换行,不然会全部挤在一起
        bufferedWriter.newLine();
    }
    bufferedReader.close();
    bufferedWriter.close();
}

Buffered字节处理流

BufferedInputStream和BufferedOutputStream
image
image
image

案例:
完成图片/视频或者音乐的拷贝

public static void main(String[] args) {
    //创建源文件路劲和目标文件路径
    String scrFilePath = "d:\\风景.jpg";
    String desFilePath = "c:\\风景.jpg";
    //创建BufferedInputStream和BufferedOutputStream
    BufferedInputStream bis = null;
    BufferedOutputStream bos = null;

    try {
        bis = new BufferedInputStream(new FileInputStream(scrFilePath));
        bos = new BufferedOutputStream(new FileOutputStream(desFilePath));
        //定义一个数组,提高读写效率
        byte[]buff=new byte[1024];
        int len = 0;
        //循环读取文件并写入
        while ((len = bis.read(buff)) != -1) {
            bos.write(buff);
        }
        System.out.println("拷贝成功");
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try {
            if(bis!=null)
            {
                bis.close();
            }
            if(bos!=null){
                bos.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

注意:基本语法已经抛出异常使用IO流异常IOException e

对象流ObjectInputStream和ObjectOutputStream

  • 在保存数据时,同时也保存它的数据类型,比如可以保持int 100,而不是保存"100",这样的话文件还可以恢复成int100.就是能够将 基本数据类型 或 对象 进行序列化和反序列化

  • 序列化和反序列化

  1. 序列化就是在保存数据时,保存数据的值和数据类型
  2. 反序列化就是在恢复数据时,同时恢复它的值和数据类型
  3. 需要让某个对象支持序列化机制,则必须让其类是可序列化的,为了让某个类是可序列化的,该类必须实现以下两个接口之一:
    Serializable//这是一个标记接口,没有方法(常用)
    Externalizable//该接口有两个方法需要实现,因此我们一般不使用
    ObjectOutputStream实现了序列化功能
    ObjectInputStream实现了反序列化功能
    image
    image

案例

使用ObjectOutputStream序列化基本数据类型和一个Dog对象(name,age),并保存到data.dat文件中

public static void main(String[] args) throws Exception {
        //序列化后,保存的文件不是纯文本,而是按照它的格式来保存
        String filePath = "d:\\date.dat";
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(filePath));
        //序列化数据到d:\date.dat
        oos.write(100);//此处会自动装箱int==>Integer   (Integer实现了Serializable接口)
        oos.writeBoolean(true);//此处会自动装箱boolean==>Boolean   (Boolean实现了Serializable接口)
        oos.writeChar('a');//此处会自动装箱char==>Character   (Character实现了Serializable接口)
        oos.writeDouble(1.2);//此处会自动装箱double==>Double   (Double实现了Serializable接口)
        oos.writeUTF("龚嘉乐");//String实现了Serializable接口
        oos.writeObject(new Dog("小黄",3));//保存对象
        //关闭流
        oos.close();
        System.out.println("数据保存完毕(序列化)");
    }

定义一个Dog类

/如果需要序列化某个类的对象,需要这个类实现Serializable接口
class  Dog implements Serializable {
    private String name;
    private int age;

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

写入后的一个结果会有乱码,因为不是txt文件
image

posted @   不再犹豫27  阅读(47)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示