4. IO Stream

文章目录

  • 一、相对论理解IO流
  • 二、汉语文学理解流
  • 三、图解IO流
  • 四、俩亲爹InputStream和OutputStream
  • 五、FileInputStream字节流读取文件
  • 六、FileOutputStream字节流写入文件
  • 七、buff缓冲复制文件
    • 1. 例一(无buff)
    • 2. 例二(有buff)
  • 八、buffered字节缓冲流和装饰设计模式
  • 九、FileReader和FileWriter,俩专门来搞txt文件的
  • 十、BufferedReader和BufferedWriter
  • 十一、一次性讲解剩余的N个流(扩展课)Java里那些极其骚的IO流
  • 十二、Apache Common IO
    • 1. 例一
    • 2. 例二(arrayList的妙用)
  • 十三、补充
  • 十四、内容出处

一、相对论理解IO流

官方文档
在这里插入图片描述
在这里插入图片描述
        不仅是水,数据也是如此。例如,你发了一个视频给你的朋友,数据就从你的电脑上流通到了ta的电脑上,这个过程就叫数据流。

二、汉语文学理解流

为什么中国人用”流"这个字,而外国人用"stream"来代替?
这个字的偏旁是三点水,所以古人说的流一定跟水有关。可以引申为数据在流动时也像水一样流动
在这里插入图片描述

三、图解IO流

官方文档在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
        当我们打开一个记事本读取里面的内容时,数据从本地存储设备流入记事本程序。因此,相对于记事本程序而言,数据是输入的;相对于本地存储设备而言,数据是输出的。

四、俩亲爹InputStream和OutputStream

Package java.io
重点关注这俩:
在这里插入图片描述
在这里插入图片描述
filechannel(文件通道):并发编程 现在可以先忽略

五、FileInputStream字节流读取文件

第一部分代码出处
菜鸟教程
① 字节流:以字节为单位去读和写,好处在于可以读写任何文件(图片、.mp3、.mp4等都可以化为字节)
② FileInputStream又称为字节流的原因:它是按照字节来读的
在这里插入图片描述

package com.practice.demo3;

import org.junit.Test;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Arrays;

public class TestIo {
    private final static int SIZE = 4096;
    @Test
    public void inputFile() throws IOException {
        FileInputStream fileInputStream = new FileInputStream("file\\1.txt");
//        System.out.println("------------该部分代码来自上述网页--------------------------");
        /*
        System.out.println("按字节读取, read()返回读取到的字节");
        int by = 0;
        // 如果读到文件末尾, 则会返回-1
        while ((by = fileInputStream.read()) != -1){
            System.out.println(by);
        }
        */
        /*
        System.out.println("read(byte[] b)返回读取到的字节个数");
        byte[] buf = new byte[30];
        int len = fileInputStream.read(buf);
        System.out.println(len);
        System.out.println(Arrays.toString(buf));
        System.out.println(new String(buf, 0, len));
        */
        /*
        System.out.println("创建一个字节数组");
        int len = 0;
        byte[] buf = new byte[SIZE];
        while((len = fileInputStream.read(buf))!= -1){
            System.out.println(new String(buf, 0, len));
        }
         */
//        System.out.println("---------------------------------------------------");
        System.out.println("结合一下菜鸟教程的案例:");
        int by;
        while ((by = fileInputStream.read()) != -1){
            System.out.print((char)by);
        }
        fileInputStream.close(); // 不用的话就把管子切断,节省内存
        // 以上写法其实都更倾向于读取一个字节数组
    }
}

六、FileOutputStream字节流写入文件

菜鸟教程
在这里插入图片描述
执行结果:
在这里插入图片描述

   @Test
    public void outputFile() throws IOException {
        FileOutputStream fileOutputStream = new FileOutputStream("file\\2.txt");
        // getBytes()作用:把字符串转换成字符数组
        byte[] bytes = "Hello World!".getBytes();
//        for(int i = 0; i < bytes.length; ++i){
//            System.out.print((char)bytes[i]);
//        }
        // 第一次执行上述命令后2.txt就会被创建出来, 删除方式:右击2.txt -> Delete -> OK -> 左下角Do Refactor
        
        // 把字符数组里的内容写入文件
        for(int i = 0; i < bytes.length; ++i){
            fileOutputStream.write(bytes[i]);
        }
        fileOutputStream.close();
    }

