JIO学习(一)输入流综述

2023-10-26

一、字节输入流         java.io.InputStream

java.lang.Object
  java.io.InputStream

所有已实现的接口:  Closeable

直接已知子类:

AudioInputStream, ByteArrayInputStream, FileInputStream, FilterInputStream, InputStream, ObjectInputStream, PipedInputStream, SequenceInputStream, StringBufferInputStream


此抽象类是表示字节输入流的所有类的超类。需要定义 InputStream 子类的应用程序必须总是提供返回下一个输入字节的方法。

从以下版本开始:JDK1.0

 

(1)字节缓存输入流:    ByteArrayInputStream

ByteArrayInputStream 包含一个内部缓冲区,该缓冲区包含从流中读取的字节。内部计数器跟踪 read 方法要提供的下一个字节。关闭 ByteArrayInputStream 无效。此类中的方法在关闭此流后仍可被调用,而不会产生任何 IOException。

(2)文件输入流  FileInputStream

FileInputStream 从文件系统中的某个文件中获得输入字节。哪些文件可用取决于主机环境。FileInputStream 用于读取诸如图像数据之类的原始字节流。要读取字符流,请考虑使用 FileReader(博主注:此输入流是以字节的形式读取文件,对于音频、图片文件影响不大,对于字符文件可能存在编码问题,TXT纯文本这些建议用字符流输入流)

 private static void read01(){
        FileInputStream fis=null;
        try {
            fis=new FileInputStream("demo.txt");
            byte[] bytes=new byte[1024];        //每次读取1024 字节
                 //    byte[] bytes=new byte[fis.available()];
            int len=0;                          //结尾标识
            while ((len=fis.read(bytes))!=-1){      //循环读取,知道文件末尾
                System.out.println(new String(bytes,0,len));//这里把字节转成string输出了
            }
        } catch (Exception e) {
            e.printStackTrace();
        }finally {//关闭流
            try {
                if (fis!=null) fis.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

 

(3)FilterInputStream (注:个人理解这个类是一个适配器类,是为了拓展所用的,可以了解下装饰模式)

FilterInputStream 包含其他一些输入流,它将这些流用作其基本数据源,它可以直接传输数据或提供一些额外的功能。FilterInputStream 类本身只是简单地重写那些将所有请求传递给所包含输入流的 InputStream 的所有方法FilterInputStream 的子类可进一步重写这些方法中的一些方法,并且还可以提供一些额外的方法和字段。

它的子类有这么多:

BufferedInputStream, CheckedInputStream, CipherInputStream, DataInputStream, DeflaterInputStream, DigestInputStream, InflaterInputStream, LineNumberInputStream, ProgressMonitorInputStream, PushbackInputStream

比较常用的,缓冲流:BufferedInputStream在使用FileInputStream的时候,可以用它做缓存,提高读取效率。

BufferedInputStream 为另一个输入流添加一些功能,即缓冲输入以及支持 markreset 方法的能力。在创建 BufferedInputStream 时,会创建一个内部缓冲区数组。在读取或跳过流中的字节时,可根据需要从包含的输入流再次填充该内部缓冲区,一次填充多个字节。mark 操作记录输入流中的某个点,reset 操作使得在从包含的输入流中获取新字节之前,再次读取自最后一次 mark 操作后读取的所有字节。

private static void test01(){
        BufferedInputStream fis=null;
        BufferedOutputStream fos=null;
        try {
            //读取流  源
            fis=new BufferedInputStream(new FileInputStream("d:/test/timo.jpg"));
            //输出流
            fos=new BufferedOutputStream(new FileOutputStream("d:/test/copyimg.jpg"));
            int len=-1;
            while ((len=fis.read())!=-1){
                fos.write(len);
                System.out.println("len:"+len);
            }
        } catch ( Exception e) {
            e.printStackTrace();
        }finally {
            try {
                if (fis!=null) fis.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                if (fos!=null) fos.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

 运行前后:

(4)对象输入流     ObjectInputStream

ObjectInputStream 对以前使用 ObjectOutputStream 写入的基本数据和对象进行反序列化。只有支持 java.io.Serializable 或 java.io.Externalizable 接口的对象才能从流读取。

 

(5)管道输入流   PipedInputStream

管道输入流应该连接到管道输出流;管道输入流提供要写入管道输出流的所有数据字节。通常,数据由某个线程从 PipedInputStream 对象读取,并由其他线程将其写入到相应的 PipedOutputStream不建议对这两个对象尝试使用单个线程,因为这样可能死锁线程。管道输入流包含一个缓冲区,可在缓冲区限定的范围内将读操作和写操作分离开。 如果向连接管道输出流提供数据字节的线程不再存在,则认为该管道已损坏

 

(6)合并流   SequenceInputStream

SequenceInputStream 表示其他输入流的逻辑串联。它从输入流的有序集合开始,并从第一个输入流开始读取,直到到达文件末尾,接着从第二个输入流读取,依次类推,直到到达包含的最后一个输入流的文件末尾为止。(博主注:多线程下载,碎片文件合并,有用过迅雷的朋友应该知道。可以用在大文件的 切割->传输->合并,这一类的业务 )

 

(7)StringBufferInputStream

此类允许应用程序创建输入流,在该流中读取的字节由字符串内容提供。应用程序还可以使用 ByteArrayInputStream 从 byte 数组中读取字节。只有字符串中每个字符的低八位可以由此类使用。

 

二、字符输入流         Java.io.Reader

java.lang.Object
  java.io.Reader

所有已实现的接口:Closeable, Readable

直接已知子类:BufferedReader, CharArrayReader, FilterReader, InputStreamReader, PipedReader, StringReader

用于读取字符流的抽象类。子类必须实现的方法只有 read(char[], int, int) 和 close()。但是,多数子类将重写此处定义的一些方法,以提供更高的效率和/或其他功能。

 

(1)缓冲的字符输入流      BufferedReader

从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。可以指定缓冲区的大小,或者可使用默认的大小。大多数情况下,默认值就足够大了。通常,Reader 所作的每个读取请求都会导致对底层字符或字节流进行相应的读取请求。因此,建议用 BufferedReader 包装所有其 read() 操作可能开销很高的 Reader(如 FileReader 和 InputStreamReader)。

(2)CharArrayReader        此类实现一个可用作字符输入流的字符缓冲区。

(3)java.io.FilterReader

直接已知子类:PushbackReader

用于读取已过滤的字符流的抽象类。抽象类 FilterReader 自身提供了一些将所有请求传递给所包含的流的默认方法。FilterReader 的子类应重写这些方法中的一些方法,并且还可以提供一些额外的方法和字段。

 (4)InputStreamReader

InputStreamReader 是字节流通向字符流的桥梁:它使用指定的 charset 读取字节并将其解码为字符。它使用的字符集可以由名称指定或显式给定,或者可以接受平台默认的字符集。

每次调用 InputStreamReader 中的一个 read() 方法都会导致从底层输入流读取一个或多个字节。要启用从字节到字符的有效转换,可以提前从底层流读取更多的字节,使其超过满足当前读取操作所需的字节。为了达到最高效率,可要考虑在 BufferedReader 内包装 InputStreamReader。

例如:       BufferedReader in = new BufferedReader(new InputStreamReader(System.in));

(5)管道 java.io.PipedReader 传送的字符输入流。

(6)java.io.StringReader              其源为一个字符串的字符流。

 

 

io包下的输入流和输出流都是成对出现的,而字节流和字符流也是有相同功能得对,所以类比这学起来比较容易。主要是区分这些流的使用场景不太好掌握,这也是io流类的难点,其实如果把每个流的功能记住了,多写写练习,就能分清了。以上部分,红色标注的类,比较重要。

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

JIO学习(一)输入流综述 的相关文章

随机推荐

  • esh的snapshot快照备份

    1 Elasticsearch的snapshot快照备份 优点 通过snapshot拍摄快照 然后定义快照备份策略 能够实现快照自动化存储 可以定义各种策略来满足自己不同的备份 缺点 还原不够灵活 拍摄快照进行备份很快 但是还原的时候没办法
  • 乐蜂网服务器信息,乐蜂网目标独立上市 唯品会向其派驻CEO、CFO

    腾讯科技讯 王可心 2月25日消息 在乐蜂网 今日 唯品会副总裁冯佳路 乐蜂网副总裁辛益华接受媒体采访 解答外界疑问 控股乐蜂网后 为何又参股东方风行集团 在过去10天 唯品会与乐蜂网 东方风行集团分别发生交易 2月14日 唯品会宣布战略投
  • 爬虫的工作原理、挑战和应用

    什么是网络爬虫 网络爬虫 Web Crawler 是一种自动化程序 它能够在互联网上浏览网页 收集信息并将其存储在本地或其他地方供进一步处理和分析 爬虫通常用于搜索引擎 数据挖掘 内容聚合 价格比较等应用中 爬虫的工作原理 发送请求 爬虫从
  • Node.js 全网最详细教程(第三章:Node.js 文件系统模块)

    fs 文件系统模块 fs 模块是Node js 官方提供的 用来操作文件的模块 它提供了一系列的方法和属性 用来满足用户对文件的操作需求 一 fs readFile 异步读取文件 源码解析 参数1 path 读取的路径 参数2 option
  • ProGuard 进阶系列(二)配置解析

    书接上文 从开源库中把代码下载到本地后 就可以在 IDE 中进行运行了 从 main 方法入手 可以看到 ProGuard 执行的第一步就是去解析参数 本文的内容主要分析源码中我们配置的规则解析的实现 在上一篇文章末尾 在 IDE 中 添加
  • WARNING: Retrying (Retry(total=0, connect=None, read=None, redirect=None, status=None)) after connec

    WARNING Retrying Retry total 0 connect None read None redirect None status None after connection broken by SSLError SSLE
  • C语言函数不定参数实现方式

    函数如何实现不定参数 由于在C语言中没有函数重载 解决不定数目函数参数问题变得比较麻烦 即使采用C 如果参数个数不能确定 也很难采用函数重载 对这种情况 提出了指针参数来解决问题 1 va list 定义了一个指针arg ptr 用于指示可
  • 数据库设计规范(详细)

    数据规范化设计 一 数据规范化 仅有好的RDBMS并不足以避免数据冗余 必须在数据库的设计中创建好的表结构 Dr E F codd 最初定义了规范化的三个级别 范式是具有最小冗余的表结构 这些范式是 1 第一范式 1st NF First
  • linux配置浮动IP

    在高可用集群环境中 一般都需要使用浮动IP来实现web高可用 High Availability 浮动IP的概念以及为什么需要浮动IP请参考 浮动IP FLOAT IP 本篇文章主要讲实际操作步骤 可以是双机 也可以是多机 主服务器为172
  • VLOOKUP函数匹配结果不正确?错误结果是怎么得出来的?[已解决]

    匹配结果不正确主要是以下2个方面入手 是否是精确匹配 range lookup 参数为 FALSE或0 检查所有的数据是否带空格等 官方帮助文档 Microsoft Excel 中 VLOOKUP 函数的语法和用法 语法 VLOOKUP l
  • [yotroy.cool]WSL安装CUDA独显 PyTorch 深度学习环境配置,测速为什么要用WSL?

    个人博客https www yotroy cool 欢迎关注我哦 前言 为了预习大三课程 想提前学习下PyTorch 于是我遇到了神仙学习教程 动手学深度学习 同时以此为参考完成了环境配置 感谢大佬们无私奉献Thanks 本教程展示了独显w
  • 等精度测频的原理和基于FPGA的实现

    我们通过FPGA测量信号频率 一般来说有两种方案 传统测频法和等精度测频法 方案一 传统测频是在一段闸门时间内直接对输入信号的周期进行计数 也被叫做直接测频法 设闸门信号为gate 检测待测信号上升沿 然后判断gate是否为高电平 若为高电
  • 转置矩阵,逆矩阵和倒转置矩阵

    单位矩阵 转置矩阵 transpose matrix 在线性代数中 矩阵A的转置是另一个矩阵AT 也写做Atr tA或A 由下列等价动作建立 把A的横行写为AT的纵列 把A的纵列写为AT的横行 形式上说 m n矩阵A的转置是n m矩阵 fo
  • 【ctfshow】PHP特性2

    目录 web100 web101 web102 web103 web104 web105 web106 web107 web108 web109 web110 web100 include ctfshow php flag in class
  • ascii码图片

    铁臂阿童木 be be Nc R o uQ bo Jod e dd e d
  • lora模块学习一

    LoRa TM 调制解调器采用扩频调制和前向纠错技术 与传统的FSK或OOK调制技术相比 这种技术不仅扩大了无线通讯链路的覆盖范围 而且还提高了链路的鲁棒性 在设计中 可以通过调整扩频因子 SF 调制带宽 BW 和编码率 CR 三个关键设计
  • cuda-gdb 调试方法:cuda gdb中的可调参数

    cuda gdb 中存在一些可调的参数 可以通过 set cuda lt tunable name gt
  • php实现ETH原生签名交易sendRowTransaction

    文章目录 1 安装GMP 之前需要先安装m4 不然会出错 2 然后ubuntu安装gmp 3 然后安装PHP gmp扩展 4 安装scrypt 扩展 4 撤销sudoers文件写权限 命令 参考文章链接 1 安装GMP 之前需要先安装m4
  • window.location.href跳转带有token的新链接时显示空白页

    问题 从A平台跳到B平台并自动登录B平台 后端生成包含token的完整链接传给前端 前端window location href打开时页面显示空白页 手动刷新才会跳到新链接 原因 用window location href跳转新链接可能会带
  • JIO学习(一)输入流综述

    一 字节输入流 java io InputStream java lang Object java io InputStream 所有已实现的接口 Closeable 直接已知子类 AudioInputStream ByteArrayInp