一、写在开头
在计算机领域中百分之九十以上的程序拥有着和外部设备交互的功能,这就是我们常说的IO(Input/Output:输入/输出),所谓输入就是外部数据导入计算机内存中的过程,输出则是将内存或者说程序中的数据导入到外部存储中,如数据库、文件以及其他本地磁盘等。
二、什么是IO流
这种输入输出往往遵循着先入先出,顺序存取的特点,像水流一般,因此我们称这样的操作为流(Stream),如下我们根据不同的标准,将IO流分为几个门类:
根据数据流向:
- 输入流:数据流向程序
- 输出流:数据从程序流出。
根据处理单位:
- 字节流:一次读入或读出是8位二进制;
- 字符流:一次读入或读出是16位二进制
- JDK 中后缀是 Stream 是字节流;后缀是 Reader,Writer 是字符流。
根据功能点:
- 节点流:直接与数据源相连,读入或写出;
- 处理流:与节点流一块使用,在节点流的基础上,再套接一层。
三、输入与输出
在java.io包中多达40多个类,它们的基类来源于InputStream、OutputStream、Reader、Writer这四个,我们一一看过。
3.1 InputStream(字节输入流)
InputStream作为所有字节输入流的父类,主要作用是将外部数据读取到内存中,主要方法如下(JDK8):
- read():返回输入流中下一个字节的数据。返回的值介于 0 到 255 之间。如果未读取任何字节,则代码返回 -1 ,表示文件结束。
- read(byte b[ ]) : 从输入流中读取一些字节存储到数组 b 中。如果数组 b 的长度为零,则不读取。如果没有可用字节读取,返回 -1。如果有可用字节读取,则最多读取的字节数最多等于 b.length , 返回读取的字节数。这个方法等价于 read(b, 0, b.length)。
- read(byte b[], int off, int len):在read(byte b[ ]) 方法的基础上增加了 off 参数(偏移量)和 len 参数(要读取的最大字节数)。
- skip(long n):忽略输入流中的 n 个字节 ,返回实际忽略的字节数。
- available():返回输入流中可以读取的字节数。
- close():关闭输入流释放相关的系统资源。
- markSupported() :该输入流是否支持mark()和reset()方法。
- mark(int readlimit) :标志输入流的当前位置,随后调用reset()方法将该流重新定位到最近标记的位置;参数readlimit表示:在标记位置失效前可以读取字节的最大限制。
- reset() :将此流重新定位到最后一次对此输入流调用 mark 方法时的位置。
我们使用FileInputStream(文件字节输入流)进行如上方法的使用测试:
public class Test {public static void main(String[] args) throws IOException {try (InputStream fis = new FileInputStream("E:\\input.txt")) {System.out.println("可读取字节数:"+ fis.available());