`

java io 学习小结之输入流InputStream

    博客分类:
  • io
 
阅读更多



 

 

 

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

 

流的分类:

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

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

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

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

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

 

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

 

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

 

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

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

 

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

 

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

 

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

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

    close() 关闭流资源,

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

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

   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代

替了。

 

  • 大小: 42.2 KB
  • 大小: 47.8 KB
  • 大小: 91.2 KB
  • 大小: 89.2 KB
分享到:
评论

相关推荐

    Java学习IO流小结--字符流

    ### Java学习IO流小结——字符流 #### 知识点概述 在Java中,处理文件和数据流是一项基本而重要的任务。IO流是Java语言中处理输入/输出的重要工具,它包括字节流和字符流两大类。本文将重点讨论字符流的相关概念...

    java流IO总结

    #### 九、小结 Java I/O系统是Java编程的重要组成部分,通过掌握不同的流类及其使用方法,可以有效地处理文件读写、网络通信等常见的输入输出操作。了解I/O流的基本概念、分类以及常用的类和接口,可以帮助开发者更...

    Java中IO流详解

    Java中IO流详解 Java中IO流详解是指Java语言中负责输入输出操作的类库,主要...小结:Java中IO流详解是一个复杂的知识点,包括字节流、字符流和转换流等几个方面。了解Java中IO流的工作原理和使用方法是非常重要的。

    Java I/O编程 java

    8. 数据流小结: 在Java I/O编程中,理解不同类型的流及其用途至关重要。字节流和字符流分别处理二进制和文本数据,过滤流提供了额外的功能,管道流实现了线程间的通信,对象流使得对象可以持久化。掌握这些基础,...

    java面向对象File (I O)

    Java中有两种基本类型的输入流:`InputStream`(字节流)和`Reader`(字符流)。 - **输出流**(Output Streams):用于将数据写入到目的地。同样有两种基本类型的输出流:`OutputStream`(字节流)和`Writer`(字符...

    Java 网络编程实验报告 含实验总结

    在这个实验中,可能使用了`java.io`和`java.nio`包下的类,如`InputStream`、`OutputStream`、`BufferedReader`和`PrintWriter`等,它们用于在网络连接中接收和发送数据。 2. **Java线程**:在网络编程中,多线程是...

    (超赞)JAVA精华之--深入JAVA API

    - 数据流是 Java 中用于读取和写入数据的基本方式,分为输入流 `InputStream` 和输出流 `OutputStream`。 - **InputStream 方法** - `read()` 方法用于读取单个字节的数据。 - `skip(long n)` 跳过指定数量的...

    JavaJava+EE软件工程师就业求职手册.doc

    - **10.3.2 使用InputStream和OutputStream**:讲解输入输出流的使用方法。 - **10.3.3 常用的文件操作类**:列举文件读写相关的类。 - **10.3.4 掌握过滤IO类**:介绍过滤流的使用方式。 - **10.4 本章小结**:...

    疯狂JAVA讲义

    学生提问:老师,我想学习Java编程,到底是学习Eclipse好呢,还是学习JBuilder好呢? 21 1.9 本章小结 22 本章练习 22 第2章 理解面向对象 23 2.1 面向对象 24 2.1.1 结构化程序设计简介 24 2.1.2 程序的三种...

    java面试题目精选

    - **IO类**:概述了Java中输入输出流的基本概念。 - **InputStream与OutputStream**:介绍了这两种流的基本用法。 - **文件操作类**:列举了一些用于文件操作的重要类。 - **过滤IO类**:讲解了过滤流的作用及其...

    Java中Scanner类的用法

    它在Java 5.0版本被引入,目的是为了简化输入输出控制的过程,相较于传统的输入输出流控制(如`InputStream`和`OutputStream`),`Scanner`类提供了更为简洁、易用的方法来读取基本类型的数据和字符串。 #### 二、...

    16 个有用的的Java工具类(小结)

    * toInputStream:把字符转换为输入流 * readLines:从输入流中读取多行数据,返回 List * copyLarge:同 copy,支持 2GB 以上数据的复制 * lineIterator:从输入流返回一个迭代器,根据参数要求读取的数据量,全部...

    Java_TCPIP_Socket编程

    - **Selector小结**:总结Selector的使用技巧。 - **数据报(UDP)信道**:介绍如何使用UDP Channel进行数据通信。 #### 第6章 深入剖析 这一章进一步探讨了套接字编程的一些高级主题,包括缓冲机制、性能优化、...

    深入浅出Google Android 第9章

    // 输入流对象 FileInputStream in; // TextView对象用于显示结果 TextView tv; // 显示字符串 String display; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate...

Global site tag (gtag.js) - Google Analytics