java的io有一个比较不容易理解的就是流的方向问题,到底输入流和输出流是怎么个概念,这个入和出到底有什么不同?以最常见的文件流和不太常见的字节数组流为例进行解释
文件输入输出流
输入流
- 将文件读入到内存(这个内存就是流)中,构造器以File作为参数,读取文件的时候就是读取这个文件
1 | FileInputStream in = new FileInputStream(file); |
- 具体的读取文件的操作,因为从File肯定是具有一定大小的,所以读入内存的时候需要知道当前读入的多少,一旦读入的返回之为-1,说明File中的内容都被读取完成了
- 因为需要读取到内存中,所以需要一个字节数组来存储读入的内容,这个字节数组b是一个临时的数组,每次从文件中读取b的长度的内容放到b中,然后b中的内容就可以随意处理了,当读取完成时,read方法的返回值为-1
1 | byte[] b = new byte[1024]; |
输出流
- 将内存中的内容写出到文件,构造器以File为参数
1 | FileOutputStream output = new FileOutputStream(file); |
- 具体写出到文件的操作,需要将内存中的字节数组的内容写出到文件中
1 | byte[] b = new byte[1024]; |
字节数组输入输出流
输入流
- 将字节数组读入到内存中,构造器参数是一个字节数组,进行读取操作的时候,就是读这个自己数组
1 | byte[] b = new byte[1024]; |
- 具体的读取操作,每次读取一定量的数据到内存中,所以需要一个字节数组来存放每次读取的对象,需要知道什么时候目标内存数组被读取完成了,所以读取方法需要有返回值,返回-1的时候表示目标自己数组被读取完了
1 | byte[] b = new byte[1024]; |
输出流
- 将内存中的字节数组输出到另外一个字节数组,这里跟文件的输出流有一个区别,文件的输出流需要指定需要输出的File作为文件输出流的构造器参数,但是字节数组输出流不需要这样一个外部的东西,字节数组输出流内部有这样一个字节数组作为输出的目标对象
1 | ByteArrayOutputStream out = new ByteArrayOutputStream(); |
- 具体的写出操作,将内存中的自己数组写出到目标自己数组,目标字节数组在字节数组输出流内部维护
1 | byte[] b = new byte[1024]; |
- 获取最终输出到的字节数组,因为维护在字节数组输出流内部,所以必须通过字节数组输出流来获取
1 | out.toByteArray(); |