该类是所有二进制输入流的的抽象父类

类中主要方法解释说明如下

(1)public abstract int read() throws IOException;

  该方法是从输入流中读取下一个字节,返回的值字节是一个范围从0到255之间的int数。如果读到输入流的未尾,则返回-1。 同时该方法会一直阻塞直到输入流中数据可用,或者流读完毕或者抛出异常。

下面以FileInputStream来举个示例。

读取一个文件test.txt. 该文件内容“abcdefghijklmn”

  @Test
public void testRead() throws IOException {
FileInputStream inputStream = new FileInputStream("E:\\360downloads\\wpcache\\srvsetwp\\test.txt");
while (true) {
int read = inputStream.read();
if (read == -1) {
break;
}
System.out.println(read + "," + (char) read);
}
}

打印结果如下: 

97,a
98,b
99,c
100,d
101,e
102,f
103,g
104,h
105,i
106,j
107,k
108,l
109,m
110,n

(2)public int read(byte b[]) throws IOException;

  从输入流中读取一些字节存储到b数组中,返回实际读取的长度。如果b的大小为0,则不会从输入流中读取字节,否现读取的第一个字节放入b[0],第二个字节放b[1] ,依次类推,该方法也是阻塞的,直到流读可用,或者读完,或者抛异常。

示例1:  

   @Test
public void testReadBytes() throws IOException {
FileInputStream inputStream = new FileInputStream("E:\\360downloads\\wpcache\\srvsetwp\\test.txt");
byte[] buf = new byte[100];
int read = inputStream.read(buf);
System.out.println(read); //
String readContent = new String(buf, 0, read);
System.out.println(readContent); //abcdefghijklmn
}

示例2:

 @Test
public void testReadBytes() throws IOException {
FileInputStream inputStream = new FileInputStream("E:\\360downloads\\wpcache\\srvsetwp\\test.txt");
byte[] buf = new byte[5];
int read = inputStream.read(buf);
System.out.println(read); //
String readContent = new String(buf, 0, read);
System.out.println(readContent); //abcde
}

示例3:

 @Test
public void testReadBytes() throws IOException {
FileInputStream inputStream = new FileInputStream("E:\\360downloads\\wpcache\\srvsetwp\\test.txt");
byte[] buf = new byte[5];
int len = 0;
while ((len = inputStream.read(buf)) != -1) {
String readContent = new String(buf, 0, len);
System.out.println(readContent);
} }

示例3打印结果:

abcde
fghij
klmn

由示例3可知,read(byte b[])方法,每次都会从输入流中读取b.length个字节,下次读流时,接着上一次的未尾开始。

(3)public long skip(long n) throws IOException;

   从输入流中跳过n个字节或者说是丢弃掉n个字节

  @Test
public void testSkip() throws IOException {
FileInputStream inputStream = new FileInputStream("E:\\360downloads\\wpcache\\srvsetwp\\test.txt");
byte[] buf = new byte[14];
long skip = inputStream.skip(4);
System.out.println("skip:"+ skip); // skip:4 int read = inputStream.read(buf);
System.out.println("read:"+read); //read:10 String readContent = new String(buf, 0, read);
System.out.println(readContent); //efghijklmn
}

从上面的打印结果可知,skip确实丢弃掉了4个字节(abcd), 后面read时直接从输入流中的第5个字节开始读取,所以最终打印是“efghijklmn”

(4)public int available() throws IOException ;

    检测输入流中还可以read读取的字节个数

 @Test
public void testAvailable() throws IOException {
FileInputStream inputStream = new FileInputStream("E:\\360downloads\\wpcache\\srvsetwp\\test.txt"); int available = inputStream.available();
System.out.println("第一次测试available:"+available); //第一次测试available:14 long skip = inputStream.skip(4);
System.out.println("skip:" + skip); // skip:4 available = inputStream.available();
System.out.println("第二次测试available:"+available); // 第二次测试available:10 byte[] buf = new byte[5];
int read = inputStream.read(buf);
System.out.println("read:" + read); //read:10 available = inputStream.available();
System.out.println("第三次测试available:"+available); //第三次测试available:5 String readContent = new String(buf, 0, read);
System.out.println(readContent); //efghijklmn
}

