前言

我们进行Android开发的时候经常会遇到各种 io 操作, 比如网络请求,文件操作,数据传输等。

Java中的 InputStreamOutputStream 都是 io 包中面向字节操作的顶级抽象类,关于java同步 io字节流的操作都是基于这两个的。

  • 网络数据传输:SocketInputStreamSocketOutputStream
  • 文件操作:FileInputStreamFileOutputStream
  • 字节数据操作:DataInputStreamDataOutputStream

InputStream

package java.io;
public abstract class InputStream implements Closeable {//MAX_SKIP_BUFFER_SIZE用于确定最大缓冲区大小//在跳过时使用  private static final int MAX_SKIP_BUFFER_SIZE = 2048;//从输入流中读取下一个byte的数据,返回的是一个0~255之间的int类型数。//如果已经到了流的末尾没有byte数据那么返回-1。//此方法阻塞,直到输入数据可用、检测到流的末尾或抛出异常。public abstract int read() throws IOException;//从输入流中读取一些字节,并将其存储到缓冲区数组b。//实际读取的字节数是以整数形式返回。此方法将阻塞,知道输入数据为止可用,检测到文件结尾,或抛出异常。//如果b的长度为0,则不读取任何字节,返回0。如果没有可用的字节,因为流是在文件结尾,返回值-1.//读取的字节数是:最多读取b的长度。public int read(byte b[]) throws IOException {return read(b, 0, b.length);}//从输入流中读取长度len的byte数据到一个数组中。//尝试尽可能的读取len长度的byte,但是可能读取较小的长度内荣,返回的是实际获取到的数据长度。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个byte数据。//返回实际丢弃的数据长度。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));if (nr < 0) {break;}remaining -= nr;}return n - remaining;}//估计可以读取(或跳过的)字节数,下一次调用可能是同一个线程或另一个线程。//单个读取或跳过此操作许多字节不会阻塞,但可能会读取或跳过更少的字节。public int available() throws IOException {return 0;}//关闭此输入流,并释放与这个流有关的任何系统资源public void close() throws IOException {}//标记输入流当前的位置,随后调用reset放在在最后的标记位置重新定位,以便后续读取相同的字节。//readlimit 参数标识此输入流允许在标记失效为止之前获取的字节数。public synchronized void mark(int readlimit) {}//将此输入流重新定位到上次调用mark方法标记的地方。//如果markSupported方法返回true,或者自从上次标记之后从该输入流中读取的数据大于标记的长度可能会抛出IOException。//如果markSupported方法返回false,那么调用改方法可能抛出IOException。public synchronized void reset() throws IOException {throw new IOException("mark/reset not supported");}// 测试这个输入流是否支持标记和充值。public boolean markSupported() {return false;}}

OutputStream

package java.io;public abstract class OutputStream implements Closeable, Flushable {//将指定的字节写入输出流中,一般来说要写入的这个字节是参数的低8位,高24位忽略。public abstract void write(int b) throws IOException;// 从指定的byte数组中写入到该输出流public void write(byte b[]) throws IOException {write(b, 0, b.length);}//从byte数组的off开始,想输出流中写入len长度的数据。可能空指针和数据越界异常。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 {}
}

使用

因为 InputStreamOutputStreamio 操作中的‘输入’和‘输出’是不可靠的,发生的异常是不受程序控制。都会有 IOExcepiton 异常抛出,所以我们在使用的时候需要进行 try/catch

InputStream in = null;
try {in = new ByteArrayInputStream(bytes);//部分代码省略
} catch(IOException e) {//部分代码省略
} finally {try {if (in != null) {in.close();}} catch(IOException e) {//部分代码省略}
}

java7支持try-with-resources方式关闭流,实现了java.lang.AutoCloseable接口的对象支持用下边的方式进行流的关闭:

public interface AutoCloseable {void close() throws Exception;
}
private static void printFileJava7() throws IOException {try(FileInputStream input = new FileInputStream("file.txt")) {int data = input.read();while(data != -1){System.out.print((char) data);data = input.read();}}
}

也支持一次性关闭多个:

private static void printFileJava7() throws IOException {try(  FileInputStream     input         = new FileInputStream("file.txt");BufferedInputStream bufferedInput = new BufferedInputStream(input)) {int data = bufferedInput.read();while(data != -1){System.out.print((char) data);data = bufferedInput.read();}}
}

相关实现类

文章到这里就全部讲述完啦,若有其他需要交流的可以留言哦

想阅读作者的更多文章,可以查看我 个人博客 和公共号:

细说InputStream和OutputStream相关推荐

  1. java的InputStream和OutputStream的理解【转】

    1.在java中stream代表一种数据流(源),javaio的底层数据元,---(想像成水龙头) 2.任何有能力产生数据流(源)的javaio对象就可以看作是一个InputStream对象 既然它能 ...

  2. java中InputStream和OutputStream的使用场景

    java的I/O中有两种基本的流类型 分别是 输入流InputStream 输出流OutputStream 有的时候很容易搞混使用的顺序,只需要记住: 输入流是把数据从别的地方读入本程序的内存 输出流 ...

  3. 分不清的InputStream和OutputStream

    分不清的InputStream和OutputStream 一直都很混乱到底哪个是读文件,哪个是写文件的呢? 今天又仔细分析,研读 了下,分享下自己的经验,有不对之处请指出. 1) InputStrea ...

