IO流

2023-11-04

过滤器字节流:

  • FilterInputStream:过滤器字节输入流
  • FilterOutputStream:过滤器字节输出流

它们的主要用于封装其他的输入输出流,为它们提供一些额外的功能。

  • 具有以下实现类:
    在这里插入图片描述
    ☛以下以FilterInputStream做主要分析:

FilterInputStream

1. 源码分析

(1)继承关系 该类继承自InputStream父类(表示该类可实现父类中的相关方法)

public class FilterInputStream extends InputStream

(2)成员变量

protected volatile InputStream in;

(3)构造方法

protected FilterInputStream(InputStream in) {
        this.in = in;
    }

由构造方法可以看出,FilterInputStream属于高级流,在实例化时需要传入InputStream对象
(4)基本方法

//每次读取一个字节
public int read() throws IOException;

//批量读取数据到b数组中
public int read(byte b[]) throws IOException;

//从off位置开始,批量读取len长度的数据
public int read(byte b[], int off, int len) throws IOException;

//跳过n个字节
public long skip(long n) throws IOException;

//获取数据流中数据字节个数
public int available() throws IOException ;

//关闭资源
public void close() throws IOException;

//设置标记 在流中设置一个标记后最多只能读取readlimit个字节,否则标记可能失效
public synchronized void mark(int readlimit) ;

//重置
public synchronized void reset() throws IOException;

//判断当前系统是否支持标记
public boolean markSupported();

一、DataInputStream

类似FileInputStream的各种流,只能用来输入/输出字节/字符类型的数据,对于其他类型的数据,无法直接操作,在输出时需要先将其转换为字节或字符类型再输出,输入时按照字节或字符类型读入之后再转换为原来的类型,工作量较大,故引入数据流来输入/输出各种类型的数据。

构造方法:继承FilterInputStream类
public
class DataInputStream extends FilterInputStream implements DataInput {

    public DataInputStream(InputStream in) {
        super(in);
    }
常用方法:
  1. 读取boolean数据类型
public final boolean readBoolean() throws IOException {
        int ch = in.read();
        if (ch < 0)
            throw new EOFException();
        return (ch != 0);
    }
  1. 读取int数据类型:一次性读取出4个字节,再进行处理成一个int
public final int readInt() throws IOException {
        int ch1 = in.read();
        int ch2 = in.read();
        int ch3 = in.read();
        int ch4 = in.read();
        if ((ch1 | ch2 | ch3 | ch4) < 0)
            throw new EOFException();
        return ((ch1 << 24) + (ch2 << 16) + (ch3 << 8) + (ch4 << 0));
    }
  1. 读取String数据类型
public final static String readUTF(DataInput in) throws IOException {
        //从in中读取“无符号short类型”的值
        int utflen = in.readUnsignedShort();
        byte[] bytearr = null;
        char[] chararr = null;
        }
  1. 读取其他类型方法
//读short类型数据
public final short readShort() throws IOException;

//读char类型数据
public final char readChar() throws IOException

//读long类型数据
public final long readLong() throws IOException

//读float类型数据
public final float readFloat() throws IOException

//读double类型数据
public final double readDouble() throws IOException

//读一行数据
public final String readLine() throws IOException

二、DataOutputStream

构造方法:
public
class DataOutputStream extends FilterOutputStream implements DataOutput {
   
