[五] JavaIO之InputStream OutputStream简介 方法列表说明
基本含义
| InputStream | 所有字节输入流的 超类 他是一个抽象类 |
| OutputStream | 所有字节输出流的 超类 他是一个抽象类 |
方法列表

方法对照
|
read()
read(byte[])
read(byte[], int, int)
|
write(byte[])
write(byte[], int, int)
write(int)
|
| close | close |
| flush() | |
|
available()
mark(int)
markSupported()
reset()
skip(long)
|
方法详解
| read() 从输入流中读取数据的下一个字节。返回 0 到 255 范围内的 int 字节值 如果因为已经到达流末尾而没有可用的字节,则返回值 -1 |
| 方法将会一直阻塞,直到数据可用,检测到流的末尾或者抛出异常 |
| 无参数的read() 是抽象方法,由实现类提供实现
三个read方法实际上根本方法都是read()方法
其他两个方法为拓展功能,逻辑便捷方法
|
| 无参数的read()返回的数据为读取到的字节值 而有参数的则是读取到字节数组中,所以返回值为读取到的个数 |
| read方法关键点 要么就是直接返回读取的字节 要么就是将读取到的字节放入字节数组中,字节数组是你传递进去的 |
|
|
write(int b)
将指定的字节写入此输出流 |
|
write(byte[] b)
将 b.length 个字节从指定的 byte 数组写入此输出流
write(b) 的常规协定是:应该与调用 write(b, 0, b.length) 的效果完全相同
|
|
write(byte[] b,int off,int len)
将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此输出流
write(b, off, len) 的常规协定是:将数组 b 中的某些字节按顺序写入输出流;
元素 b[off] 是此操作写入的第一个字节,b[off+len-1] 是此操作写入的最后一个字节
|
| 类似read的调用形式 直接写入指定字节的write(int b) 方法是根本 其他的是拓展功能 |
|
| read() 与write(int b) 是根本的读取一个字节或者写入一个字节的方法 其余形式是针对传入字节数组作为参数,以及指定字节数组的偏移量时的一些拓展功能 一旦传递了字节数组作为参数 read将会读取数据到字节数组 write将会将字节数组的数据写入 |
| 都需要关闭流,所以都有close方法 都是关闭流并释放与此流有关的系统资源 都可能抛出IOException |
| 在InputStream和OutputStream中,两个close方法都是空方法 |
| flush的含义为刷新,在写入数据时使用 所以,只有输出流拥有flush方法 |
| 之所以需要刷新,是因为有的输出流的写方法实现,可能已经缓冲了以前写入的任何字节 那么,这个方法用于提供能够立即将数据写入到磁盘的功能 不过,只是立即请求操作系统进行处理,而不保证这些字节实际已经写入到物理设备,比如磁盘 |
|
public int available() throws IOException
返回此输入流下一个方法调用可以不受阻塞地从此输入流读取(或跳过)的估计字节数
这句话有些绕口,直白的说就是:
在方法调用前,可以获取到这个流中可用的字节数目
假设说有N个字节可以使用,显然你应该很可能读取到N个字节,或者能够跳过N个字节
一次读取或跳过此估计数个字节不会受阻塞
|
| 注意: 这个数目是一个预估的数量 实际的读取或者跳过的字节数可能小于这个数 |
| InputStream中的这个方法总是返回0 所以这个方法能否使用依赖于子类的实现
|
|
public long skip(long n) throws IOException
|
| 返回的是实际跳过的字节数 在内部创建一个 byte 数组,然后重复将字节读入其中,直到读够 n 个字节或已到达流末尾为止 |
|
|
reset()
mark(int)
markSupported()
三个方法是对于同一个功能点的不同方法 ,可以解决重复读的问题
|
| mark(int)用来在此输入流中做标记,标记当前位置 打一个书签 markSupported() 测试此输入流是否支持 mark 和 reset 方法 reset() 将此流重新定位到最后一次对此输入流调用 mark 方法时的位置 回到书签 |
|
看下类中的默认代码可以发现:
默认情况下mark什么都不做
markSupported直接返回false
reset方法的调用会抛出异常
|
![]() |
| mark的参数用于告知输入流在标记位置失效之前允许读取的字节数 |
| 标记已关闭的流对其无效 |
| 说起来很迷惑,用起来却很简单 比如 xxxStream.mark(50);//表明系统至少应该缓冲50以上个数据,以保证可以回来重新读取 xxxStream.read(); ..... xxxStream.read(); xxxStream.reset();//reset之后,读取到的数据将会和刚才调用mark 方法后read的数据是相同的 xxxStream.read();
.....
xxxStream.read();
|
| 如果方法 markSupported 返回 true,那么输入流总是在调用 mark 之后记录所有读取的字节 并时刻准备在调用方法 reset 时(无论何时),再次提供这些相同的字节 但是,如果在调用 reset 之前可以从流中读取多于 readlimit 的字节,则不需要该流记录任何数据 |
[五] JavaIO之InputStream OutputStream简介 方法列表说明的更多相关文章
- 字节流InputStream/OutputStream
字节流InputStream/OutputStream 本篇将对JAVA I/O流中的字节流InputStream/OutputStream做个简单的概括: 总得来说,每个字节流类都有一个对应的用途, ...
- IO 流(InputStream,OutputStream)
1. InputStream,OutputStream都是抽象类,所以不能创建对象. 1个中文占两个字节 package com.ic.demo01; import java.io.File; imp ...
- java十五个常用类学习及方法举例
<code class="language-java">import java.util.Scanner; import java.util.Properties; i ...
- 转帖:用五分钟重温委托,匿名方法,Lambda,泛型委托,表达式树
用五分钟重温委托,匿名方法,Lambda,泛型委托,表达式树 这些对老一代的程序员都是老生常谈的东西,没什么新意,对新生代的程序员却充满着魅力.曾经新生代,好多都经过漫长的学习,理解,实践才能掌握委托 ...
- Connection 对象简介 方法解读 JDBC简介(四)
通过驱动管理器DriverManager的getConnection方法,可以创建到指定URL的连接 Connection conn = DriverManager.getConnection ...
- C#获取当前堆栈的各调用方法列表
在使用.NET编写的代码在debug时很容易进行排查和定位问题,一旦项目上线并出现问题的话那么只能依靠系统日志来进行问题排查和定位,但当项目复杂时,即各种方法间相互调用将导致要获取具体的出错方法或调用 ...
- Tree通用的系列方法列表-treepanel
在项目中经常会用到Tree来显示数据进行操作.今天整理出来一系列操作Tree的方法.可供项目中方便调用.不用重复写代码,快速应用,通用性很强. Tree系列方法列表如下:主要针对的是ext.net中的 ...
- “全栈2019”Java多线程第五章:线程睡眠sleep()方法详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
- Runtime获取类的属性列表和方法列表
Runtime获取类的属性列表和方法列表 Runtime很强大,他使得OC中没有真正意义上的私有属性和私有方法,我们可以利用OC的运行时拿到一个类的任何方法和任何属性,然后动态的去调用方法,objc_ ...
随机推荐
- 登录RabbitMQ的方法
一:(运行RabbitMQ之前需要先打开docker 容器)打开相应的路径,在windows Powershell 管理员下打开 输入:docker-compose -f .\docker-compo ...
- 程序执行流程/布尔类型与布尔:运算猜数字游戏;库的使用:turtle
myPrice = 6 while True: guess = int(input()) if guess > myPrice: print('>') elif guess < my ...
- Java_流程控制
介绍: java的流程控制结构有三种:顺序.选择.循环 顺序结构,就是从头到尾依次执行每条语句的操作. 选择结构,也称条件控制,是指根据表达式的值有选择的执行. 循环结构,也称回 ...
- 微信报错 config:fail.Error:invalid signature
config:fail.Error:invalid signature 微信公众号报这个错,appid等各项都配置好,经过一番折腾,发现原来ip白明单设置了不是该服务器的ID,重新设置后就可以了
- 使用 python 实现π的计算
1.π的神奇 π是一个无数人追随的真正的神奇数字.我不是很清楚一个永远重复的无理数的迷人之处.在我看来,我乐于计算π,也就是计算π的值.因为π是一个无理数,它是无限的.这就意味着任何对π的计算都仅仅是 ...
- 解决idea中 mvn项目导了包找不到包的问题
----------------------------------------分割线--------------------------------------------------------- ...
- Ubuntu 16.04下安装搜狗输入法
在确保更新了国内镜像源的前提下: 安装sogou输入法步骤 一.安装fcitx键盘输入法系统(系统已安装的可忽略此步骤) 1.添加以下源 sudo add-apt-repository ppa:fci ...
- C# 开源组件--NPOI读取Excel单元格中的公式值
今天在项目中碰到了EXCEL导入的数据是用公式生成,直接导入不了数据,写在博客中方便自已查询也可以给想找这方面的参考一下: 用NPOI导入时,在OFFICE 2007中的文件导入时一般会用XSSF,所 ...
- TCP协议学习总结(上)
在计算机领域,数据的本质无非0和1,创造0和1的固然伟大,但真正百花齐放的还是基于0和1之上的各种层次之间的组合(数据结构)所带给我们人类各种各样的可能性.例如TCP协议,我们的生活无不无时无刻的站在 ...
- java并发面试
1.在java中守护线程和本地线程区别? java中的线程分为两种:守护线程(Daemon)和用户线程(User). 任何线程都可以设置为守护线程和用户线程,通过方法Thread.setDaemon( ...
