流的概念:
- 流是字节序列的抽象概念。
- 文件是数据的静态存储形式,而流是指数据传输时的形态。
- 流类分为两个大类:节点流类和过滤流类(也叫处理流类)。
InputStream类
程序可以从中连续读取字节的对象叫输入流,在JAVA中,用InputStream类来描述所有输入流的抽象概念。FileInputStream类是InputStream类的.
InputStream类的方法:
- int read() 从输入流中读取一个字节的内容,并且把这个内容以整数的形式返回。如果碰到流的结束处,那么返回的值就是“-1”;如果流没有结果,但临时没有数据可读,那read方法就将阻塞运行程序的执行过程,至到流中有新的数据可读。(流可以看做是一个通道)read方法将读取的每一个字节复制到int类型(int类型占用4个字节)中的最低字节,其他高字节的部份全部设置为零.
- int read(byte[] b) 用于从输入流读取若干个字节的内容到字节数组b中,最多读取的字节个数就是这个字节数组的长度,由于这个流中不一定有这么多的字节可读,
- int read(byte[] b,int off,int len) 这每次读取len个字节,并放入到字节数组b中,并且是以角标为off的位置依次放入。那么实际上读取的个数以返回值为准。
- long skip(long n) 跳过输入流中的n个字节,并返回实际跳过的字节数。这个方法主要用于包装流中,包装类中流可以跳跃,一般的低层流不能跳跃.
- int available() 返回当前输入流中可读的字节数,在使用时我们可以先用available方法来判断流中是否有可读数据,再用read方法进行读取,这样可以防止程序发生阻塞.(但一般我只使用read方法直接来读取)
- void mark(int readlimit) 在输入流中建立一个标记,readlimit表示在建立标记地方开始最多还能读取多少个字节的内容。(用于包装类的方法)
- void reset() 与mark方法配合使用,用mark方法在a 处做标记后再读取b个字节并调用reset方法,当下次再读时就从a的地方开始读取。(reset方法是让指针回到以前做的标记处)
- boolean markSupported() 返回当前流对象是否支持mark和reset操作
- void close()
用于完成一个流的所有操作以后,关闭这个流,放弃与这个流相关的所有资源。
InputStream是抽象类,程序中实际使用的是InputStream的各种子类对象,不是所有的子类都会支持InputStream中定义的某些方法。比如skip,mark,reset在节点流中不适用,它们是用于包装输入流。
OutputStream类
程序可以向其中连续写入字节的对象叫输出流,在JAVA中,用OutputStream类来描述所有输出流的抽象概念。FileOutputStream类是OutputStream类的子类。
OutputStream类的方法:
- void write(int b) 将一个整数中的最低一个字节中的内容写到输出流中,高字节部份被弃。
- void write(byte[] b) 将字节数组中的所有内容写入到输出流对象中。
- void write(byte[] b,int off,int len) 将字节数组b中从off位置开始的len个字节写入到输出流对象中.
- void flush() 将内存缓冲区的内容完全清空,新输出到IO设备当中。
- void close() 关闭输出流对象。