Java之I/O(1-InputStream类及其子类)

来源:互联网 发布:json文件怎么添加注释 编辑:程序博客网 时间:2024/06/10 00:25

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: 3Skip 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 45Output: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(后面还会讲到)。

0 0
原创粉丝点击