一、简介

  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.6

    div { display:flex; flex-direction:row-reverse; } -webkit-, - ms-或-moz- CSS语法 flex-direction: row|ro ...

  2. pc电源cpu插座和显卡插座

    cpu插座是8口的,一般4+4 显卡插座是6口的,也有8口的用6+2 6+2的中2有一个小边,组合成8口也不能插入cpu插座.

  3. 2018-2019-2 网络对抗技术 20165202 Exp8 Web基础

    博客目录 一.实践内容 Web前端HTML 能正常安装.启停Apache.理解HTML,理解表单,理解GET与POST方法,编写一个含有表单的HTML Web前端javascipt 理解JavaScr ...

  4. 2018-2019-2 20165234 《网络对抗技术》 Exp9 Web安全基础

    Exp9 Web安全基础 一. 实践内容 1. 安装JDK.Webgoat 2. SQL注入攻击 数字型注入(Numeric SQL Injection) 日志欺骗(Log Spoofing) 字符串 ...

  5. OpenResty之replace-filter-nginx-module

    原文: openresty/replace-filter-nginx-module 1. 概要 location /t { default_type text/html; echo abc; repl ...

  6. 命令行运行Python脚本时传入参数的三种方式

    原文链接:命令行运行Python脚本时传入参数的三种方式(原文的几处错误在此已纠正) 如果在运行python脚本时需要传入一些参数,例如gpus与batch_size,可以使用如下三种方式. pyth ...

  7. 阿里云服务器配置https(总结)

    阿里云服务器配置https(总结) 一.总结 一句话总结: 1.下载https证书(可以在阿里云上) 2.在服务器上面开启443端口 3.配置apache服务器,443的加ssl,让80的重定向到44 ...

  8. arcgis python 获得arcgis安装版本和安装位置

    import arcpy print(arcpy.GetInstallInfo()['Version']) 和获得ArcGIS版本和安装位置 import arcpy # Use the dictio ...

  9. ES--Kibana相关操作创建索引和Mapping

    创建索引 kibana 使用如下命令进行创建索引内容. PUT test_index/ 创建别名 POST _aliases { "actions": [{ "add&q ...

  10. "errcode":40001,"errmsg":"invalid credential, access_token is invalid or not latest hint: [d0tQ_02368635

    微信报错,避免多处使用appid与secret发送求