java(jdk1.7) IO系列01之InputStream和OutputStream解析
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java(jdk1.7) IO系列01之InputStream和OutputStream解析,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3828字,纯文字阅读大概需要6分钟。
内容图文
1.InputStream和OutputStream简介
在java中InputStream和OutputStream分别代表字节输入流和字节输出流,表示以字节的方式来实现进程或者程序的通信,InputStream是输入流,表示以字节的方式从文件(FileInputStream)或者字节数组(ByteArrayInputStream)等读取数据,与之相对应的OutputStream是输出流,表示以字节的方式向文件(FileOutputStream)或者字节数组(ByteArrayOutputStream)等写入数据,InputStream和OutputStream分别是所有的字节流的超类,定义了字节输入流和字节输出流的抽象方法和公用实现,这里使用设计模式中的模版模式,超类定义一些公用的实现和相关的方法的约束,子类实现。下面让我们来看一些InputStream和OutputStream的源码
2.InputStream源码解析
1 package java.io; 2 public abstract class InputStream implements Closeable { 3 4//定义可以跳过的最大字节数 5privatestaticfinalint MAX_SKIP_BUFFER_SIZE = 2048; 6 7//抽象读取方法,定义读取一个字节的方法约束,让子类去实现, 8publicabstractint read() throws IOException; 910//把读取的字节放到byte数组中,返回的是读取字节的数量11publicint read(byte b[]) throws IOException { 12return read(b, 0, b.length); 13 } 14//具体的读取字节到字节数组的实现,并提供读取到字节数组b的起始位置off和读入的长度len15publicint read(byte b[], int off, int len) throws IOException { 16if (b == null) { 17thrownew NullPointerException(); 18 } elseif (off < 0 || len < 0 || len > b.length - off) { 19thrownew IndexOutOfBoundsException(); 20 } elseif (len == 0) { 21return 0; 22 } 23//先读取一个字节,如果返回-1,说明当前流中没有数据,直接返回-124int c = read(); 25if (c == -1) { 26return -1; 27 } 28//如果有数据,则把数据存到b中29 b[off] = (byte)c; 3031int i = 1; 32try { 33//通过循环读取,然后把读取的内容存到传入的buffer中34for (; i < len ; i++) { 35 c = read(); 36//如果返回-1,则表示当前读取到文件的结尾37if (c == -1) { 38break; 39 } 40 b[off + i] = (byte)c; 41 } 42 } catch (IOException ee) { 43 } 44return i;//返回读取的字节的数量45 } 4647//返回真实跳过的字节的数量48publiclong skip(long n) throws IOException { 4950long remaining = n; 51int nr; 52//如果当前要求跳过0个,则直接返回053if (n <= 0) { 54return 0; 55 } 56//字符缓冲区的大小不能大于2048.跳过的数量n可能大于2048. 57//这里有个原因,为什么不直接声明一个和跳过字节n一样大小的数组。因为内存是个很昂贵的资源,如果一个文件很大的话,一次在内存中声明一个很大的内存, 58//一方面会占用很大的内存,另一方面也影响垃圾回收596061int size = (int)Math.min(MAX_SKIP_BUFFER_SIZE, remaining); 62byte[] skipBuffer = newbyte[size];//定义一个缓冲记录跳过的字节的数量63while (remaining > 0) { 64//如果跳过的数量大于2048,则通过缓冲区多次执行read方法计算跳过的数量65 nr = read(skipBuffer, 0, (int)Math.min(size, remaining)); 66if (nr < 0) { 67break; 68 } 69 remaining -= nr; 70 } 71//返回实际跳过的字节的数量72return n - remaining; 73 } 74//返回有多少数据能够读取75publicint available() throws IOException { 76return 0; 77 } 7879//关闭流,留给子类去实现80publicvoid close() throws IOException {} 8182//标记一个位置,然后执行reset方法的时候可以重新回到标记的位置83publicsynchronizedvoid mark(int readlimit) {} 8485//重新从标记的位置读取86publicsynchronizedvoid reset() throws IOException { 87thrownew IOException("mark/reset not supported"); 88 } 8990//表明是否支持标记功能91publicboolean markSupported() { 92returnfalse; 93 } 9495 }
3.OutputSteam源码解析
1 public abstract class OutputStream implements Closeable, Flushable { 2//写入一个字节b到输入流 3publicabstractvoid write(int b) throws IOException; 4 5//把字节数组b中的字节写入到输入流中 6publicvoid write(byte b[]) throws IOException { 7 write(b, 0, b.length); 8 } 910//把字节数组b中的字节写入到输入流中,并提供控制参数,从字节数组的那个位置开始读取,以及读取多长的长度11publicvoid write(byte b[], int off, int len) throws IOException { 12if (b == null) { 13thrownew NullPointerException(); 14 } elseif ((off < 0) || (off > b.length) || (len < 0) || 15 ((off + len) > b.length) || ((off + len) < 0)) { 16thrownew IndexOutOfBoundsException(); 17 } elseif (len == 0) { 18return; 19 } 20for (int i = 0 ; i < len ; i++) { 21 write(b[off + i]); 22 } 23 } 2425//刷新输出流,强制把字符缓冲中的字节从内存中写入到输出流中,如果输出流是内存比如ByteArrayOutputStream等,则该实现为空2627publicvoid flush() throws IOException { 28 } 2930//关闭输出流,并释放资源,如果子类不需要,则该实现为空31publicvoid close() throws IOException { 32 } 3334 }
4.结语
虽然InputStream和OutputStream的两个抽象类的实现比较简单,代码量比较少,但是我们还是可以从中学到一些东西,比如模版设计模式的使用方法,代码中对方法参数的校验逻辑等。多多体会别人写的代码,总会学到一些东西,或许现在看不出来有什么用,但是对你的影响会慢慢看出来的。
===============================================================
努力工作,用心生活
===============================================================
原文:http://www.cnblogs.com/flyinjava/p/6445266.html
内容总结
以上是互联网集市为您收集整理的java(jdk1.7) IO系列01之InputStream和OutputStream解析全部内容,希望文章能够帮你解决java(jdk1.7) IO系列01之InputStream和OutputStream解析所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。