    public DataOutputStream(OutputStream out) {
        super(out);
    }
常用方法:
//单个字节写入操作
public synchronized void write(int b) throws IOException;

//byte数组中off位置开始,批量读取len长度个数据,写入存储介质中
public synchronized void write(byte b[], int off, int len) throws IOException;

//写布尔数据类型
public final void writeBoolean(boolean v) throws IOException;

//写byte字节类型数据
public final void writeByte(int v) throws IOException;

//写short类型数据
public final void writeShort(int v) throws IOException;

//写char类型数据
public final void writeChar(int v) throws IOException;

//写int类型数据
public final void writeInt(int v) throws IOException;

//写long类型数据
public final void writeLong(long v) throws IOException;

//写float类型数据
public final void writeFloat(float v) throws IOException;

//写double类型数据
public final void writeDouble(double v) throws IOException;

//写utf类型数据
public final void writeUTF(String str) throws IOException;

注意: 依次读取数据时需要按照写入的类型顺序读取

三、自定义测试Demo使用DataXXXStream

public class DataStreamDemo {
    public static void dataStreamOperation(String path){
        try {
            //写操作
            DataOutputStream out = new DataOutputStream(new FileOutputStream(path));
            //写入int类型的数据
            out.writeInt(123);
            //写入byte类型的数据
            out.writeByte('c');
            //写入double类型数据
            out.writeDouble(12.98);

            //写入字符串数据
            out.writeUTF("helloworld");
            out.writeUTF("oneday");
            
            //写入boolean类型的数据
            out.writeBoolean(false);

            //关闭资源
            out.flush(); //刷新此缓冲的输出流,保证数据全部都能写出
            out.close();

            //读操作
            DataInputStream in = new DataInputStream(new FileInputStream(path));
            
            //读int类型
            int a = in.readInt();
            //读byte类型
            byte b=in.readByte();
            //读double类型
            double v = in.readDouble();
            System.out.println("int:"+a+" byte:"+b+" double:"+v);
            //读字符串类型
            String c = in.readUTF();
            String e = in.readUTF();
            System.out.println("string:1."+c+" 2."+e);
            //读取boolean数据类型
            boolean d= in.readBoolean();
            System.out.println("boolean:"+d);
            //关闭资源
            in.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    //DataInputStream可以直接从数据流中读取int,String等类型的数据
    public static void main(String[] args) {
        String path="C:\\Users\\1\\Desktop\\test2.txt";
        dataStreamOperation(path);
    }
}

运行结果:
在这里插入图片描述

四、DataXXXStream适用场景:

需要读取或写入类型较多,例如:Excle表输入不同类型数据(int、String、boolean等)可以使用Data流

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

IO流 的相关文章

随机推荐

  • [Microsoft][SQLServer 2000 Driver for JDBC]Error establishing socket

    在通过jdbc连接SQL Server经常回出现 Microsoft SQLServer 2000 Driver for JDBC Error establishing socket 原因如下 1 通过url连接的时候指定的服务器名称或者服
  • Python 计算机视觉(十二)—— OpenCV 进行图像分割

    参考的一些文章以及论文我都会给大家分享出来 链接就贴在原文 论文我上传到资源中去 大家可以免费下载学习 如果当天资源区找不到论文 那就等等 可能正在审核 审核完后就可以下载了 大家一起学习 一起进步 加油 目录 前言 1 图像分割 2 读取
  • C++题库

    文章目录 1 求最大值 2 求圆面积 3 编写重载函数来打印字符串 4 设计带构造函数的Dog类 5 定义一个带重载构造函数的日期类 6 C 第三章 指针 动态生成Person类的对象 7 编写一个小小的计算器 能够计算两个浮点数的加 减
  • 使用Myeclipse插件将wsdl生成java客户端代码

    使用环境 MyEclipse9 0 本教程使用Myeclipse内置插件生成java代码 网上说这是xfire插件 不管怎样 生成和调用客户端代码都十分简单 1 在项目上右键 选择New gt Other gt Web Service gt
  • Mysql常用命令行

    Mysql常用命令行 第一招 mysql服务的启动和停止 net stop mysql net start mysql 第二招 登陆mysql 语法如下 mysql u用户名 p用户密码 键入命令mysql uroot p 回车后提示你输入
  • 如何用python调用webservice接口

    最近项目需要去调用其他平台接口 接口类型为webservice接口 跟经常用的http请求还不一样 然后就找到python的suds三方包 以下为根据号码查询归属地接口进行测试和举例 安装suds三方包 命令行 pip3 install s
  • VSCode 的 Local History插件使用

    VSCode 的 Local History 插件使用 在使用vscode编写代码的时候 往往需要查看历史的修改记录 这时可以安装 Local History 插件 安装成功之后 关闭 vscode 然后重新启动就可使用 在左下角可以看到
  • linux 查找安装包路径,查看yum安装软件包的路径

    Linux系统下查找安装包所在目录的方法 linux中查看软件文件安装路径 Linux查看软件安装路径 linux查找安装包路径 rpm查找安装包路径 rpm rpm qa grep php fpm rpm ql php73 php fpm
  • python的struct模块

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 了解c语言的人 一定会知道struct结构体在c语言中的作用 它定义了一种结构 里面包含不同类型的数据 int char bool等等 方便对某一结构对象进行处理 而在网络
  • oshi - 服务器及应用监控库 - 简介与使用

    by Claudia 文章目录 简介 特性 相关资料 运行 具体使用 源码分析 SetCpuInfo SetMemInfo SetSysInfo SetJvmInfo SetSysFiles Why oshi 竞品分析 总结 简介 oshi
  • el-form表单中不同数据类型对应的时间格式化和校验规则

    1 在表单中 当选择不同的数据类型时 需要在下面选择时间时和数据类型对应上 通过监听数据类型的变化 给时间做格式化 2 但是当不按顺序选择数据类型后 再选时间可能会报错 所以需要在dom更新后 再清空表单 3 校验规则 结束时间需要大于开始
  • 2022-12-30 工作记录--React/JS-关闭一个弹窗后,根据需求判断是否继续弹出该弹窗

    React JS 关闭一个弹窗后 根据需求判断是否继续弹出该弹窗 一 实现效果 假如用户在 任务弹窗 同时完成了三个非签到任务 想要实现 当用户返回 首页 时 依次弹出对应完成的任务的 完成任务弹窗 如下图 二 实现代码 后端返的数据 接口
  • 模型集成(Model Ensemble)

    模型集成 Model Ensemble 模型集成是融合多个训练好的模型 基于某种方式实现测试数据的多模型融合 这样来使最终的结果能够 取长补短 融合各个模型的学习能力 提高最终模型的泛化能力 近年来 model ensemble已成刷榜神器
  • 计算机组成原理笔记01

    做题笔记1 学习内容 教材的思维导图 课后练习 计算部分 中国大学MOOC计算机组成原理 计算部分 1 教材的思维导图 2 课后练习P17 7 某计算机主频为1 2GHz 其指令分为4类 它们在基准程序中所占比例及CPI如表1 7所示 指令
  • Rancher应用商店的questions.yml接收数组参数

    背景 制作FlinkCluster的Chart包 要求应用商店界面输入接受数组参数 questions yml 是不支持这种形式的 解决方案 questions yml中的参数最终是以 set name value 的形式拼接到命令中的 h
  • m3u8 videojs 倍速播放属性

    var myVideo videojs myVideo bigPlayButton true textTrackDisplay false posterImage false errorDisplay false playbackRates
  • Elasticsearch-拼音分词/排序

    1 拼音分词器安装 1 1下载拼音分词插件 要和安装的es版本保持一致 我的版本是6 6 0 下载地址 https github com medcl elasticsearch analysis pinyin tree v6 4 0 1 2
  • C++学习难点1

    数据类型与表达式 1 运算符 1 1 自增自减运算符 int i 0 j j i 后置 i的值自增变为1 表达式i 的值为i自增之前的值 即j得值为0 j i 前置 i的值自增变为1 表达式i 的值为i自增之后的值 即j得值为1 注意 自增
  • UnityShader 模型空间转剪裁空间

    模型空间转剪裁空间 1 引入UnityCG cginc库 include Lighting cginc 2 使用UnityObjectToClipPos 方法 v2f vert a2v v v2f f f svPos UnityObject
  • IO流

    过滤器字节流 FilterInputStream 过滤器字节输入流 FilterOutputStream 过滤器字节输出流 它们的主要用于封装其他的输入输出流 为它们提供一些额外的功能 具有以下实现类 以下以FilterInputStrea