一、简介

  InputStream 和 OutputStream 对于字节流的输入和输出是作为协议的存在
  所以有必要了解下这两个类提供出来的基本约定,这两个类是抽象类,而且基本上没什么实现,都是依赖于子类具体的去实现,但是他是对于其子类 协议纲领一般的存在。

二、InputStream

  所有字节输入流的 超类 他是一个抽象类。定义很多抽象方法,比较简单。源码如下

public abstract class InputStream implements Closeable {

    //用于确定跳跃时使用的最大缓冲区大小。
private static final int MAX_SKIP_BUFFER_SIZE = 2048; //从输入流中读取下一个数据字节。返回的数据为读取到的字节值。也就是直接返回字节值。而下面两个方法是将读取到的字节值放入数组中
public abstract int read() throws IOException; //从输入流中读取若干字节并将其存储到缓冲区数组b中。返回值为读取到的个数
public int read(byte b[]) throws IOException {
return read(b, 0, b.length);
} //从输入流中读取从off到len长度的数据到字节数组中。返回值为读取到的个数
public int read(byte b[], int off, int len) throws IOException {
if (b == null) { //不可为空
throw new NullPointerException();
} else if (off < 0 || len < 0 || len > b.length - off) { //参数合法
throw new IndexOutOfBoundsException();
} else if (len == 0) {
return 0;
} int c = read();
if (c == -1) {
return -1;
}
b[off] = (byte)c; int i = 1;
try {
for (; i < len ; i++) { //循环读取
c = read();
if (c == -1) {
break;
}
b[off + i] = (byte)c; //将读取的内容放入数组中
}
} catch (IOException ee) {
}
return i;
} //跳过此输入流并丢弃n个字节的数据
public long skip(long n) throws IOException { long remaining = n;
int nr; if (n <= 0) {
return 0;
} int size = (int)Math.min(MAX_SKIP_BUFFER_SIZE, remaining); //获取缓存大小,取最小值
byte[] skipBuffer = new byte[size];//缓存数组
while (remaining > 0) {
nr = read(skipBuffer, 0, (int)Math.min(size, remaining)); //将跳过的数据,缓存到skipBuffer数组中
if (nr < 0) {
break;
}
remaining -= nr;
} return n - remaining;
} //返回可读取输入流的数据数量(估计值)
public int available() throws IOException {
return 0;
} //关闭此输入流并释放与此流关联的任何系统资源
public void close() throws IOException {} //标记此输入流中的当前位置。对reset方法的后续调用会将此流重新定位到最后标记的位置,以便后续读取重新读取相同的字节。
public synchronized void mark(int readlimit) {} //将此流重新定位到该输入流上一次调用标记方法时的位置。
public synchronized void reset() throws IOException {
throw new IOException("mark/reset not supported");
} //测试这个输入流是否支持标记和重置方法。是否支持标记和重置是特定输入流实例的不变属性。
public boolean markSupported() {
return false;
}

三、OutStream

  所有字节输出流的 超类 他是一个抽象类。源码如下:

//这个抽象类是表示字节输出流的所有类的超类。输出流接受输出字节并将它们发送到某个接收器。
public abstract class OutputStream implements Closeable, Flushable {
//将指定的字节写入此输出流
public abstract void write(int b) throws IOException; //从指定的 byte 数组写入此输出流
public void write(byte b[]) throws IOException {
write(b, 0, b.length);
} //将指定字节数组中从偏移位置off开始到len的bytes写到这个输出流。
public void write(byte b[], int off, int len) throws IOException {
if (b == null) { //不能为空
throw new NullPointerException();
} else if ((off < 0) || (off > b.length) || (len < 0) ||
((off + len) > b.length) || ((off + len) < 0)) { //参数合法
throw new IndexOutOfBoundsException();
} else if (len == 0) {
return;
}
for (int i = 0 ; i < len ; i++) {
write(b[off + i]);
}
} //刷新此输出流并强制写出任何已缓冲的输出字节
public void flush() throws IOException {
} //关闭此输出流并释放与此流关联的任何系统资源
public void close() throws IOException {
} }

四、总结

  * read()  与write(int b) 是根本的读取一个字节或者写入一个字节的方法;
  * 其余形式是针对传入字节数组作为参数,以及指定字节数组的偏移量时的一些拓展功能;
  * 一旦传递了字节数组作为参数:1. read将会读取数据到字节数组;2. write将会将字节数组的数据写入

javaIO -- InputStream和OutStream的更多相关文章

