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

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(后面还会讲到)。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值