在计算机编程中,流就是一个类的对象,很多文件的输入输出操作都以类的成员函数的方式来提供。流其实是一种信息的转换,它是一种有序流,对象间进行信息或者数据的交换时总是先将对象或数据转换为某种形式的流,再通过流的传输,到达目的对象后再将流转换为对象数据。因此可以把流看成是一种数据的载体,通过它可以实现数据交换和输出。

Java中的IO流可以分为字节流和字符流。

字节流:

字节输入流 InputStream

1. FileInputStream 操作文件的字节输入流
2. BufferedInputStream 高效的字节输入流
3. ObjectInputStream 反序列化流

字节输出流 OutputStream

1. FileOutputStream 操作文件的字节输出流
2. BufferedOutputStream 高效的字节输出流
3. ObjectOutputStream 序列化流
4. PrintStream 字节打印流

字符流:

字符输入流 Reader

1. FileReader 操作文件的字符输入流
2. BufferedReader 高效的字符输入流
3. InputStreamReader 输入操作的转换流(把字节流封装成字符流)

字符输出流 Writer

1. FileWriter 操作文件的字符输出流
2. BufferedWriter 高效的字符输出流
3. OutputStreamWriter 输出操作的转换流(把字节流封装成字符流)
4. PrintWriter 字符打印流

向文件中写入数据的过程

1. 创建输出流对象
2. 写数据到文件
3. 关闭输出流

从文件中读数据的过程

1. 创建输入流对象
2. 从文件中读数据
3. 关闭输入流

文件复制的过程

1. 创建输入流(数据流)
2. 创建输出流(目的流)
3. 从输入流中读数据
4. 通过输出流,把数据写入目的地
5. 关闭流

字节输出流OutputStream与输入流InputStream

OutputStream是抽象类,用于表示输出字节流的所有类的超类,操作的数据都是字节。FileOutputStream类用于来写入数据到文件

File file = new File("c:\\file.txt");
//创建一个用于操作文件的字节输出流对象。一创建就必须明确数据存储目的地。
//输出流目的是文件,会自动创建。如果文件存在,则覆盖。

FileOutputStream fos = new FileOutputStream(file);
//调用父类中的write方法。

byte[] data = "abcde".getBytes();
fos.write(data);
//关闭流资源。
fos.close();

若想在原有的文件中继续写入内容,可以在FileOutputStream的构造函数中,加入一个boolean类型的值,如果值true,就会在文件末位继续添加。对于文件写入过程中发生的异常,可以使用try......catch.......finally体系来进行解决。

InputStream中也有很多子类,FileInputStream从文件系统中的某个文件中获得输入字节。对于读取文件中的数据时,可以调用read方法,弊端在于一次只能读取一个,过于麻烦。可以定义一个数组来作为临时的存储容器来重载read方法。

File file = new File("c:\\file.txt");
// 创建一个字节输入流对象,必须明确数据源,其实就是创建字节读取流和数据源相关联。
FileInputStream fis = new FileInputStream(file);		
//创建一个字节数组。
byte[] buf = new byte[1024];//长度可以定义成1024的整数倍。		
int len = 0;
while((len=fis.read(buf))!=-1){
	System.out.println(new String(buf,0,len));
}
fis.close();

字符输入流Reader和字符输出流Writer

字节流读取字符时有时会出现乱码的问题,比如一些中文字符。FileReader和FileWriter可用于读写取字符文件的便捷类,默认字符编吗和默认字节缓冲区大小都是适当的。