  1. bufferedimage 转换成 inputstream并保存文件

    BufferedImage img = removeBackgroud(file);//去除重影 //bufferedimage 转换成 inputstream ByteArrayOutputStre ...

  2. JavaIO -- Reader 和 Writer

    一.简介 设计Reader和Writer继承层次结构主要是为了国际化.InputStream和OutStream流继承层次结构仅支持8位字节流,并不能很好的处理16位的Unicode字符.由于Unic ...

  3. Java读取Level-1行情dbf文件极致优化(2)

    最近架构一个项目,实现行情的接入和分发,需要达到极致的低时延特性,这对于证券系统是非常重要的.接入的行情源是可以配置,既可以是Level-1,也可以是Level-2或其他第三方的源.虽然Level-1 ...

  4. java中IO流相关知识点

    (一) 下边使用outputStream字节输出流进行写操作 package zdbIO;import java.io.File;import java.io.FileNotFoundExceptio ...

  5. Java基础知识学习(八)

    IO操作 5个重要的类分别是:InputStream.OutStream.Reader.Writer和File类 面向字符的输入输出流 输入流都是Reader的子类, CharArrayReader ...

  6. Java验证码识别解决方案

    建库,去重,切割,识别. package edu.fzu.ir.test; import java.awt.Color; import java.awt.image.BufferedImage; im ...

  7. 20145206邹京儒《Java程序设计》第6周学习总结

    20145206 <Java程序设计>第6周学习总结 教材学习内容总结 第十章 输入/输出 Java将输入/输出抽象化为串流,数据有来源及目的地,衔接两者的是串流对象. 从应用程序角度来看 ...

  8. [转] Spring MVC sample application for downloading files

    http://www.codejava.net/frameworks/spring/spring-mvc-sample-application-for-downloading-files n this ...

  9. 20145304 Java第六周学习报告

    20145304<Java程序设计>第六周学习总结 教材学习内容总结 1.InputStream与OutputStream: 在Java中,输入串流的代表对象为java.io.InputS ...

随机推荐

  1. dashucoding记录2019.6.8

    WordPress网站 网址: https://cn.wordpress.org/ 阿里云市场 https://market.aliyun.com/products/53616009?spm=a2c4 ...

  2. python3 调用 beautifulSoup 进行简单的网页处理

    python3 调用 beautifulSoup 进行简单的网页处理 from bs4 import BeautifulSoup file = open('index.html','r',encodi ...

  3. Java学习日记——基础篇(二)基本语法

    变量 变量和常量是程序处理的两种基本数据对象,变量是程序的基本组成单位 变量的目的就是确定目标并提供存放空间 public class Hello { public static void main( ...

  4. avalon.js中使用owl-carousel轮播图

      <?php if($banners){?> <div class="ms-controller" ms-controller="bannerShow ...

  5. 使用spring profile实现多环境切换

    第一步: applicationContext.xml <!--环境配置开始--> <beans profile="production"> <con ...

  6. 知乎千万级高性能长连接网关 https://zhuanlan.zhihu.com/p/66807833

    知乎千万级高性能长连接网关揭秘 9 天前 · 来自专栏 知乎技术专栏 实时的响应总是让人兴奋的,就如你在微信里看到对方正在输入,如你在王者峡谷里一呼百应,如你们在直播弹幕里不约而同的 666,它们的背 ...

  7. Mercury:唯品会全链路应用监控系统解决方案详解(含PPT)

    Mercury:唯品会全链路应用监控系统解决方案详解(含PPT) 原创: 姚捷 高可用架构 2016-08-08    

  8. 论文翻译 DOTA:A Large-scale Dataset for Object Detection in Aerial Images

      简介:武大遥感国重实验室-夏桂松和华科电信学院-白翔等合作做的一个航拍图像数据集 摘要: 目标检测是计算机视觉领域一个重要且有挑战性的问题.虽然过去的十几年中目标检测在自然场景已经有了较重要的成就 ...

  9. 运维之利器--Ansible

    一.简介 Ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet.cfengine.chef.func.fabric)的优点,实现了批量系统配置.批量程序部署. ...

  10. 创建IDOC

    第一步:WE31 创建IDOC所包含的字段. 第二步:WE30 创建IDOC 把Segment分配给IDOC 第三步:WE81 创建信息类型 第四步:WE82 把IDOC类型与信息类型对应. 第五步: ...