您的位置:首页 > 编程语言 > Java开发

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个类(异常先不考虑),下面我们逐一分析。

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 ByteArrayInputStream

public 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 inputstream