一、简介

  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. git submodule subtree常用指令

    submodule 官方文档 添加 git submodule add -b master git@git.xxx:xxx/xxx.git src/xxx 删除 git submodule deini ...

  2. mysql的存储引擎与锁

    一.背景知识 1.锁是计算机协调多个进程或线程并发访问某一资源的机制. A.锁分类. | 共享锁(读锁):在锁定期间,多个用户可以读取同一个资源,读取过程中数据不会发生变化. | 排他锁(写锁):在锁 ...

  3. centos7 安装 mysql5.6(MySQL-5.6.44-1.el7.x86_64.rpm-bundle.tar)

    1.卸载MariaDB rpm -qa | grep -i mariadb rpm -e --nodeps mariadb-libs--.el7.x86_64 2.卸载已有Mysql 卸载旧版本mys ...

  4. Java 面向对象(十二)

    泛型 什么是泛型 泛型:广泛通用的类型 一开始还不确定是什么类型,在使用的时候,才能确定是什么类型 (1)在开始定义的时候,留一个插口 (2)在创建对象的时候,再去插入对应的类型 泛型也可以理解为&q ...

  5. pl/sql test Window 参数为date

    好久没写笔记了,感觉颓废了,原因是工作忙,休息时间人也变懒了,好了不说了:今天需要记录一下plsql打开测试窗口测试存储过程时,入参为date格式时报的异常 本以为和sql一样处理就可以,但是报异常, ...

  6. js的一些兼容性易错的的问题

    一.属性相关 我们通常把特征(attribute)和属性(property)统称为属性,但是他们确实是不同的概念,特征(attribute)会表现在HTML文本中,对特征的修改一定会表现在元素的out ...

  7. GO -- 遍历删除 数组 slice

    删的继续, 没删的i++

  8. scroll-view组件实现下拉刷新, 拉到底加载更多

    官方文档已声明,即使在page.json和app.json中开启下拉刷新,scroll-view组件也是不支持的.但我们可以通过曲线救国的方法来实现 实现代码 // wxml <scroll-v ...

  9. RVS PA-1800 功放参数

        RVS PA-1800大功率功放技术参数:     文章来源:外星人来地球 欢迎关注,有问题一起学习欢迎留言.评论

  10. <javaScript>通过getElementsByTagName获取标签的class值

    console.log(p[1].id); console.log(p.item(1).id); console.log(p[2].getAttribute("class")); ...