Java字节流:InputStream OutputStream

字节输入流:InputStream 

类声明:

public abstract class InputStream implements Closeable

位于java.io包下,是一个抽象类.

官方对其说明:
  This abstract class is the superclass of all classes representing an input stream of bytes.
  (简单翻译:抽象类InputStream是所有字节输入流的父类)

主要方法:
  - int available();返回输入流中可读取的字符个数.
  - void close(): 关闭此输入流并释放与该流有关的系统资源.
  - void mark(int readlimit): 在此输入流中标记当前的位置.
  - boolean markSupported(): 检测此输入流是否支持mark和reset.
  - abstract int read(): 从输入流中读取数据的下一个字节.
  - int read(byte[] b): 从输入流中读取一定数量的字节,并将其存储在字节数组b中
  - int read(byte[] b,int off,int len): 从输入流中读取len个字节,并将其存储在字节数组b中off位置开始的地方
  - void reset(): 将此流重新定位到最后一次对此输入流调用mark方法时的位置.
  - long skip(long n): 跳过和丢弃此输入流中n个字节的数据.

  InputStream 是所有字节输入流的父类,其中有一个抽象方法read() 是字节输入流的核心,所有子类都必须实现此方法。
InputStream源代码分析:

  1 package java.io;
  2 
  3 /**
  4  * 该抽象类是所有字节输入流的父类
  5  */
  6 public abstract class InputStream implements Closeable {
  7 
  8     private static final int MAX_SKIP_BUFFER_SIZE = 2048;//最大允许跳过的字节个数
  9 
 10 
 11 /*
 12     功能: 从输入流中读取下一个字节数据,字节数据的值以0-255之间的int类型返回,如果已经到达流末尾,则返回值-1.
 13         子类必须提供该方法的一个实现.
 14     返回值:下一个字节数据;如果到达流的末尾则返回-1
 15 */
 16     public abstract int read() throws IOException;
 17 
 18 
 19     public int read(byte b[]) throws IOException {
 20         return read(b, 0, b.length);
 21     }
 22 
 23 /*
 24     功能:从输入流中读取len个字节数据,并把这些字节数据写到字节数组b中(从off位置开始写)
 25     参数:
 26         byte b[]: 存储从输入流中读取的字节数据
 27         int off: 开始位置
 28         int len: 读取的字节个数
 29     返回值: 实际从输入流中读取到字节数组b中的字节个数
 30 */
 31     public int read(byte b[], int off, int len) throws IOException {
 32 
 33     //检查字节数组b是否为null,检查off len 等参数是否数组越界
 34         if (b == null) {
 35             throw new NullPointerException();
 36         } else if (off < 0 || len < 0 || len > b.length - off) {
 37             throw new IndexOutOfBoundsException();
 38         } else if (len == 0) {
 39             return 0;
 40         }
 41 
 42       //从输入流中读取第一个字节数组,并且判断输入流是否已经到达末尾
 43         int c = read();
 44         if (c == -1) {
 45             return -1;
 46         }
 47         b[off] = (byte)c;
 48 
 49     //循环从输入流中读取len个字节数据到字节数组b中(如果循环读取过程中到达了输入流的末尾,则跳出循环不再读取)
 50         int i = 1;
 51         try {
 52             for (; i < len ; i++) {
 53                 c = read();
 54                 if (c == -1) {
 55                     break;
 56                 }
 57                 b[off + i] = (byte)c;
 58             }
 59         } catch (IOException ee) {
 60         }
 61         return i;
 62     }
 63 
 64 
 65 /*
 66     功能: 在输入流中跳过n个字节数据
 67 */
 68     public long skip(long n) throws IOException {
 69         long remaining = n;
 70         int nr;
 71 
 72         if (n <= 0) {
 73             return 0;
 74         }
 75 
 76         int size = (int)Math.min(MAX_SKIP_BUFFER_SIZE, remaining);
 77         byte[] skipBuffer = new byte[size];
 78         while (remaining > 0) {
 79             nr = read(skipBuffer, 0, (int)Math.min(size, remaining));
 80             if (nr < 0) {
 81                 break;
 82             }
 83             remaining -= nr;
 84         }
 85 
 86         return n - remaining;
 87     }
 88 
 89 /*
 90     功能: 返回输入流中还可被读取的字节个数
 91 */
 92     public int available() throws IOException {
 93         return 0;
 94     }
 95 
 96 /*
 97     功能: 关闭输入流
 98 */
 99     public void close() throws IOException {}
100 
101 /*
102     功能: 在输入流中标记一个位置
103 */
104     public synchronized void mark(int readlimit) {}
105 
106 /*
107     功能: 将此流重新定位到最后一次对此输入流调用 mark 方法时的位置.
108 */
109     public synchronized void reset() throws IOException {
110         throw new IOException("mark/reset not supported");
111     }
112 
113 /*
114     功能: 检查该输入流是否支持mark()和reset()方法
115 */
116     public boolean markSupported() {
117         return false;
118     }
119 }

 

字节输入流:OutputStream 

类声明:

public abstract class OutputStream implements Closeable

位于java.io包下,是一个抽象类.
官方对其说明:
  This abstract class is the superclass of all classes representing an output stream of bytes.
  (简单翻译:抽象类OutputStream是所有字节输出流的父类)

主要方法:
  - void close(): 关闭此输出流并释放与该流有关的系统资源.
  - void flush(): 刷新此输出流并强制写出所有缓冲的输出字节.
  - void write(byte[] b): 将b.length个字节从指定的byte数组写入此输出流.
  - void write(byte[] b,int off,int len): 将byte数组中从off位置开始的len个字节写入此输出流.
  - abstract void write(int b): 将指定的字节写入此输出流.

  OutputStream 是所有字节输出流的父类,其中有一个抽象方法write(int b) 是字节输出流的核心,所有子类都必须实现此方法。

OutputStream源代码分析:

 1 package java.io;
 2 
 3 /*
 4 该抽象类是所有字节输出流的父类。输出流接收输出字节并将这些字节发送到某个接收器。
 5 */
 6 public abstract class OutputStream implements Closeable, Flushable {
 7 
 8 /*
 9     功能: 将指定的数据b写入到输出流中.
10 */
11     public abstract void write(int b) throws IOException;
12 
13 /*
14     功能:将字节数组b中的全部数据写入到此输出流中
15 */
16     public void write(byte b[]) throws IOException {
17         write(b, 0, b.length);
18     }
19 
20 /*
21     功能: 将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此输出流
22 */
23     public void write(byte b[], int off, int len) throws IOException {
24         if (b == null) {
25             throw new NullPointerException();
26         } else if ((off < 0) || (off > b.length) || (len < 0) ||
27                    ((off + len) > b.length) || ((off + len) < 0)) {
28             throw new IndexOutOfBoundsException();
29         } else if (len == 0) {
30             return;
31         }
32 
33       //循环写入到此输出流
34         for (int i = 0 ; i < len ; i++) {
35             write(b[off + i]);
36         }
37     }
38 
39 /*
40     功能:刷新此输出流并强制写出所缓冲的输出字节
41 */
42     public void flush() throws IOException {
43     }
44 
45 /*
46     功能:关闭此输出流并释放与此流关的所系统资源
47 */
48     public void close() throws IOException {
49     }
50 }

 

posted @ 2016-11-07 20:11  火爆泡菜  阅读(419)  评论(0编辑  收藏  举报