七、buff缓冲复制文件

文件输入输出流还有一些用途,比如说像:文件拷贝(文本文件(.txt)、媒体文件(.mp3、mp4、图片)均可)

1. 例一(无buff)

① 图片大的话可能会卡
② 此时是一个字节一个字节地从源文件读取,并且一个字节一个字节地写入到目标文件中。这种方式由于每次只处理一个字节,导致频繁地进行磁盘I/O操作,效率非常低。
在这里插入图片描述

@Test
    public void copyFileBase() throws IOException{
        FileInputStream fileInputStream = new FileInputStream("file\\1.jpg");
        FileOutputStream fileOutputStream = new FileOutputStream("file\\target.jpg");
        int by;
        while((by = fileInputStream.read()) != -1){
            fileOutputStream.write(by);
        }
        fileInputStream.close();
        fileOutputStream.close();
    }

2. 例二(有buff)

        代码使用了缓冲区(buffer),这是一个字节容器,用于在内存中暂存数据。缓冲区的大小在这里被设置为1024字节。这样,每次从源文件读取和写入目标文件时,都是按照缓冲区的大小来进行的,即每次操作都是1024字节。这大大减少了磁盘I/O操作的次数,因为每次操作都处理更多的数据,从而显著提高了文件复制的速度。
        当调用 fileInputStream.read(buff) 方法时,它会尝试填充整个缓冲区(最多1024字节),然后返回实际读取的字节数。这个字节数可能小于1024,比如在文件的最后部分。然后,fileOutputStream.write(buff, 0, by) 方法将这些字节写入目标文件。这个过程会一直重复,直到文件结束(即 read 方法返回-1)。
        可以理解为搬运箱子,之前是一个人搬一个箱子,突然来了个大力士,一次性可以搬10个箱子。
        总结来说,使用缓冲区是处理I/O操作时提高效率的常见做法,这在处理大文件时尤其重要。
在这里插入图片描述

 @Test
    public void copyFileBase2() throws IOException{
        FileInputStream fileInputStream = new FileInputStream("File\\1.jpg");
        FileOutputStream fileOutputStream = new FileOutputStream("File\\target2.jpg");
        // 缓冲区
        // 1024单位:字节
        byte[] buff = new byte[1024];
        int by;
        while((by=fileInputStream.read(buff)) != -1){
            fileOutputStream.write(buff, 0, by);
        }
        fileInputStream.close();
        fileOutputStream.close();
    }

八、buffered字节缓冲流和装饰设计模式

BufferedInputStream
① 之前用的是普通的字节流,然后手动创建缓冲区;现在直接用缓冲流,好处在于不需要自己手写缓冲区了。
② 装饰设计模式:把一个类当作一个函数的参数传进去
在这里插入图片描述
③ 这里默认的缓冲区大小是8192字节
在这里插入图片描述
在这里插入图片描述

@Test
    public void bufferFileBase() throws IOException{
        BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream("file\\1.txt"));
        BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream("file\\3.txt"));
        int by;
        while((by = bufferedInputStream.read()) != -1){
            bufferedOutputStream.write(by);
        }
        bufferedInputStream.close();
        bufferedOutputStream.close();
    }

九、FileReader和FileWriter,俩专门来搞txt文件的

在这里插入图片描述
② FileReader
     FileWriter
③ 用文件写学生管理系统,别再用FileInputStream和FileOutputStream了,应该用FileReader和FileWriter(它们针对于记事本这种输入输出设备文件)
在这里插入图片描述
在这里插入图片描述
        但是我们可以从源码发现,FileReader和FileWriter的原理其实还是FileInputStream和FileOutputStream,只不过它俩可以使代码看起来更简洁一点。

@Test
    public void fileReaderTest() throws IOException{
        FileReader fileReader = new FileReader("file\\1.txt");
        int ch;
        while((ch = fileReader.read()) != -1){
            // 可以把ln删掉
            System.out.print((char)ch);
        }
        fileReader.close();
    }
    @Test
    public void fileWriterTest() throws IOException{
        FileWriter fileWriter = new FileWriter("file\\4.txt");
        fileWriter.write("hello world!");
        fileWriter.close();
    }

