java io 学习小结之输入流InputStream

 

转载    http://wangning1125.iteye.com/blog/1400146




 

 

 

 什么是流:流就是字节序列的抽象概念,能被连续读取数据的数据源和能被连续写入数据的接收端就是流。

 

流的分类:

             从流的目标类型分类:文件流,网络流,对象流等。

             从流的方向分类:输入流和输出流

             从流的内容分类:字节流和字符流

             从流的功能分类:节点流和包装流(也有叫措置流,处理流,过滤流的)

    文件流就是基于计算机上存储的文件生成的流对象,网络流就是基于网络来传送信息的流对象,对象流也就是通过操作流的方式实现在计算机上存和读取java实体对象的一种流类型。

 

   输入流就是能连续从其中读取数据的对象,输出流刚刚相反,就是能连续写入数据到其中的对象。

 

   字节流操作的是最原始的字节数据,而字符流实现了对字节流操作的包装,可以直接操作字符,原理也就是在底层读取字节的时候呢,并不会马上返回该字节数据,而是在读取到之后呢参照相应的字符编码表来转换成相应的字符,再返回。unicode字符需要读取两个字节,而utf-8字符有头信息是三个字节。

 

   节点流就是从特定方向读取的流对象,也可以叫核心流,也就是说它是直接和原数据做交互。

   包装流只是通过节点流做为输入或者输出,提供一些额外的功能,比如字符缓冲等。包装流一般都接收一个节点流做为构造参数,它们一般也会实现同一个接口,之所以实现统一接口,是因为包装类要保证拥有被包装的核心流的所有的方法和功能。只可以多而不可以少,而包装流底层也是通过操作核心流来实现额外功能的。

 

  ps: java io 体系所有子类的名称的后缀名一般都是父类的名称。

 

  InputStream 是所有字节输入流的超类,它是个抽象类。并且所有过滤流的构造函数接收的类型也是它。

 

   其中的方法也是所有输出流类都有的方法:

    available() 返回当前未读的字节数,

    close() 关闭流资源,

   mark(int readlimit) 标记当前输入流所在的位置,也就是当前输入流读取到的位置,readlimit 表示最大缓存多少个字节,也就是记忆多少个字节。当调用reset()方法的时候会重新定位到mark方法定位时的位置。InputStream 里没有实现这两个方法,只会抛出IOException。

   markSupported() 测试此输入流是否支持 mark 和 reset 方法。

   read()方法,读取单个字节,以int类型返回,是个抽象方法。

  read(byte[]) 从输入流中读取一定数量的字节,并将其存放到字符数组中。

   read(byte[] b,int startIndex,int len) 从输入流中的startIndex位置读取len个字节放到字符数组中,

   reset()方法,将此流重新定位到最后一次对此输入流调用 mark 方法时的位置。

   skip(long n)方法, 跳过和丢弃此输入流中数据的 n 个字节。

 

 FileInputStream :  从文件系统中获取某个文件的输入字节。他主要用来读取一些原始的字符,比如图片等,如果需要读取的是文本字符,使用FileReader比较好。

  构造函数有三个重载:File类型的实例,String 类型的文件路径名,还有FileDescriptor的实例(这个基本用不到)。

  新增方法:

        finalize() 确定在不引用该流对象时会关闭该流。

        getChannel() 返回该输入流的文件通道

        getFD() 返回相关的文件系统FileDescriptor 对象。

 该类未实现mark和reset方法。

 用途:一般如果要创建一个文件的输入流都要用到它,非常常用的类。

 

 ObjectInputStreamObjectOutputStream这两个包装类,用于从底层输入流中读取对象类型的数据和将对象类型的数据写入到底层输入流。
ObjectInputStream与ObjectOutputStream类所读写的对象必须实现了Serializable接口。对象中的transient和static类型的成员变量不会被读取和写入。写入对象和读取对象的顺序也应该是一样的。

一般我们使用的也就是readObject()和writerObject()功能,因为实现了DataInput和DataOutput接口,他们也可以读写基本数据类型的数据,也可以读写byte类型数据。还有一些其他方法,感觉现在都用不到,等用得到的时候再慢慢研究吧。

