一、简介

  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. Readiness probe failed:connection refused

    我的K8S集群在启动一个POD的时候说死起不来,然后就报下面的错误 Events: Type Reason Age From Message ---- ------ ---- ---- ------- ...

  2. P2597 [ZJOI2012]灾难——拓扑,倍增,LCA

    最近想学支配树,但是基础还是要打好了的: P2597 [ZJOI2012]灾难 这道题是根据食物链链接出一个有向图的关系,求一个物种的灭绝会连带几种物种的灭绝: 求得就是一个点能支配几个点: 如果一个 ...

  3. python下pip 安装 pyautogui报错Command "python setup.py egg_info" failed with error code 1 in C:\Users\Administrator\AppData\Local\Temp\pip-install-svhtepho\pygetwindow\

    python装的3.6 64位,使用命令pip install pyautogui 或者pip install -U pyautogui 都失败了 报错如下: Command "python ...

  4. 【caffe编译】nvcc warning:The 'compute_20', 'sm_20'

    Makefile.config 中 CUDA_ARCH := -gencode arch=compute_20,code=sm_20 \ -gencode arch=compute_20,code=s ...

  5. 深入理解JVM虚拟机9:JVM监控工具与诊断实践

    转自https://juejin.im/post/59e6c1f26fb9a0451c397a8c jvm优化必知系列——监控工具 微信公众号[Java技术江湖]一位阿里 Java 工程师的技术小站. ...

  6. 个人学习分布式专题(二)分布式服务治理之Dubbo框架

    目录 Dubbo框架 1.1 Dubbo是什么 1.2 Dubbo企业级应用示例(略) 1.3 Dubbo实现原理及架构剖析 1.4 Dubbo+Spring集成 Dubbo框架 1.1 Dubbo是 ...

  7. java——反射

    http://www.cnblogs.com/hxsyl/archive/2013/03/23/2977593.html

  8. Django 测试开发5 unittest测试用例

    Django测试用例 Django默认Python的标准库unittest编写测试用例.Django的单元测试类django.test.TestCase 从unittest.TestCase继承而来. ...

  9. MySQL数据库之sql_mode解释

    在MySQL5.6中,默认的SQL模式为:NO_ENGINE_SUBSTITUTION, 而在MySQL5.7中默认的SQL模式为:ONLY_FULL_GROUP_BY, STRICT_TRANS_T ...

  10. QML渐变色

    Rectangle { id: tab_btn width: height: parent.height color: "black" gradient: Gradient { G ...