十、BufferedReader和BufferedWriter

BufferedReader
BufferedWriter
① 进一步补充:用文件写学生管理系统,BufferedReader和BufferedWriter比FileReader和FileWriter速度快。
② 除此之外,BufferedWriter里有一个newLine()方法,可以根据不同的系统生成换行符(因为不同的系统换行符可能不同),所以更推荐用它去写入文件;BuffertedReader里有一个readLine()方法,可以按行读取字符
③ 但实际工作可能不太用这些

 @Test
    public void bufferedReaderTest() throws IOException{
        BufferedReader bufferedReader = new BufferedReader(new FileReader("file\\2.txt"));
        // 因为是字符流所以用String
        // 之前用int那种实际是有问题的
        String str;
        while ((str = bufferedReader.readLine()) != null){
            // 这个时候就可以加ln了
            System.out.println(str);
        }
        bufferedReader.close();
    }
    @Test
    public void bufferedWriterTest() throws IOException{
        BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("file\\5.txt"));
        bufferedWriter.write("hhhhhhhh");
        bufferedWriter.newLine();
        bufferedWriter.write("ffffffff");
        bufferedWriter.close();
    }

十一、一次性讲解剩余的N个流(扩展课)Java里那些极其骚的IO流

① 借助它们可以用字节流操作字符流。但是要注意文件得是文本文件(因为涉及到操作字符流)
转换流InputStreamReader
转换流OutputStreamWriter
② 对象输入输出流:把一个对象写入文件,传的参数是一个Object对象
在这里插入图片描述
③ 存取成员变量(成员数据)
在这里插入图片描述
④ 打印流:存一个小的东西作为字符串输出
在这里插入图片描述
⑤ 输入输出流:System.out.println
在上述PrintStream里
⑥ 控制台
在这里插入图片描述
⑦ 多线程管道流(写底层用的,平时用得不多):多线程用的,多线程管道输入。这个流需要一个线程控制它去读,一个线程控制它去写,跟打电话一样。
在这里插入图片描述
Channel就是一个信道,和管道有区别。它们都跟并发有关,性能很高。
在这里插入图片描述
在这里插入图片描述
⑩ 可以理解为装货卸货。货多的时候就算用缓冲流也依然很慢。ByteArrayOutputStream这个类在创建时会自动创建一个Byte[]类型的缓冲区,写入的时候先把所有东西丢到缓冲区,最后再把所有东西一次性扔到另一个文件里
在这里插入图片描述
⑪ 跟上面的类似,只不过这里存的是char
在这里插入图片描述
⑫ 网上那种多线程下载跟这个类似,它会把两个东西进行合并。例如创建2个文件input流时,它可以把2个流合并,变成一个流。
在这里插入图片描述
另一个构造方法用到泛型(写框架会用到),可以提供多个流进行合并
在这里插入图片描述
⑬ I/O流都是从前向后,先后顺序读取。要想从文件任意处进行读写操作,字符流和字节流都做不到,只有RandomAccessFile可以实现。它虽然在java.io包里,但是它不属于流
在这里插入图片描述
它可以用指针表明开始位置
在这里插入图片描述
或者直接用随机戳生成pos随机数
在这里插入图片描述

十二、Apache Common IO

apache公司自己写的io,可以帮助我们简化开发流程,非常实用
2.18jar包下载
2.18API文档
这里面有很多有意思的代码,例如:FileUtils。上节课手写的一些东西,这里几乎都有封装好可以直接拿来用的方法。
例子

1. 例一

在这里插入图片描述

@Test
    public void writeTest() throws IOException{
        File file = new File("file\\6.txt");
        if(!file.exists()){
            file.createNewFile();
        }
        FileUtils.writeLines(file, new ArrayList(Collections.singleton(("春风很柔,夏风很烈,秋风清爽,东风凛冽,你就是春夏秋冬的风"))), true);
    }

2. 例二(arrayList的妙用)

在这里插入图片描述
需要往文件里写很多东西时就可以用它
在这里插入图片描述
writeLines方法涉及到泛型

package com.practice.demo3;

public class Student {
    private String name;
    private int age;

    public Student() {
    }

    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;
    }

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

