Day16-【Java SE进阶】IO流(二):字符流、缓冲流、转换流、打印流、数据流、序列化流、IO框架

一. 字符流

字节流:适合复制文件等,不适合读写文本文件
字符流:适合读写文本文件内容

在这里插入图片描述

1. FileReader(文件字符输入流)

作用:以内存为基准,可以把文件中的数据以字符的形式读入到内存中去。读取单个字符,性能比较差,一次读取多哥字符,性能还是不错的鸭。
在这里插入图片描述
在这里插入图片描述

package com.file;

import java.io.FileReader;
import java.io.Reader;

public class FileTest12 {
    public static void main(String[] args) {
        try (
                //1、创建一个文件字符输入流管道与源文件接通
                Reader fr = new FileReader("day07/src/com/file/test/test.txt");
        ) {
            System.out.println("===一次读取一个字节===");
            int c;
            while ((c=fr.read())!=-1){
                char temp = (char) c;
                System.out.print(temp);
            }
            System.out.println("\r\n===一次读取多个字节===");
            char[] chars = new char[3];
            //2、读取文本文件的内容
            //记住每次读取的字符个数
            int read;
            while ((read=fr.read(chars))!=-1){
                String s = new String(chars, 0, read);
                System.out.print(s);
            }
        }catch (Exception exception){
            exception.printStackTrace();
        }
    }
}

2. FileWriter(文件字符输出流)

作用:以内存为基准,把内存中的数据以字符的形式写出到文件中去。

  • 字符输出流写出数据后,必须刷新流,或者关闭流,写出去的数据才能生效
    • 数据会先写到缓冲区里面,最后通过机制调用一次直接写出到磁盘中,性能会变好的
      • 刷新流:flush方法,刷新后流还可以继续使用的,缓冲区装满好会自动flush,缓冲区强制刷新到输出文件中
      • 关闭流:close方法 包含刷新流 关闭后流不可以继续使用了

字节流、字符流的使用场景小结

  • 字节流适合做一切文件数据的拷贝(音视频,文本);字节流不适合读取中文内容输出符流适合做文本文件的操作(读,写)。
    在这里插入图片描述在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
package com.file;

import java.io.FileWriter;
import java.io.Writer;