由打印结果,可以很容易的理解available()方法的含义。

第1次 inputStream中可读字节14;skip丢弃掉4个字节后,第2次 检测 inputStream中可读字节等于 14 - 4 = 10 个; 然后从inputStream中read读取5个字节后,第3次打印 只剩5个可用字节了。

(5)public synchronized void mark(int readlimit) ;

  

先来做一个测试:

 @Test
public void testMarks() throws IOException {
FileInputStream inputStream = new FileInputStream("E:\\360downloads\\wpcache\\srvsetwp\\test.txt"); byte[] buf = new byte[5];
int read = inputStream.read(buf);
// 第1次从inputStream流中读5个字节
System.out.println(new String(buf,0,read));
// 打个标识
inputStream.mark(5);
// 第2次从inputStream流中读取5个字节
int secondRead = inputStream.read(buf);
System.out.println(new String(buf,0,secondRead)); // 第3次从inputStream流中读取4个字节(只剩下4个字节了)
int thirdRead = inputStream.read(buf);
//注意:这里不要用buf.length, 因为本次没有5个字节,不能将第2次读取到buf数组中的值全部覆盖
System.out.println(new String(buf,0,thirdRead));
}

本次实验,第1次读取inputStream中的前5个字节 , 第2次读取inputStream中的6到10个字节, 第3次读取inputStream中未尾4个字节 , remark()方法好像没有啥用吧。好像还真的是,不过请先看看markSupported()方法

请看下面测试:

 @Test
public void testMarkSupport() throws IOException {
FileInputStream inputStream = new FileInputStream("E:\\360downloads\\wpcache\\srvsetwp\\test.txt");
boolean b = inputStream.markSupported();
System.out.println(b); //false
}

上次测试打印false ,  表示FileInputStream这种类型的流,根本就不支持mark()或者reset()方法。所以,尴尬。。。

下面找一个支持mark(),reset()的输入流是测试一把

 @Test