@Test
    public void writeTest2() throws IOException{
        File file = new File("file\\7.txt");
        if(!file.exists()){
            file.createNewFile();
        }
        ArrayList<Student> arrayList = new ArrayList<>();
        // 第一个学生
        arrayList.add(new Student("Tom", 12));
        // 第二个学生
        arrayList.add(new Student("Jerry", 14));
        FileUtils.writeLines(file, arrayList, true);
    }

十三、补充

File和IO Stream配合使用非常强

十四、内容出处

java

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

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

相关文章

图数据库 | 12、图数据库架构设计——高性能计算架构

在传统类型的数据库架构设计中&#xff0c;通常不会单独介绍计算架构&#xff0c;一切都围绕存储引擎展开&#xff0c;毕竟存储架构是基础&#xff0c;尤其是在传统的基于磁盘存储的数据库架构设计中。 类似地&#xff0c;在图数据库架构设计中&#xff0c;项目就围绕存储的方…

YOLOv9改进,YOLOv9引入SAConv可切换空洞卷积,二次创新RepNCSPELAN4结构

摘要 作者提出的技术结合了递归特征金字塔和可切换空洞卷积,通过强化多尺度特征学习和自适应的空洞卷积,显著提升了目标检测的效果。 理论介绍 空洞卷积(Atrous Convolution)是一种可以在卷积操作中插入“空洞”来扩大感受野的技术,更有效地捕捉到图像中的大范围上下文…

【热门主题】000075 探索嵌入式硬件设计的奥秘

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 【热…

CanFestival移植到STM32 F4芯片(基于HAL库)

本文讲述如何通过简单操作就可以把CanFestival库移植到STM32 F4芯片上&#xff0c;作为Slave设备。使用启明欣欣的工控板来做实验。 一 硬件连接 观察CAN报文需要专门的设备&#xff0c;本人从某宝上买了一个兼容PCAN的开源小板子&#xff0c;二十几块钱&#xff0c;通过USB接…

洛谷P1827 [USACO3.4] 美国血统 American Heritage(c嘎嘎)

题目链接&#xff1a;P1827 [USACO3.4] 美国血统 American Heritage - 洛谷 | 计算机科学教育新生态 题目难度&#xff1a;普及 首先介绍下二叉树的遍历&#xff1a; 学过数据结构都知道二叉树有三种遍历&#xff1a; 1.前序遍历&#xff1a;根左右 2.中序遍历&#xff1a;左根…

工业—使用Flink处理Kafka中的数据_ProduceRecord2

使用 Flink 消费 Kafka 中 ProduceRecord 主题的数据,统计在已经检验的产品中,各设备每 5 分钟 生产产品总数,将结果存入HBase 中的 gyflinkresult:Produce5minAgg 表, rowkey“

JavaEE-经典多线程样例

文章目录 单例模式设计模式初步引入为何存在单例模式饿汉式单例模式饿汉式缺陷以及是否线程安全懒汉式单例模式基础懒汉式缺陷以及是否线程安全懒汉式单例模式的改进完整代码(变量volatile) 阻塞队列生产者消费者模型生产者消费者模型的案例以及优点请求与响应案例解耦合削峰填…

Web3的技术栈详解:解读区块链、智能合约与分布式存储

随着数字时代的不断发展&#xff0c;Web3作为下一代互联网的核心理念逐渐走进了大众视野。它承载着去中心化、用户主权以及更高效、更安全的网络环境的期望。Web3不再是由少数中心化机构主导的网络&#xff0c;而是通过一系列核心技术的支撑&#xff0c;给每个用户赋予了更多的…

贪心算法实例-问题分析(C++)

贪心算法实例-问题分析 饼干分配问题 有一群孩子和一堆饼干&#xff0c;每个小孩都有一个饥饿度&#xff0c;每个饼干都有一个能量值&#xff0c;当饼干的能量值大于等于小孩的饥饿度时&#xff0c;小孩可以吃饱&#xff0c;求解最多有多少个孩子可以吃饱?(注:每个小孩只能吃…

虚幻引擎---材质篇

