理解字符流和字节流,节点流和处理流、缓冲流、InputStreamReader、BufferInputStream、BufferReader...

news2025/3/12 15:34:52

DAY10.2 Java核心基础

IO流

字符流和字节流

字符流和字节流在每次处理数据的单位不同,一个是字符,一个是字节

如果复制文件类型是文本类型,字节流字符流都可以

如果复制的文件类型是非文本类型,则只能使用字节流,使用字符流会导致文件不可用

public static void main(String[] args) throws IOException {
    File file1 = new File("H:\\JavaCode\\src\\main\\java\\com\\deepSeek\\shuwu\\Day10\\img.png");
    FileReader fileReader = new FileReader(file1);
    FileWriter fileWriter = new FileWriter("H:\\JavaCode\\src\\main\\java\\com\\deepSeek\\shuwu\\Day10\\img2.png");
    int temp = 0;
    while ((temp = fileReader.read()) != -1) {
        fileWriter.write(temp);
    }
    fileWriter.close();
    fileReader.close();
}

image-20250311160402691

用字符流复制文件导致文件受损不可用,打开文件失败

但是字节流就可以完美复制,因为字节流每次操作的最小数据,什么数据格式都可以复制

public static void main(String[] args) throws IOException {
    File file1 = new File("H:\\JavaCode\\src\\main\\java\\com\\deepSeek\\shuwu\\Day10\\img.png");
    File file2 = new File("H:\\JavaCode\\src\\main\\java\\com\\deepSeek\\shuwu\\Day10\\img2.png");
    InputStream inputStream = new FileInputStream(file1);
    OutputStream outputStream = new FileOutputStream(file2);
    int temp = 0;
    while ((temp = inputStream.read()) != -1) {
        outputStream.write(temp);
    }
    inputStream.close();
    outputStream.close();
}

处理流

字节流是基础管道,字符流是在字节流基础上转化而来的

Java提供了完成转化的类,按照输入和输出两个方向分为输入转化流(InputStreamReader)和输出转化流(OutputStreamWriter)

InputStreamReader

public static void main(String[] args) throws IOException {
    File file1 = new File("H:\\JavaCode\\src\\main\\java\\com\\deepSeek\\shuwu\\Day10\\test3.txt");
    InputStream inputStream = new FileInputStream(file1);
    InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
    int i;
    int num = 0;
    while ((i=inputStreamReader.read())!=-1){
        System.out.println(i);
        num++;
    }
    inputStreamReader.close();
    System.out.println(num);
}

InputStreamReader是Reader的子类,所以它是一个字符输入流

OutputStreamWriter

public static void main(String[] args) throws IOException {
    File file1 = new File("H:\\JavaCode\\src\\main\\java\\com\\deepSeek\\shuwu\\Day10\\test3.txt");
    OutputStream outputStream = new FileOutputStream(file1);
    OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream);
    outputStreamWriter.write("今天天气怎么样");
    outputStreamWriter.flush();
    outputStreamWriter.close();
}

OutputStreamWriter是Writer的子类,所以它是一个字符输出流

缓冲流

为了减少对硬盘的资源开销,引入的缓冲流,自带缓冲区,可以一次性读取硬盘的部分输出存入缓冲区,再写入内存中

缓冲流属于处理流,不能直接关联文件操作,只能对已存在的节点流进行操作

如何区分节点流和处理流?

  • 节点流:可以关联文件创建,有个构造函数传递file文件类进行创建
  • 处理流:不能直接关联文件创建,不能通过构造函数传递file文件类进行创建

缓冲流又可以分为:

  • 字节缓冲流:字节输入缓冲流、字节输出缓冲流
  • 字符缓冲流:字符输入缓冲流、字符输出缓冲流

字节输入缓冲流(BufferInputStream)

public static void main(String[] args) throws IOException {
    File file1 = new File("H:\\JavaCode\\src\\main\\java\\com\\deepSeek\\shuwu\\Day10\\test3.txt");
    BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream(file1));
    while (bufferedInputStream.available() != 0){
        System.out.println(bufferedInputStream.read());
    }
}

字节输出缓存流(BufferedInputStream)

public static void main(String[] args) throws IOException {
    File file1 = new File("H:\\JavaCode\\src\\main\\java\\com\\deepSeek\\shuwu\\Day10\\test3.txt");
    BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream(file1));
    String content ="JDK(Java Development Kit)称为Java开发包或Java开发工具,\r\n是一个编写Java应用程序的开发环境";
    bufferedOutputStream.write(content.getBytes());
    bufferedOutputStream.flush();
    bufferedOutputStream.close();
}

字符输入缓存流(BufferReader),很好用,可以读取一行的数据

文件内容:

image-20250311232124705

    public static void main(String[] args) throws IOException {
        File file1 = new File("H:\\JavaCode\\src\\main\\java\\com\\deepSeek\\shuwu\\Day10\\test3.txt");
        BufferedReader br = new BufferedReader(new FileReader(file1));
//        String line;
//        int count = 0;
//        while ((line = br.readLine()) != null) {
//            System.out.println(line);
//            count++;
//        }
//        System.out.println(count);
        int temp;
        while ((temp = br.read()) != -1) {
            System.out.println(temp);
        }
    }

