Java之I/O(1-InputStream类及其子类)
2015-06-26 17:05
399 查看
Java的I/O总是会被经常用到,每次用的时候总感觉有点不知所措,因为package java.io里有太多的类可以使用了,所以,抽出一些时间弄清楚Java I/O的发展史很有必要。只要弄清楚了这些类的来龙去脉,用的时候才会得心应手。
在JDK API 1.6的版本里,java.io包下一共有12个接口,52个类(异常先不考虑),下面我们逐一分析。
上述6种子类直接继承于InputStream,可将不同类型的数据来源转为InputStream对象使用。那么,InputStream又是什么样的呢?
我们可以认为InputStream提供了一种统一的对待输入的方法,可将多种不同类型的数据源都用统一的读取方式对待。要说明的是,InputStream是用来操控字节输入流的,它所提供的方法也是针对字节的。在Java 1.6版本中,InputStream提供了以下方法:
2 FileInputStream
3 StringBufferInputStream
由上面的代码片断可以看出,InputStream的子类的读取方法都大同小异,且都是以字节为单位。由代码结果也可以看出,在有些情况下,因为是以字节为单位,所以未能正确的将字符转换为字符。像StringBufferInputStream,从java 1.1开始,该类就被废弃了,从字符串创建流的首选方法变成了StringReader(后面还会讲到)。
在JDK API 1.6的版本里,java.io包下一共有12个接口,52个类(异常先不考虑),下面我们逐一分析。
InputStream和OutputStream类:
InputStream和OutputStream是这一类的鼻祖,从Java 1.0就开始存在。那个时候希望所有与输入有关的类都继承于InputStream,所有与输出有关的类都继承于OutputStream。本文主要讲InputStream,根据数据来源的类型不同,可以将InputStream分为以下几类:InputStream子类 数据源类型 ByteArrayInputStream 包含一个内存缓冲区,字节从中取出。 FileInputStream 从文件中获得字节。 ObjectInputStream 用来恢复被序列化的对象。 PipedInputStream 管道输入流,读取管道内容。多和PipedOutputStream一起用于多线程通信。 SequenceInputStream 是多种输入流的逻辑串联,从第一个输入流读取,直到最后一个输入流。 StringBufferInputStream 读取的字节由字符串提供。
上述6种子类直接继承于InputStream,可将不同类型的数据来源转为InputStream对象使用。那么,InputStream又是什么样的呢?
我们可以认为InputStream提供了一种统一的对待输入的方法,可将多种不同类型的数据源都用统一的读取方式对待。要说明的是,InputStream是用来操控字节输入流的,它所提供的方法也是针对字节的。在Java 1.6版本中,InputStream提供了以下方法:
方法 解释 available() 返回此输入流下一个方法可以读取的字节数。 close() 关闭此输入流并释放相应资源。 mark(int) 在此输入流中标记当前的位置。 markSupported() 测试此输入流是否支持mark和reset方法。 read() 从此输入流中读取下一个字节(此方法是抽象方法,子类必须实现该方法)。 read(byte[]) 从输入流中读取一定数量的字节,存储在参数指定的字节数组中。 read(byte[],int,int)从输入流中指定位置起读取若干字节存储在指定字节数组中。 reset() 将此输入流定位到最后一次mark的位置。 skip(long) 跳过和丢弃此输入流中数据的若干字节。
下面举几个例子:
1 ByteArrayInputStreampublic void testByteArray(){ byte[] buf=new byte[]{3,4,1,127,67,45,76,90,0,2}; byte[] b=new byte[2]; ByteArrayInputStream in=new ByteArrayInputStream(buf); int first=in.read(); System.out.println("Read the first byte is: "+first); in.skip(2); System.out.println("Skip 2 bytes."); in.read(b,0,2); System.out.println("Read 2 bytes to byteArray.\nNow the byteArray b is "+Arrays.toString(b)); System.out.println("After the operations above, the left bytes is: "+ in.available()); } /* output: Read the first byte is: 3 Skip 2 bytes. Read 2 bytes to byteArray. Now the byteArray b is [127, 67] After the operations above, the left bytes is: 5 共10个字节,存储在数组buf中。读取第一个字节,跳过2个字节,读取两个字节放在数组b中,还有5个剩余字节。 */
2 FileInputStream
public void testFile() throws IOException{ File f=new File("testFile.txt"); FileInputStream in=new FileInputStream(f); int first=in.read(); System.out.println("The first byte is: "+first);} /* testFile: 99 84 80 45 Output: The first byte is: 57 可以看出:每个字符的低八位可以使用。 /*
3 StringBufferInputStream
public void testStringBuffer(){ String s="abcdefg"; StringBufferInputStream in=new StringBufferInputStream(s); int first=in.read(); System.out.println("The firts byte is: "+first); } /* Output: The firts byte is: 97 可以看出:每个字符的低八位可以使用。 */
由上面的代码片断可以看出,InputStream的子类的读取方法都大同小异,且都是以字节为单位。由代码结果也可以看出,在有些情况下,因为是以字节为单位,所以未能正确的将字符转换为字符。像StringBufferInputStream,从java 1.1开始,该类就被废弃了,从字符串创建流的首选方法变成了StringReader(后面还会讲到)。
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树
- [原创]java局域网聊天系统