一、基础知识 虚幻引擎中的材质&#xff08;Materials&#xff09; 定义了场景中对象的表面属性&#xff0c;包括颜色、金属度、粗糙度、透明度等等&#xff1b;可以在材质编辑器中可视化地创建和编辑材质&#xff1b;虚幻引擎的渲染管线的着色器是用高级着色语言&#xff08;…

Python从入门到入狱

Python是从入门到入狱&#xff1f;这个充满调侃意味的说法在程序员圈子里流传甚广。表面看&#xff0c;它似乎是在嘲笑这门语言从简单易学到深陷麻烦的巨大反差&#xff0c;实际上却隐藏着很多值得深思的问题。要解读这个话题&#xff0c;得从Python的特点、使用场景以及潜在风…

使用PaddlePaddle实现线性回归模型

目录 ​编辑 引言 PaddlePaddle简介 线性回归模型的构建 1. 准备数据 2. 定义模型 3. 准备数据加载器 4. 定义损失函数和优化器 5. 训练模型 6. 评估模型 7. 预测 结论 引言 线性回归是统计学和机器学习中一个经典的算法&#xff0c;用于预测一个因变量&#xff0…

华为NPU服务器昇腾Ascend 910B2部署通义千问Qwen2.5——基于mindie镜像一路试错版(三)

文章目录 前言纯模型推理启动服务后面干什么?这可咋整啊?愁死了!总结前言 这是咱这个系列的第三个文章了。 毕竟,这是我好几天摸索出的经验,能帮助各位在几个小时内领会,我觉得也算是我的功劳一件了。 所以,一是希望大家耐心看下去,耐心操作下去;而是恳请各位多多关…

BERT模型的输出格式探究以及提取出BERT 模型的CLS表示,last_hidden_state[:, 0, :]用于提取每个句子的CLS向量表示

说在前面 最近使用自己的数据集对bert-base-uncased进行了二次预训练&#xff0c;只使用了MLM任务&#xff0c;发现在加载训练好的模型进行输出CLS表示用于下游任务时&#xff0c;同一个句子的输出CLS表示都不一样&#xff0c;并且控制台输出以下警告信息。说是没有这些权重。…

【Linux操作系统】多线程控制(创建,等待,终止、分离)

目录 一、线程与轻量级进程的关系二、进程创建1.线程创建线程创建函数&#xff08;pthread&#xff09;查看和理解线程id主线程与其他线程之间的关系 三、线程等待&#xff08;回收&#xff09;四、线程退出线程退出情况线程退出方法 五、线程分离线程的优点线程的缺点 一、线程…

Android ConstraintLayout 约束布局的使用手册

目录 前言 一、ConstraintLayout基本介绍 二、ConstraintLayout使用步骤 1、引入库 2、基本使用&#xff0c;实现按钮居中。相对于父布局的约束。 3、A Button 居中展示&#xff0c;B Button展示在A Button正下方&#xff08;距离A 46dp&#xff09;。相对于兄弟控件的约束…

【论文复现】隐式神经网络实现低光照图像增强

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀ 隐式神经网络实现低光照图像增强 引言那么目前低光照图像增强还面临哪些挑战呢&#xff1f; 挑战1. 不可预测的亮度降低和噪声挑战2.度量友好…

【机器学习】机器学习的基本分类-监督学习-决策树-C4.5 算法

C4.5 是由 Ross Quinlan 提出的决策树算法&#xff0c;是对 ID3 算法的改进版本。它在 ID3 的基础上&#xff0c;解决了以下问题&#xff1a; 处理连续型数据&#xff1a;支持连续型特征&#xff0c;能够通过划分点将连续特征离散化。处理缺失值&#xff1a;能够在特征值缺失的…

Spring和SpringBoot的关系和区别?

大家好&#xff0c;我是锋哥。今天分享关于【Spring和SpringBoot的关系和区别&#xff1f;】面试题。希望对大家有帮助&#xff1b; Spring和SpringBoot的关系和区别&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Spring和Spring Boot是两种相关但有所…

Scrapy 中的配置笔记

概述 scrapy在命令启动之前&#xff0c;先设置好了各种配置文件。其中包括系统自带的默认配置文件&#xff0c;还有用户自定义的settings.py。其中还有一个日常开发中不怎么用的scrapy.cfg文件&#xff0c;这个文件是用来告诉scrapy用户自定义的settings.py文件在哪里的 关键…