public void testMarkAndReSet() throws Exception{
String content = "abcdefghijklmn";
InputStream inputStream = new ByteArrayInputStream(content.getBytes()); System.out.println("是否支持mark:"+ inputStream.markSupported()); //是否支持mark:true
byte[] buf = new byte[5];
int read = inputStream.read(buf);
// 第1次从inputStream流中读5个字节
System.out.println(new String(buf,0,read)); //abcde
// 打个标识
inputStream.mark(5);
// 第2次从inputStream流中读取5个字节
int secondRead = inputStream.read(buf);
System.out.println(new String(buf,0,secondRead)); // fghij // 重置
inputStream.reset(); // 第3次从inputStream流中读取5个字节
int thirdRead = inputStream.read(buf);
System.out.println(new String(buf,0,thirdRead)); // fghij // 第4次从inputStream流中读取5个字节
int forthRead = inputStream.read(buf);
System.out.println(new String(buf,0,forthRead)); //klmn }

哈,仔细观察打印结果,发现mark+reset后, 可以重复读取流中数据 。 其实,mark+reset就是这么点功能。

好了,InputStream这个输入流的顶层抽象类就写完了,主要也就这么几个方法!

输入流之顶层抽象InputStream的更多相关文章

  1. 【java】io流之字节输入流:java.io.InputStream类及子类java.io.FileInputStream

    package 文件操作; import java.io.File; import java.io.FileInputStream; import java.io.IOException; impor ...

  2. 2017.9.5 Java知识点总结

    1.*程序的数据操作往往都在内存中操作的,也就是说数据运算都在内存中完成. 2.*什么是变量? --变量就是内存中的一块用来存放数据的存储单元. --变量中的值可变 --我们通过变量名就可以找到内存中 ...

  3. IO流 -字符输入输出流,以及异常处理方法

    字符输入流 java.io.Reader: 字符输入流的顶层抽象父类 共性的成员方法: int read() 读取单个字符,并返回. int read(char[] cbuf) 将字符读入数组. ab ...

  4. Java的IO流以及输入流与输出流的异同

    一:流的基本概念:           Java中I/O操作主要是指使用Java进行输入,输出操作. Java所有的I/O机制都是基于数据流进行输入输出,这些数据流表示了字符或者字节数据的流动序列.J ...

  5. IO流04_InputStream和Reader输入流

    [输入流中的字符流和字节流] [InputStream和Reader] InputStream和Reader是所有输入流的抽象基类,本身不能实例化,但是他们是所有输入流的模板. [ InputStre ...

  6. Java:字节流和字符流(输入流和输出流)

    本文内容: 什么是流 字节流 字符流 首发日期:2018-07-24 什么是流 流是个抽象的概念,是对输入输出设备的抽象,输入流可以看作一个输入通道,输出流可以看作一个输出通道. 输入流是相对程序而言 ...

  7. java中的IO流(输入流与输出流)概述与总结

    Java中IO流,输入输出流概述与总结 总结的很粗糙,以后时间富裕了好好修改一下. 1:Java语言定义了许多类专门负责各种方式的输入或者输出,这些类都被放在java.io包中.其中, 所有输入流类都 ...

  8. [Java开发之路](8)输入流和输出流

    1. Java流的分类 按流向分: 输入流: 能够从当中读入一个字节序列的对象称作输入流. 输出流: 能够向当中写入一个字节序列的对象称作输出流. 这些字节序列的来源地和目的地能够是文件,并且通常都是 ...

  9. 013-java中的IO操作-InputStream/Reader、OutputStream/Writer

    一.概述 IO流用来处理设备之间的数据传输,上传文件和下载文件,Java对数据的操作是通过流的方式,Java用于操作流的对象都在IO包中. 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称 ...

随机推荐

  1. Linux学习篇(四)-Linux 文件管理命令详解

    rootfs:根文件系统,Root FileSystem 的简称. Linux 文件命名规则 长度不超过255个字符. 不能使用/当文件名. 严格区分大小写. Linux 目录简介 / 根目录 /bo ...

  2. 使用 GitLab 的 OAuth2 认证服务

    原文地址 本文档讲述如何使用 GitLab 作为 OAuth 认证服务提供商,以通过 GitLab 的 OAuth 认证登录其他服务(例如持续集成工具 Drone). 如果想使用其他 OAuth 身份 ...

  3. 深入浅出WPF(Binding篇1)

    Binding在业界的使用一直是音译而来的,称为"Binding".Binding的源是逻辑数据对象,目标则是UI层上面的控件对象.数据通过Binding送达UI层,被UI层展示出 ...

  4. 【转载】Spring boot学习记录(三)-启动原理解析

    前言:本系列文章非本人原创,转自:http://tengj.top/2017/04/24/springboot0/ 正文 我们开发任何一个Spring Boot项目,都会用到如下的启动类 @Sprin ...

  5. HTML-lang属性规定元素内容的语言

    所有浏览器均支持 lang 属性. 属性lang是英语language的缩写,意思是语言,”en”代表英语,”zh-CN”代表中文 注释:lang 属性在以下标签中无效:<base>, & ...

  6. poj2010 Moo University - Financial Aid 优先队列

    Description Bessie noted that although humans have many universities they can attend, cows have none ...

  7. [COCI2017.1]Deda —— 解锁线段树的新玩法

    众所周知,能用线段树做的题一定可以暴力 但考场上也只能想到暴力了,毕竟还是对线段树不熟练. deda 描述 有一辆车上有n个小孩,年龄为1~n,然后q个询问,M X A代表在第X站时年龄为A的小孩会下 ...

  8. Map遍历方式

    entrySet 推荐 最常用,性能很好 示例: for (Map.Entry<Integer, Integer> entry : map.entrySet()) { System.out ...

  9. B+树索引结构解析

    一.二分查找法 二分查找法(binary search)也成为折半查找法.用来查找一组有序的记录组中的某一记录. 基本思想是:将记录按有序化(递增或递减)排列,在查找过程中采用跳跃式方法查找,即先以有 ...

  10. CodeForces 219D Choosing Capital for Treeland (树形DP)经典

    <题目链接> 题目大意: 给定一个有向树,现在要你从这颗树上选一个点,使得从这个点出发,到达树上其它所有点所需翻转的边数最小,输出最少需要翻转的边数,并且将这些符合条件的点输出. 解题分析 ...