public class FileTest13 {
    public static void main(String[] args) {
        //加true就是追加数据管道,不加就是覆盖数据管道的
        try (Writer fileWriter = new FileWriter("day07/src/com/file/test/outWriter.txt",true);) {
            // 1、public void write(int c):写一个字符出去
            fileWriter.write(65);
            fileWriter.write('A');
            fileWriter.write('牛');
            fileWriter.write("\r\n");
            // 2、public void write(string c)写一个字符串出去
            fileWriter.write("我是大帅逼");
            fileWriter.write("\r\n");
            // 3、public void write(String cint pos ,int len):写字符串的一部分出去
            fileWriter.write("我是大帅逼知道吗", 0, 5);
            fileWriter.write("\r\n");
            // 4、public void write(char[] buffer):写一个字符数组出去
            char[] chars = {'a', '我', '牛', '比'};
            fileWriter.write(chars);
            fileWriter.write("\r\n");
            // 5、public void write(char[] buffer ,int pos ,int len):写字符数组的一部分出去
            fileWriter.write(chars, 1, 3);
            fileWriter.write("\r\n");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

二. 缓冲流

对原始流进行包装,以提高原始流读写数据的性能
在这里插入图片描述

1. 字节缓冲流 BufferedInputStream BufferedOutputStream

原始流:
在这里插入图片描述
包装流:

  • 原理:字节缓冲输入流自带了8KB缓冲池;字节缓冲输出流也自带了8KB缓冲池
    在这里插入图片描述
    在这里插入图片描述
package com.file;

import java.io.*;

public class FileTest14 {
    public static void main(String[] args) {
        try (InputStream is = new FileInputStream("day07/src/com/file/test/49.jpg");
             //1、定义一个字节缓冲输入流包装原始的字节输入流
             InputStream bis = new BufferedInputStream(is);
             OutputStream os = new FileOutputStream("day07/src/com/file/test/51.jpg");
             //2、定义一个字节缓冲输出流包装原始的字节输出流 可以自定义缓冲池大小的
             BufferedOutputStream bos = new BufferedOutputStream(os, 8192 * 2);) 
        {
            int read;
            byte[] buffer = new byte[1024];
            while ((read = bis.read(buffer)) != -1) {
                bos.write(buffer, 0, read);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

2. 字符缓冲流

BufferedReader

  • 作用:自带8K(8192)的字符缓冲池,可以提高字符输入流读取字符数据的性能。
    在这里插入图片描述
    在这里插入图片描述
package com.file;

import java.io.*;

public class FileTest15 {
    public static void main(String[] args) {
        try (
                Reader fr = new FileReader("day07/src/com/file/test/outWriter.txt");
                BufferedReader br = new BufferedReader(fr)
        ) {
//            char[] buffer = new char[1024];
//            int len;
//           while ((len=br.read(buffer))!=-1){
//               String s = new String(buffer, 0, len);
//               System.out.print(s);
//           }
            String line;
            while ((line = br.readLine()) != null) {
                System.out.println(br.readLine());
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

BufferedWriter(字符缓冲输出流)

  • 作用:自带8K(8192)的字符缓冲池,可以提高字符输出流写字符数据的性能

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
原始流、缓冲流的性能分析[重点]
当字节数组达到一定程度时就不明显了
在这里插入图片描述

3. 转换流

  • 如果代码编码和被读取的文本文件的编码是一致的,使用字符流读取文本文件时不会出现乱码!
  • 如果代码编码和被读取的文本文件的编码是不一致的,使用字符流读取文本文件时就会出现乱码!
    字符输入转换流
  • 解决不同编码时,字符流读取文本内容乱码的问题。
  • 解决思路:先获取文件的原始字节流,再将其按真实的字符集编码转成字符输入流,这样字符输入流中的字符就不乱码了。
    在这里插入图片描述
    在这里插入图片描述
package com.file;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.InputStreamReader;

public class FileTest17 {
    public static void main(String[] args) {
        try (
                //1.得到文件的原始字节流
                InputStream is = new FileInputStream("day07/src/com/file/test/test.txt");
                //2.把原始的字节输入流按照指定的字符集编码转换成字符输入流
                InputStreamReader isr = new InputStreamReader(is,"GBK");
                //3.把字符输入流包装成缓冲字符输入流
                BufferedReader br = new BufferedReader(isr)
        ) {
            String line;
            while ((line=br.readLine())!=null){
                System.out.println(line);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

字符输出转换流
控制写出的编码格式
在这里插入图片描述

  • 作用:可以控制写出去的字符使用什么字符集编码。
  • 解决思路:获取字节输出流,再按照指定的字符集编码将其转换成字符输出流,以后写出去的字符就会用该字符集编码了。
  • 在这里插入图片描述
package com.file;

import java.io.BufferedWriter;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;

public class FileTest18 {
    public static void main(String[] args) {
        try (OutputStream os = new FileOutputStream("day07/src/com/file/test/test.txt",true);
             OutputStreamWriter osw = new OutputStreamWriter(os, "GBK");
             BufferedWriter bw = new BufferedWriter(osw)
        ) {
            bw.write("我是一只小猪猪");
            bw.newLine();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

4. 打印流

在这里插入图片描述

  • 作用:打印流可以实现更方便、更高效的打印数据出去,能实现打印啥出去就是啥出去
    在这里插入图片描述
    在这里插入图片描述
package com.file;

import java.io.PrintStream;

public class FileTest19 {
    public static void main(String[] args) {


        //1.创建一个打印流管道
        try (
//                PrintStream ps = new PrintStream("day07/src/com/file/test/testPrint.txt",
//                        Charset.forName("GBK"));
                PrintStream ps = new PrintStream("day07/src/com/file/test/testPrint.txt");
                ) {
            ps.println(97);
            ps.println('a');
            ps.println("我爱你中国abc");
            ps.println(true);
            ps.println(99.5);
            ps.write(97);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

在这里插入图片描述
在这里插入图片描述
两者差别不大,打印功能完全一样的;只是在写数据上一个写字节一个写字符的!使用低级流包装可以append

package com.file;

import java.io.FileOutputStream;
import java.io.PrintWriter;

public class FileTest19 {
    public static void main(String[] args) {


        //1.创建一个打印流管道
        try (
//                PrintStream ps = new PrintStream("day07/src/com/file/test/testPrint.txt",
//                        Charset.forName("GBK"));
                PrintWriter ps = new PrintWriter(new FileOutputStream("day07/src/com/file/test/testPrint.txt",true));
                ) {
            ps.println(97);
            ps.println('a');
            ps.println("我爱你中国abc");
            ps.println(true);
            ps.println(99.5);
            ps.write(97);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

在这里插入图片描述
打印流的一种应用:输出语句的重定向。

在这里插入图片描述
可以把输出语句的打印位置改到某个文件中去。

package com.file;

import java.io.PrintStream;

public class FileTest20 {
    public static void main(String[] args) {
        try (PrintStream printStream = new PrintStream("day07/src/com/file/test/testPrint.txt");
        ) {
            System.setOut(printStream);
            System.out.println("我改变了打印流到文件中去啦!");
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

在这里插入图片描述

5. 数据流

在这里插入图片描述
DataOutputstream(数据输出流)

  • 允许把数据和其类型一并写出去。
    在这里插入图片描述
    在这里插入图片描述
    DatalnputStream(数据输入流)
    用于读取数据输出流写出去的数据。
    在这里插入图片描述
package com.file;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;

public class FileTest21 {
    public static void main(String[] args) {
        try (
                DataOutputStream dos = new DataOutputStream(
                        new FileOutputStream("day07/src/com/file/test/dos.txt", true));
                FileInputStream is = new FileInputStream("day07/src/com/file/test/dos.txt");
                DataInputStream dis = new DataInputStream(is)
        ) {
            dos.writeUTF("我是写数据字符串的");
            dos.writeByte(97);
            dos.writeBoolean(true);
            dos.writeDouble(97.4);
            dos.writeInt(97);
            System.out.println(dis.readUTF());
            System.out.println(dis.readByte());
            System.out.println(dis.readBoolean());
            System.out.println(dis.readDouble());
            System.out.println(dis.readInt());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

6. 序列化流

  • 对象序列化:把Java对象写入到文件中去
  • 对象反序列化:把文件里的Java对象读出来

在这里插入图片描述
0bjectOutputstream(对象字节输出流)

  • 可以把Java对象进行序列化:把Java对象存入到文件中去。
    在这里插入图片描述
    在这里插入图片描述

注意:对象如果要参与序列化,必须实现序列化接口(java.io.Serializable)

Objectlnputstream(对象字节输入流)
可以把Java对象进行反序列化:把存储在文件中的Java对象读入到内存中来。
在这里插入图片描述

在这里插入图片描述

package com.file;

import java.io.*;

public class FileTest22 {
    public static void main(String[] args) {
//        serializabledObject();
        unSerializabledObject();
    }
    public static void serializabledObject(){
        //1.创建一个java对象
        User tom = new User("Tom", "123", 12);
        //2.创建一个对象字节输出包装原始字节输出流
        try (
                FileOutputStream fs = new FileOutputStream("day07/src/com/file/test/dos.txt");
                ObjectOutputStream oos = new ObjectOutputStream(fs);
        ) {
            oos.writeObject(tom);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public static void unSerializabledObject(){
        try (
                FileInputStream fs = new FileInputStream("day07/src/com/file/test/dos.txt");
                ObjectInputStream oos = new ObjectInputStream(fs);
        ) {
            User o =  (User)oos.readObject();
            System.out.println(o);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

class User implements Serializable {
    private String uname;
    //加入transient不参与序列化
    private transient String pwd;
    private int age;

    public User() {
    }

    public User(String uname, String pwd, int age) {
        this.uname = uname;
        this.pwd = pwd;
        this.age = age;
    }

    public String getUname() {
        return uname;
    }

    public void setUname(String uname) {
        this.uname = uname;
    }

    public String getPwd() {
        return pwd;
    }

    public void setPwd(String pwd) {
        this.pwd = pwd;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "User{" +
                "uname='" + uname + '\'' +
                ", pwd='" + pwd + '\'' +
                ", age=" + age +
                '}';
    }
}

如果要一次序列化多个对象,咋整?

  • 用一个ArrayList集合存储多个对象,然后直接对集合进行序列化即可
  • 注意:ArrayList集合已经实现了序列化接口!

7. IO框架

  • 解决某类问题,编写的一套类、接口等,可以理解成一个半成品,大多框架都是第三方研发的。
  • 好处:在框架的基础上开发,可以得到优秀的软件架构,并能提高开发效率
  • 框架的形式:一般是把类、接口等编译成class形式,再压缩成一个,jar结尾的文件发行出去

什么是IO框架

  • 封装了java提供的对文件、数据进行操作的代码,对外提供了更简单的方式来对文件进行操作,对数据进行读写等。

Commons-io
Commons-io是apache开源基金组织提供的一组有关10操作的小框架,目的是提高I0流的开发效率。
在这里插入图片描述
在这里插入图片描述
右键项目 新建Directory,取名为lib等名称,然后右键lib为add to lib即可导入成功啦
在这里插入图片描述

package com.file;

import org.apache.commons.io.FileUtils;

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;

public class FileTest23 {
    public static void main(String[] args) throws IOException {
        File file = new File("day07/src/com/file/test/49.jpg");
        File file1 = new File("day07/src/com/file/test/100.jpg");
        FileUtils.copyFile(file,file1);
//        java提供的原生
        Files.copy(Path.of("day07/src/com/file/test/49.jpg"),Path.of("day07/src/com/file/test/102.jpg"));
        String s = Files.readString(Path.of("day07/src/com/file/test/out.txt"));
        System.out.println(s);
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/472047.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【位运算】【 数学】【 哈希映射】2857. 统计距离为 k 的点对

本文涉及知识点 位运算 数学 哈希映射 LeetCode 2857. 统计距离为 k 的点对 给你一个 二维 整数数组 coordinates 和一个整数 k ,其中 coordinates[i] [xi, yi] 是第 i 个点在二维平面里的坐标。 我们定义两个点 (x1, y1) 和 (x2, y2) 的 距离 为 (x1 XOR x2) …

PMP备考心得 | 策略与技巧大揭秘

1.理解考试大纲:首先,你需要熟悉PMP考试的内容和结构。PMI官网提供了详细的考试大纲,包括项目管理的五个过程组(启动、规划、执行、监控、收尾)和十个知识领域; 2.制定学习计划:根据个人的时间…

【C语言】基本语法知识C语言函数操作符详解

主页:醋溜马桶圈-CSDN博客 专栏:C语言_醋溜马桶圈的博客-CSDN博客 gitee:mnxcc (mnxcc) - Gitee.com 目录 1.基本语法 1.1 代码解释 1.1.1 main()主函数 1.1.2 int 1.1.3 { } 1.1.4 printf()库函数 1.1.5 stdio.h头文件 1.2 C语言的…

突破边界:Web3开启数字化社会的新纪元

引言 随着科技的不断进步和数字化社会的发展,Web3正逐渐成为了人们关注的焦点。作为新一代互联网的演进形态,Web3具有突破传统边界、实现去中心化的特点,被认为将开启数字化社会的新纪元。本文将深入探讨Web3的概念、特点、应用场景&#xf…

VueUse常见方法使用

npm i vueuse/core 1、useDebounceFn 节流防抖 import { useDebounceFn } from vueuse/core<button type"button" class"search" click"query">查询</button>// 查询 获取table数据const query2 async () > {try {const res …

MySQL 多表查询强化练习

环境准备 create table dept(id int PRIMARY KEY,dname VARCHAR(50),loc VARCHAR(50) ); insert into dept values (10,研发部,北京), (20,学工部, 上海), (30,销售部,广州 ), (40,财务部,深圳);create table job(id int PRIMARY KEY,jname VARCHAR(20),descripition VARCHAR(…

latex如何对一段文本进行加粗

在LaTeX中&#xff0c;你可以使用\textbf{}命令来对一段文本进行加粗。例如&#xff1a; \textbf{这是要加粗的文本}这将会把"这是要加粗的文本"这段文字显示为加粗。 如果你想要对整段文本进行加粗&#xff0c;你可以将整段文本都放在\textbf{}命令中&#xff0c;…

jsp学习

1.新建文件&#xff0c;创建web动态项目 2.项目点击next两下&#xff0c;点击勾选gentear&#xff0c;点击finish 3.文件成功后是有jsp文件 4.在webapp新建jsp文件 5. 使用模板html5建立文件 <% page language"java" contentType"text/html; charsetUTF-8&qu…

西瓜书机器学习AUC与ℓ-rank(loss)的联系理解以及证明(通俗易懂)

前言 在学习到这部分时&#xff0c;对 ℓ-rank 以及AUC的关系难以理解透彻&#xff0c;在网上看到其他博主也并未弄明白&#xff0c;大家大多写自己的理解&#xff0c;我希望您在看完这篇文章时能够深刻理解这二者的关系&#xff0c;如果我的理解有误&#xff0c;希望您在评论…

数据结构 之 二叉树

&#x1f389;欢迎大家观看AUGENSTERN_dc的文章(o゜▽゜)o☆✨✨ &#x1f389;感谢各位读者在百忙之中抽出时间来垂阅我的文章&#xff0c;我会尽我所能向的大家分享我的知识和经验&#x1f4d6; &#x1f389;希望我们在一篇篇的文章中能够共同进步&#xff01;&#xff01;&…

python网络爬虫实战教学——urllib的使用(1)

文章目录 专栏导读1、前言2、urllib的使用3、发送请求3.1 urlopen3.2 request 专栏导读 ✍ 作者简介&#xff1a;i阿极&#xff0c;CSDN 数据分析领域优质创作者&#xff0c;专注于分享python数据分析领域知识。 ✍ 本文录入于《python网络爬虫实战教学》&#xff0c;本专栏针对…

mysql 数据库 基本介绍

一 数据 &#xff08;一&#xff09;数据是什么 描述事物的符号记录 包括数字&#xff0c;文字、图形、图像、声音、档案记录气 以“记录”形式按统一的格式进行存储 &#xff08;二&#xff09;数据的分类 1&#xff0c;结构化的数据 即有固定格式和有限长度的数据。例…

01_Kubernetes基础

Kubernetes为什么叫K8S&#xff1a;因为K和S之间有8个字母 为什么需要K8S 对于云计算来说有自己的交互标准 Paas的下一代标准就是容器化&#xff0c;容器的集群化有没有很好的方案&#xff1f;有需求就会有产品&#xff0c;这个产品就叫做资源管理器。 首先是Apache的MESOS&…

Linux虚拟主机默认隐藏文件,如何开启显示

收到一位用户反馈他买了Hostease Linux虚拟主机&#xff0c;想要知道主机默认隐藏文件如何开启。据悉目前大部分主机提供商出售的Linux虚拟主机带的都是cPanel面板&#xff0c;因此开启隐藏文件操做需要进入到cPanel面板。操做步骤如下&#xff1a; 1.首先需要先登陆cPanel面板…

深度强化学习03价值学习

Q*类似于先知&#xff0c;知道动作的后果 价值学习是得到一个近似的价值函数

【Linux】Linux安装软件---软件包管理器 yum

主页&#xff1a;醋溜马桶圈-CSDN博客 专栏&#xff1a;Linux_醋溜马桶圈的博客-CSDN博客 gitee&#xff1a;mnxcc (mnxcc) - Gitee.com 目录 1.Linux中安装软件 1.1 源代码安装 1.2 rpm包安装 1.3 yum安装 1.3.1 举例 1.3.2 图示yum下载安装 2.Linux系统的生态 如何选…

如何构建Docker自定义镜像

说明&#xff1a;平常我们使用Docker运行各种容器&#xff0c;极大地方便了我们对开发应用的使用&#xff0c;如MySQL、Redis&#xff0c;以及各种中间件&#xff0c;使用时只要拉镜像&#xff0c;运行容器即可。本文介绍如何创建一个Demo&#xff0c;自定义构建一个镜像。 开…

酷开科技聚焦大屏端数据研究,构建酷开系统深度挖掘大屏商业价值

中国所有的彩色大屏中&#xff0c;智能电视规模已经过半&#xff0c;OTT平台的数据价值越发引起人们关注。作为OTT行业的头部代表&#xff0c;酷开科技一直聚焦大屏端数据研究&#xff0c;目前已经形成一套基于大屏指数的智慧营销体系&#xff0c;让OTT大屏的数字营销化水平实现…

开源工具专题-02 Confluence企业级wiki

开源工具专题-02 Confluence企业级wiki 注&#xff1a; 本教程由羞涩梦整理同步发布&#xff0c;本人技术分享站点&#xff1a;blog.hukanfa.com 转发本文请备注原文链接&#xff0c;本文内容整理日期&#xff1a;2024-3-20 csdn 博客名称&#xff1a;五维空间-影子&#xf…

使用libdivsufsort库构建后缀数组

libdivsufsort是一个C语言库,用于构建后缀数组(Suffix Array)以及执行与后缀数组相关的操作。后缀数组是一种数据结构,用于有效地解决字符串处理问题,如字符串匹配、最长公共子串等。这个库的目标是提供高效、可移植和易于使用的后缀数组实现。 https://github.com/y-256…