  4. 如何在Java中将字节数组转换为InputStream和OutputStream

    您是否坚持使用编码,因为您有字节数组,并且链中的下一个方法需要InputStream? 不用担心Java有解决方案,您可以使用 ByteArrayInputStream 在Java中将字节数组转换为I ...

  5. InputStream和OutputStream

    1.输入/输出流以处理字节和字符分类形成两个单独的层次结构: (1)InputStream和OutputStream类可以读写单个字节或字节数组. (2)Reader和Writer类可以读写基于两字节 ...

  6. InputStream 和OutputStream

    1.InputStream ◇ 从流中读取数据: int read( ); //读取一个字节,返回值为所读的字节 int read( byte b[ ] ); //读取多个字节,放置到字节数组b中,通 ...

  7. InputStream与OutputStream归纳

    很多人刚学习程序流一章的时候,就是搞不清楚In和Out,不知道什么时候用in什么时候用out,所以一部分人采取死记硬背的方式,诸如如下这位: BufferedReader in = new Buffe ...

  8. java中io流,Reader和Writer,InputStream和OutputStream,转换流 InputStreamReader 和 OutputStreamWriter

    java中所谓流通俗来讲就是数据源的传输,我们的文件,视屏,对象都可以叫做数据源,io将他们那转换为可以在不同程序中传输的数据,众所周知电脑存储是二进制,而处理时常遇到字节和字符的写入和写出,分别以8 ...

  9. 字节流(InputStream和OutputStream),字节流读写文件,字节流的缓冲区,字节缓冲流

    字节流 抽象类InputStream和OutputStream是字节流的顶级父类 所有的字节输入流都继承自InputStream,所有的输出流都继承子OutputStream InputStream的 ...

最新文章

  1. 1043 输出PATest
  2. springboot新版本(2.0.0+)自定义ErrorController中使用ErrorAttributes
  3. ElementUI中el-table添加小计行之后调整在滚动条上方
  4. Sharepoint学习笔记—ECM系列--根据位置设置的默认元数据值(Location-Based Metadata Defaults)...
  5. 创业失败常见的8大原因
  6. 2017职称英语和计算机考试,2017年职称英语考试取消了吗
  7. 18kw丹佛斯变频器常见故障_变频器常见故障——输出不平衡、过载、开关电源损坏...
  8. ACM 学习笔记(七) 贪心
  9. java ajax传值到后台_java ajax发送数据到后台,中文乱码
  10. Oracle数据库索引使用及索引失效总结
  11. atitit 英文与中文与阿拉伯文的简化解决方案.docx
  12. 微信抢号软件_强推|那些写微信公众号一定要拥有的软件
  13. MergeSort(合并排序)
  14. MATLAB绘制折线图和散点图
  15. JuiceFS 如何帮助趣头条超大规模 HDFS 降负载
  16. 用android手机测量身高,教你如何使用小米手机测量自己的身高!
  17. EhCache 是一个纯Java的进程内缓存框架,具有快速、精干等特点,是hibernate中默认的CacheProvider Ehcache是一种广泛使用的开源Java分布式缓存。主要面向通
  18. windows下连接服务器
  19. 服务器远程管理(远程桌面(图形) telnet(命令行))
  20. 东京工业大学 计算机 大学院,2020年东京工业大学计算机科学硕士申请条件

热门文章

  1. Web服务之Apache的配置和应用
  2. Cocos2d-x 3.0坐标系详解
  3. 求三个数的最大公约数和最小公倍数
  4. Scoop-强大的Windows命令行包管理工具
  5. 疫情期间网民情绪识别比赛分享+top1~3解决方案
  6. RSA加密原理与过程
  7. 30岁才醒悟的职场法则,现在知道还不太晚
  8. 设计模式也可以这么简单,一看就懂
  9. ch05与游戏世界交互——鼠标打飞碟小游戏
  10. 使命召唤,从此刻开始