输出:

image-20250311232139766

可以看见44为逗号,13和10代表换行符 \n

中文字符需要的长度长一点,1个中文字符需要3个字节,这样每一个字符读取比字节读取效率更高,但是我们还有更加高效的方法

readLine() 方法

public static void main(String[] args) throws IOException {
    File file1 = new File("H:\\JavaCode\\src\\main\\java\\com\\deepSeek\\shuwu\\Day10\\test3.txt");
    BufferedReader br = new BufferedReader(new FileReader(file1));
    String line;
    int count = 0;
    while ((line = br.readLine()) != null) {
        System.out.println(line);
        count++;
    }
    System.out.println(count);
}

输出:

image-20250311232413420

BufferedReader有一个读取每行的方法,更加高效简洁

字符输出缓冲流(BufferedWriter )

BufferedWriter 提供了一个可以直接将字符串输出的方法 write(String str)

public static void main(String[] args) throws IOException {
    File file1 = new File("H:\\JavaCode\\src\\main\\java\\com\\deepSeek\\shuwu\\Day10\\test3.txt");
    BufferedWriter bw = new BufferedWriter(new FileWriter(file1));
    String content = "JDK(Java Development Kit)称为Java开发包或Java开发工具,\r\n是一个编写Java应用程序的开发环境";
    bw.write(content);
    bw.flush();
    bw.close();
}

序列化和反序列化

将文件读取到内存中,以 byte、数组、char、String 类型展示的,同理我们也可以将内存中的数字或者字符串数据输出到文件中

如果我们需要将内存中的对象输出到文件中,或者从文件中读取数据并还原成内存中的对象,如何处理?

  • 序列化:将内存中的对象输出到硬盘文件中进行保存

需要序列化的User类,必须实现Serializable接口

public class User implements Serializable {
    private String name;
    private int age;

    public User(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;
    }

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

测试接口:

public static void main(String[] args) throws IOException, ClassNotFoundException {
    File file1 = new File("H:\\JavaCode\\src\\main\\java\\com\\deepSeek\\shuwu\\Day10\\test3.txt");
    User user = new User("张三", 18);
    ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream(file1));
    objectOutputStream.writeObject(user);
    objectOutputStream.flush();
    objectOutputStream.close();
}

写入到文件:

image-20250311234654154

  • 反序列化:从文件中读取数据并还原成内存中的对象
public static void main(String[] args) throws IOException, ClassNotFoundException {
    File file1 = new File("H:\\JavaCode\\src\\main\\java\\com\\deepSeek\\shuwu\\Day10\\test3.txt");
    User user = new User("张三", 18);
    ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream(file1));
    Object o = objectInputStream.readObject();
    User user1 = (User) o;
    System.out.println(user1);
    objectInputStream.close();
}

输出:

image-20250311234819982

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

DBeaver安装教程+连接TDengine数据库

为TDengine安装的DBeaver教程 安装 23.1.1 版本以上的DBeaver 因为官方文档说这个版本之上的DBeaver才支持TDengine内嵌前往DBeaver 官方文档进行版本下载滑到链接最下面点击进入 点击download,进入选择下载版本 等待下载成功即可双击自行安装 打开数据库连接TDen…

【三维重建】Proc-GS:使用3DGS的程序性城市建筑生成

标题:《Proc-GS: Procedural Building Generation for City Assembly with 3D Gaussians》 项目:https://city-super.github.io/procgs/ 来源:香港中文大学;上海人工智能实验室 等 文章目录 摘要一、 程序代码定义 (Procedural Co…

商业智能BI的未来,如何看待AI+BI这种模式?

昨天在和一位朋友线上聊天的时候,提了一个问题,你是如何看待AI(人工智能)BI(商业智能)这种模式和方向的,我大概来说一下我个人的看法。 以我在商业智能BI项目中接触到的行业和企业,…

25.3.12.Linux内核如何和设备树协同工作的?

1.编写设备树 cd arch/riscv/boot/dts/ 再cd到厂商,例如下述内容。 2.编译设备树(dts->dtb)通过dtc命令来转换 3.解析设备树 例如上述内容,都是对设备树的解析。 这里重点说一下内核对设备树的处理吧,因为这个内容是设备树的重点了。 从源代码文件 dts 文件开始

Flutter 基础组件 Text 详解

目录 1. 引言 2. 基本使用 3. 自定义样式 4. 文本对齐与溢出控制 5. 外边距 5.1 使用 Container 包裹 5.2 使用 Padding 组件 5.3 在 Row/Column 中使用 5.4 动态边距调整 5.5 关键区别说明 5.6 设置 margin 无效 6. 结论 相关推荐 1. 引言 Text 组件是 Flutter 中…

Torch 模型 model => .onnx => .trt 及利用 TensorTR 在 C++ 下的模型部署教程

