IO-IO基础

news2025/2/28 23:16:08

简介

IO流,以计算机内存为主体,从内存到网络/磁盘等其他地方叫输出流(内存往外出);网络/磁盘等其他地方写到内存叫输入流(往内存输入)。

Java中的IO流 4个抽象基类

  • InputStream/Reader(读到内存里)
    • 所有的输入流的基类,前者是字节输入流,后者是字符输入流。
  • OutputStream/Writer(由内存往外写)
    • 所有输出流的基类,前者是字节输出流,后者是字符输出流。

字节流

InputStream(字节输入流)

InputStream用于从源头(通常是文件)读取数据(字节信息)到内存中,java.io.InputStream抽象类是所有字节输入流的父类。业务场景:将文件里面的内容读到内存中要干事情

public static void main(String[] args) {
    // 读取对应的文件,把output.txt这个文件,通过InputStream输入流读取到内存中,读取文件的输入流FileInputStream
        try (InputStream fis = new FileInputStream("output.txt")) {
            System.out.println("Number of remaining bytes:"
                    + fis.available());
            int content;
            long skip = fis.skip(2);
            System.out.println("The actual number of bytes skipped:" + skip);
            System.out.print("The content read from file:");
            while ((content = fis.read()) != -1) {
                System.out.print((char) content);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

注意
一般我们是不会直接单独使用 FileInputStream ,通常会配合 BufferedInputStream(字节缓冲输入流,后文会讲到)来使用。

字节缓冲流作用指的是:相当于中间加一道缓存,然后在将字节流读到缓存中,当缓存中到一定的量的时候将缓冲中的字节一次倒倒内存中提高效率。
IO 操作是很消耗性能的,缓冲流将数据加载至缓冲区,一次性读取/写入多个字节,从而避免频繁的 IO 操作,提高流的传输效率。减少IO的次数提高效率

 public static void main(String[] args) {
        long s = System.currentTimeMillis();
        try (InputStream fis = new BufferedInputStream(new FileInputStream("output.txt"))) {
//        try (InputStream fis = new FileInputStream("output.txt")) {
            System.out.println("Number of remaining bytes:"
                    + fis.available());
            int content;
            long skip = fis.skip(2);
            System.out.println("The actual number of bytes skipped:" + skip);
            System.out.print("The content read from file:");
            while ((content = fis.read()) != -1) {
                System.out.print((char) content);
            }
            long e = System.currentTimeMillis();
            System.out.println("时间" + (e - s));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

使用字节缓存流的效率比较 解释上面的字节缓冲流的作用

  • 普通文件输入流 3000行文件,322ms
    在这里插入图片描述

  • 使用字符缓存流 178ms 快了3倍左右

OutputStream(字节输出流)

将数据通过内存写到别的地方,比如将文件写到本地。OutputStream是所有输出流的父类

和输出流基本上是一样的,唯一的区别就是,将数据转化为字节,然后调用write写到指定的地方。

  public static void main(String[] args) {
        long s = System.currentTimeMillis();
        try (FileOutputStream output = new FileOutputStream("输出流.txt")) {
            // 和输入流唯一的区别
            byte[] array = ("daf").getBytes();
            output.write(array);
            long e = System.currentTimeMillis();
            System.out.println("时间" + (e - s));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

注意
输出流也是有字节缓冲流的BufferedOutputStream。和上面的输入流是一样的作用这里不多做解释。

字符流

  • 不管是文件读写还是网络发送接收,信息的最小存储单元都是字节。 那为什么 I/O 流操作要分为字节流操作和字符流操作呢?
    • 1.字符流是由 Java 虚拟机将字节转换得到的,这个过程还算是比较耗时。
    • 2.如果我们不知道编码类型就很容易出现乱码问题。

问题:当文件中是中文的时候,我们读到的就是乱码

Reader(字符输入流)

  • 桥接模式
// 字节流转换为字符流的桥梁
public class InputStreamReader extends Reader {
}
// 用于读取字符文件
public class FileReader extends InputStreamReader {
}

// 中文读出来就不是乱码了
try (FileReader fileReader = new FileReader("input.txt");) {
    int content;
    long skip = fileReader.skip(3);
    System.out.println("The actual number of bytes skipped:" + skip);
    System.out.print("The content read from file:");
    while ((content = fileReader.read()) != -1) {
        System.out.print((char) content);
    }
} catch (IOException e) {
    e.printStackTrace();
}

Writer(字符输出流)

  • 同上
try (Writer output = new FileWriter("output.txt")) {
    output.write("你好,我是Guide。");
} catch (IOException e) {
    e.printStackTrace();
}

字符缓冲流

BufferedReader (字符缓冲输入流)和 BufferedWriter(字符缓冲输出流)类似于 BufferedInputStream(字节缓冲输入流)和BufferedOutputStream(字节缓冲输入流),内部都维护了一个字节数组作为缓冲区。不过,前者主要是用来操作字符信息。

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

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

相关文章

环境变量详解

目录 环境变量是什么? 常见环境变量 查看环境变量 指令查看 代码查看 系统调用查看 本地变量 环境变量全局性 环境变量是什么? 我们要执行一个我们所写的c/c程序时,需要./可执行文件,告诉操作系统你在哪里&#xff0c…

PC Cleaner Pro(电脑清理工具)图文安装教程

OneSafe PC Cleaner 会查找并删除垃圾文件和快捷方式,这些文件和快捷方式会随着时间的推移在您的 PC 上堆积,从而占用您的硬盘空间。该软件会搜索并删除已卸载程序留下的无效快捷方式和文件。OneSafe PC Cleaner 还会识别并删除注册表中不必要的条目。 W…

YOLOv8详解代码实战,附有效果图

YOLOv8架构 YOLOv8 是 ultralytics 公司在 2023 年 1月 10 号开源的 YOLOv5 的下一个重大更新版本,目前支持图像分类、物体检测和实例分割任务,鉴于Yolov5的良好表现,Yolov8在还没有开源时就收到了用户的广泛关注。yolov8的整体架构如下&…

vue3计算属性与监视及watchEffect函数

computed计算属性 首先看一下页面的结构 在v3中可以用v2的方式来写计算属性,但是不建议这么写 而想要在v3中使用计算属性,需要先引入它 它不想之前在v2中的函数了,而是要写在computed()里面 当然这个计算属性是简写(没有考虑计算…

Python opencv 先腐蚀后膨胀 消除图像噪声

cv2.getStructuringElement()介绍 在进行图像形态学操作时,首先需要构造一个特定的核,该核可以自定义生成,也可以通过cv2.getStructuringElement()函数构造。 cv2.getStructuringElement(shape, ksize)参数: shape ---- 代表形状…

常见在线AI绘画平台

系列文章目录 Midjourney AI绘画工具使用保姆级教程 本地部署Stable Diffusion教程,亲测可以安装成功 Stable Diffusion界面参数及模型使用 文章目录系列文章目录前言一、Midjourney二、DreamStudio三、Lexica四、STOCKIMG.AI五、Dream by WOMBO六、PicSo七、百…

ArcGIS、ENVI、InVEST、FRAGSTATS等多技术融合提升环境、生态、水文、土地、土壤、农业、大气等领域的数据分析

查看原文>>>ArcGIS、ENVI、InVEST、FRAGSTATS等多技术融合提升环境、生态、水文、土地、土壤、农业、大气等领域的数据分析 目录 专题一、空间数据获取与制图 专题二、ArcGIS专题地图制作 专题三、空间数据采集与处理 专题四、遥感数据处理与应用 专题五、DEM数据…

macOS Big Sur 11.7.6 (20G1231) Boot ISO 原版可引导镜像

本站下载的 macOS 软件包,既可以拖拽到 Applications(应用程序)下直接安装,也可以制作启动 U 盘安装,或者在虚拟机中启动安装。另外也支持在 Windows 和 Linux 中创建可引导介质。 2023 年 4 月 10 日(北京…

压力测试工具JMeter的下载安装与基础使用(一)

JMeter的下载安装与基础使用1.环境准备2.下载与配置2.1下载并解压2.2 配置系统变量 JMETER_HOME2.3配置系统变量 CLASSPATH3.测试JMeter是否配置成功4. 语言修永久修改为中文(可选)1.环境准备 JMeter是用java开发的,示例Apache JMeter5.5版本…

css动画及背景设置

css属性 clip-path 属性使用裁剪方式创建元素的可显示区域。区域内的部分显示,区域外的隐藏。可以指定一些特定形状。 可以创建多边形内容显示区域polygon clip-path: polygon(0 0, 100% 0, 100% 75vh 0 100%); 顺序 1初始x y 为0 0 1向2位置 x轴移动100% y移…

SpringBoot集成elasticsearch使用(增删改查)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 SpringBoot集成elasticsearch使用(增删改查)一、es是什么?二、使用步骤1.搭配环境springboot集成es1、新建springboot项目,引入…

19_I.MX6ULL_SPI实验

目录 SPI简介 I.MX6U ECSPI简介 相关寄存器 ICM-20608简介 实验源码 SPI简介 同I2C一样,SPI是很常用的通信接口,也可以通过SPI来连接众多的传感器。相比I2C接口, SPI接口的通信速度很快, I2C最多400KHz,但是SPI可以到达几十MHz。I.MX6U也有4个SPI接口,可以通过这4个SPI接…

电感为什么会有饱和电流

电感有一个重要的参数那就是饱和电流,饱和电流的定义是当电感感值下降30%时流过电感的电流。 那么电感为什么会有饱和电流呢? 这个是电感磁芯的磁化曲线,横坐标是磁场强度H,纵坐标是磁感应强度B 在磁场强度较小的时候,…

大数据需要学哪些内容

大数据技术是当今互联网时代的热点之一,目前已经成为了各行各业中的最佳选择。随着物联网、人工智能、云计算等技术的发展,数据的规模不断增大,数据分析、数据挖掘、人工智能等应用也随之蓬勃发展,对大数据开发的需求越来越多。因…

智能网卡-提升网络性能的新选择

一、智能网口介绍 智能网卡(Smart NIC)是一种专用于网络数据处理的高性能网卡,采用了定制芯片、高速网络接口和强大的软件支持,可以为数据中心和企业网络提供更快、更安全、更可靠的网络连接和数据传输服务。 智能网卡的出现受到…

教你使用Apache搭建Http

Apache2默认采用的是80端口号,因此直接通过公网ip或域名就能访问。现实中,很多服务器本身就部署了许多其它服务,80端口号往往被占用,因此就需要将Apache2改成其它访问端口。 修改端口,首先需要修改/etc/apache2/ports…

数组排序详解

数组排序详解1、排序算法小结2、排序算法原理及实现2.1 归并排序2.2 快速排序2.3 冒泡排序2.4 插入排序2.5 选择排序2.6 希尔排序:1、排序算法小结 排序算法可以分为两大类: (1)非线性时间排序算法:通过比较来决定元素…

用Python实现批量翻译文档文件

文件名批量翻译需要用到编程语言和相应的翻译 API,下面以 Python 和 Google 翻译 API 为例,介绍具体的实现步骤: 安装必要的 Python 库 使用 Python 代码进行文件名翻译需要先安装两个库:googletrans 和 os。 pip install googl…

全网最全的Cookie, Session, Token鉴权详解,一定让你大饱眼福

目录 前言 一、Cookie鉴权 二、Session鉴权 ​编辑 三、Token鉴权 四、总结 前言 在Web开发中,鉴权是保护用户数据和系统安全的重要手段之一。常见的鉴权方式包括Cookie、Session和Token三种,下面我将详细介绍这三种鉴权方式,并且探讨它…

FMC子卡设计资料:ADRV9002双窄带宽带射频收发器 AD9361双收双发射频 DA子卡 ADRV9009双收双发射频FMC子卡

FMC550-基于ADRV9002双窄带宽带射频收发器FMC子卡 一、产品概述 ADRV9002 是一款高性能、高线性度、高动态范围收发器,旨在针对性能与功耗系统进行优化。该设备是可配置的,非常适合要求苛刻、低功耗、便携式和电池供电的设备。ADRV9002 的工作频率为…