I是指Input(输入),O是指Output(输出)。
在Java中,文件的输入和输出是通过流(Stream)来实现的,流的概念源于Unix中管道(pipe)的概念。在Unix系统中,管道是一条不间断的字节流,用来实现程序或进程间的通信,或读写外围设备、外部文件等。
一个流,必有源端和目的端,它们可以是计算机内存的某些区域,也可以是磁盘文件,甚至可以是Internet上的某个URL。对于流而言,我们不用关心数据是如何传输的,只需要向源端输入数据,向目的端获取数据即可。
流按照处理数据的单位,可以分为字节流和字符流;按照流向分为输入流和输出流(注意:输入流和输出流都是站在程序的角度参照的)。
一、字节流
(1)InputStream抽象类是所有输入字节流类的直接或间接父类,FileInputStream是其重要子类:
FileInputStream常用构造方法:
1、FileInputStream(File file) :通过File对象创建FileInputStream对象。
2、FileInputStream(String name) :通过文件(非“目录”)路径创建FileInputStream对象。
FileInputStream常用方法:
1、int read():从输入流中读取单个字节的数据;如果已到达文件末尾,则返回 -1。
2、int read(byte[] b):从输入流中将最多b.length个字节的数据读入一个byte数组中,以整数形式返回存入数组中的实际字节个数;如果已到达文件末尾,则返回 -1。
3、void close():关闭此文件输入流并释放与此流有关的所有系统资源。
(2)OutputStream抽象类是所有输出字节流类的直接或间接父类,FileOutputStream是其重要子类:
FileOutputStream常用构造方法:
1、FileOutputStream(File file) :通过File对象创建FileOutputStream对象。
2、FileOutputStream(String name) :通过文件(非“目录”)路径创建FileOutputStream对象。
3、FileOutputStream(File file, boolean append):通过File对象创建FileOutputStream对象;第二个参数如果为true ,则字节将被写入文件的末尾而不是开头。
FileOutputStream常用方法:
1、void write(int b):将指定的单个字节数据写入此文件输出流。
2、void write(byte[] b, int off, int len):将byte数组中从off开始的len个字节写入此文件输出流。
3、void flush():刷新字节输出流并强制写出缓冲内所有字节数据。
4、void close():关闭此文件输出流并释放与此流有关的所有系统资源。
下面一个程序是用IO流将E盘中的一个歌曲文件复制到D盘中创建的另一个文件中:
----设置局部变量缓冲数组bufferArray,read方法会将字节保存到该数组中并返回实际写入bufferArray数组的元素个数,这样减少了循环次数,提高了复制效率。
----在执行完复制的代码后,所创建的fis和fos对象就没有用了,我们就需要将它们释放掉,需要用到.close()方法。
二、字符流
Java虚拟机将字节转化为2个字节的Unicode字符就形成了字符流,字符流用于处理以Unicode字符为单位的文本文件(如记事本文件等)。
(1)Reader抽象类是所有输入字符流类的直接或间接父类, FileReader是其重要子类:
FileReader常用构造方法:
1、FileReader(File file) :通过File对象创建FileReader对象。
2、FileReader(String fileName) :通过文件(非“目录”)路径创建FileReader对象。
FileReader常用方法:
1、int read():从输入流中读取单个字符的数据,如果已到达流的末尾,则返回 -1 。
2、int read(char[] cbuf):从输入流中将最多cbuf.length个字符的数据读入一个char数组中,以整数形式返回存入数组中的实际字节个数,如果已到达流的末尾,则返回 -1 。
3、void close():关闭此文件输入流并释放与此流有关的所有系统资源。
(2)Writer抽象类是所有输出字符流类的直接或间接父类,FileWriter是其重要子类:
FileWriter常用构造方法:
1、FileWriter(File file) :通过File对象创建FileWriter对象。
2、FileWriter(String fileName) :通过文件(非“目录”)路径创建FileWriter对象。
3、FileWriter(File file, boolean append):通过File对象创建FileWriter对象;第二个参数如果为true ,则字节将被写入文件的末尾而不是开头。
FileWriter常用方法:
1、void write(int c):将指定的单个字符数据写入此文件输出流。
2、void write(char[] cbuf, int off, int len):将char数组中从off开始的len个字符写入此文件输出流。
3、void flush():刷新字符输出流缓冲。
4、void close():关闭此文件输出流并释放与此流有关的所有系统资源。
下面的两个代码将桌面上的txt文件复制到了D盘中,操作方法和上面的字节流很相似,后者比前者的效率登高:
缓冲流是一种装饰器类,目的是让原字节流、字符流新增缓冲的功能以提高读取或写入。
缓冲字节输入流:
BufferedInputStream(InputStream in)
缓冲字节输出流:
BufferedOutputStream(OutputStream out)
----缓冲流实现二进制文件复制:
缓冲字符输入流:
BufferedReader(Reader in)
缓冲字符输出流:
BufferedWriter(Writer out)
转换流仅用于将字节流转换成字符流。
InputStreamReader(字节输入流字符输入流):
1、InputStreamReader(InputStream in) :
2、InputStreamReader(InputStream in, String charsetName):
OutputStreamWriter(字节输出流字符输出流):
1、OutputStreamWriter(OutputStream out) :
2、OutputStreamWriter(OutputStream out, String charsetName) :
根据前面所学知识,可以通过字符流或者缓冲字符流实现文本文件的复制,但是这种复制方法有可能会出现乱码,为了解决该问题可以通过字节流+转换流实现文本文件的复制。