一、模型训练环境搭建和模型训练 模型训练环境搭建主要牵扯 Nvidia driver、Cuda、Cudnn、Anaconda、Torch 的安装,相关安装教程可以参考【StarCoder 微调《个人编程助手: 训练你自己的编码助手》】中 5.1 之前的章节。 模型训练的相关知识可以参考 Torch的编程方…

爱普生可编程晶振SG-8200CJ特性与应用

在高速发展的电子技术领域,时钟源作为电子系统的“心脏”,其性能直接影响设备的稳定性与可靠性。爱普生SG-8200CJ可编程晶振凭借其优秀的频率精度、低抖动性能及广泛的环境适应性,正成为众多领域的得力之选,为各类设备的高效运行与…

ubuntu中用docker下载opengauss

1.安装docker sudo apt install docker.io2.拉取opengauss镜像 sudo docker pull enmotech/opengauss3.创建容器 sudo docker run --name opengauss --privilegedtrue -d -e GS_PASSWORDEnmo123 enmotech/opengauss:latest3.5.如果容器停止运行(比如关机了&#…

tslib

使用tslib来读取触摸屏的数据,可以得到原始数据,也可以在原始数据的基础上进行一些处理。比如有些触摸屏比较不稳定,跳动比较大,我们可以将跳动比较大的数据给删除掉 plugins里面的每个文件都会被编译成一个动态库,这些…

MoonSharp 文档三

MoonSharp 文档一-CSDN博客 MoonSharp 文档二-CSDN博客 MoonSharp 文档四-CSDN博客 MoonSharp 文档五-CSDN博客 7.Proxy objects(代理对象) 如何封装你的实现,同时又为脚本提供一个有意义的对象模型 官方文档:MoonSharp 在实际…

linux和windows之间的复制

第一步 sudo apt-get autoremove open-vm-tools第二步 sudo apt-get update第三步 sudo apt-get install open-vm-tools-desktop按y 第四步 重启虚拟机,终端下输入 rebootLinux下 按“ CtrlShiftC V ”复制粘贴 Windows下按“ Ctrl C V ”复制粘贴

在资源有限中逆势突围:从抗战智谋到寒门高考的破局智慧

目录 引言 一、历史中的非对称作战:从李牧到八路军的智谋传承 李牧戍边:古代军事博弈中的资源重构 八路军的游击战:现代战争中的智慧延续 二、创业界的逆袭之道:小米与拼多多的资源重构 从MVP到杠杆解 社交裂变与资源错配 …

javascript-es6 (六)

编程思想 面向过程 面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候再一个一个的依次 调用就可以了 就是按照我们分析好了的步骤,按照步骤解决问题 面向对象 面向对象是把事务分解成为一个个对象&…

Spring AI 1.0.0 M6新特性MCP

Spring AI 1.0.0 M6新特性MCP 前言一、MCP是什么?(Model Context Protocol)二、它的发展历程三、核心架构四、MCP Java SDK的核心能力Java MCP实现遵循三层架构:MCP客户端MCP服务器总结MCP 的核心能力总结多种传输选项 搭建服务端…

【性能测试入门_01性能测试jmeter基础实操场景详解】

一、应用项目如何部署在服务器上 可以将项目进行打jar包 双击install,控制台就会打印打包的过程 最终打的包,会存放在打印的那个路径下 这个jar包,就是开发人员开发好,直接可以部署的 可以通过命令,在终端直接启动这…

跨越时空的对话:图灵与GPT-4聊AI的前世今生

(背景:虚拟咖啡厅,图灵身着1950年代西装,端着一杯热茶,GPT-4以全息投影形态坐在对面) 图灵(喝了口茶):“听说你能写诗?我当年在布莱切利园破解Enigma时&…

如何通过 Seatunnel 实现 MySQL 到 OceanBase的数据迁移同步

1. 准备传输工具 本方案采用 Apache Seatunnel(简称seatunnel)进行MySQL 到 OceanBase 的数据迁移和同步,出于对方案轻量性的考量,我们采用其内置的Zeta引擎来实现,包括全量同步、离线增量同步,以及CDC方案…

软件设计模式之简单工厂模式

目录 一.类图(手机生产) 二.代码实现 Iphone类: Vivo类: Mobile类: MobileFactory类: Client类: 一.类图(手机生产) 补充:MobileFactory也可以直接指向…

LiveGBS流媒体平台GB/T28181常见问题-视频流安全控制HTTP接口鉴权勾选流地址鉴权后401Unauthorized如何播放调用接口流地址校验

LiveGBS流媒体平台GB/T28181常见问题频流安全控制HTTP接口鉴权勾选流地址鉴权后401Unauthorized如何播放调用接口流地址校验? 1、安全控制1.1、HTTP接口鉴权1.2、流地址鉴权 2、401 Unauthorized2.1、携带token调用接口2.1.1、获取鉴权token2.1.2、调用其它接口2.1.…

Java 大视界 -- 区块链赋能 Java 大数据:数据可信与价值流转(84)

💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…