用途:要序列化对象和反序列化对象时就要用到这两个类了,还有就是在网络中传输对象也要用到它们。

 

  PipedInputStreamPipedOutputStream 用于在应用程序里创建管道通信,比如一个线程和另外一个线程之间的通信,即一个线程在 PipedInputStream里读取数据 ,一个线程在往PipedOutputStream 里写入数据。

PipedInputStream构造函数有4个参数的重载:无参,指定int类型管道大小,PipedOutputStream 实例的,PipedOutputStream 实例加管道大小。PipedOutputStream 的构造函数参数只有两个,一个是无参的,一个是PipedInputStream的实例。

 

  PipedInputStream里的主要方法:

        connect()方法:不管是PipedOutputStream 还是PipedInputStream都有这个方法,这是连接这个管道的方法。

       receive(int byte) 方法:接收字节,一般是给PipedOutputStream 调用的,让它写入字节。

       read() 方法, 返回单个字节

       read(byte[] ,int ,int )  读取指定长度的字节到数组中

 

 PipedOutputStream 里的主要方法:

      connect()方法:连接管道

      flush()方法:刷新缓存区

      write(byte[] b,int off, int len):将 len 字节从初始偏移量为 off 的指定 byte 数组写入该管道输出流。

      wirte(int b) : 将指定的byte数据写入到输出流中。


用途:在多个线程之间需要传递流信息的时候。

 

 SequenceInputStream:表示输入流的逻辑串联,意思就是可以将多个输入流合并在一起,就差不多是存储流的容器。但是可以把它们当作一个流对象来做一些操作,没有对应的输出流对象。

构造方法有两个:一个是需要传入一个实现了Enumeration 接口的对象,还有一个是须传递两个InputStream接口的实例。

 

方法就是四个:available() ,read(), read(byte[],int ,int), clase();

需要注意的是它并不会把所有流对象集都完全合并成一个流对象,只是相当于一个流的集合,一个一个的读取。直到读完所有流对象为止。

 

用途:当需要把多个输出流对象合并在一起操作的时候。

 

FilterInputStream : 所有输入流包装类的父类,如果需要定义自己的输出流包装类,也需要继承这个类。他的构造函数只接受一个InputStream的实例。要包装的也是那个实例。里面的方法覆盖了部分InputStream的方法,但是没有新增方法。

用途:只有当需要自定义一个输出流包装类的时候才继承它,一般不会直接使用它。

 

DataInputStream : FilterInputStream 的 子类,实现了DataInput接口,从而有了能在输入流当中直接读取java基本类型数据的能力。比如readBoolean(),readDouble(),readChar()等等。

用途:当需要在输入流当中直接读取java 基本数据类型的时候使用。

 

BufferedInputStream :FilterInputStream 的 子类,为其他输入流对象提供内存缓冲数组,实现了mark和reset方法的功能。为了更好的效率,建议所有的输出流对象都用此类来包装。

构造函数有两个:一个是传递一个InputStream的实例,另一个在这个基础上多加了个缓存区大小(int)。此类没有多增加方法,而是多了个缓存区而已。

用途:当需要给输入流创建一个内存缓存区时使用,这样可以提高读数据的效率。

 

LineNumberInputStream : FilterInputStream 的 子类,可以获取当前的行号或设置当前行号,已过时。已经被LineNumberReader替代。

用途:获取当前输入流的行数和设置行数。

 

PushbackInputStream : FilterInputStream 的 子类,可以将当前读取的字节数据推回到缓存区,一般用不到的。

用途:未知。

 

ByteArrayInputStream :创建一个内存缓存区,允许程序像操作流一样来操作这个缓存区。

构造函数有两个:一个是传递一个byte[]数组的参数来做为其缓冲区的数组,另一个是指定了这个缓冲数组的开始位置和截取个数。该类实现了mark和reset功能,没有新增加方法。

用途:因为需要接收一个字节数组做为自己的缓冲区,所以可以应用在一些已经存在字节数组,但是读取这个字节数组的方法要和读取流的方式一样的情况下。

 

StringBufferInputStream 已经过时,由StringReader代

替了。


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值