java流类结构图
概念
- 在工作中,经常会操作磁盘上的资源,这个过程中实现了数据的输入和输出操作,磁盘上的文件和内存之间进行交互,数据的交互需要有一个媒介或者管道,把这个媒介或者管道就称为IO流,也被称为输入输出流【I:Input O:Output】
- 输入:从外部存储设备到内存叫输入、读取。
- 输出: 从内存到外部存储设备叫输出、写入。
流的作用和原理
- 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作。
IO流的种类
- 按照流的流向分:输入流、输出流
- 输入流:表示将数据读取到java程序(内存)中使用的流。
- 输出流:表示从java程序(内存)向外传输使用的流
- 按照处理数据单位分:字节流、字符流
- 字节流:一次性传输一个字节数据,将数据以字节的形式传输。
- 字符流:一次性传输一个字符数据,将数据以字符的形式传输。
- 按照功能分:节点流、处理流
- 节点流:可以从或向一个特定的地方(节点)读写字节数据。
- 处理流:是对一个已存在的流的连接和封装,通过所封装的流的功能调用实现数据读写。
字节输入流
InputStream类
- InputStream是一个抽象类,不能实例化对象。
方法名 描述 void close() 关闭此输入流并释放与该流关联的所有系统资源。 int read() 从输入流中读取数据的下一个字节。 int read(byte[] b) 从输入流中读取一定数量的字节,并将其存储在缓冲区数组b中。 int read(byte[] b,int off, int len) 将输入流中最多len个数据字节读入 byte 数组。
文件输入流FileInputStream
- 下面有代码案例
字节输出流
OutputStream类
- OutputStream是抽象类,不能实例化对象。
方法名 描述 void close() 关闭此输出流并释放与此流有关的所有系统资源。 void flush() 刷新此输出流并强制写出所有缓冲的输出字节。 void write(byte[] b) 将 b.length 个字节从指定的 byte 数组写入此输出流。 void write(byte[] b,int off, int len) 将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此输出流。 void write(int b) 将指定的字节写入此输出流。
文件输出流FileOutputStream
- 下面有代码案例
字符输入流
Reader类
- Reader:是所有字符输入流的父类,为一个抽象类,不能实例化对象,使用它的子类
FileReader
类
字符输出流
- Writer:是所有字符输出流的父类,为一个抽象类,不能实例化对象,使用它的子类
FileWriter
类
代码案例
边读边写
// 1 使用字节流复制文件 public static void copy1() throws Exception{ //1创建字节文件输入输出流 InputStream is=new FileInputStream("d:\\003.jpg"); OutputStream os=new FileOutputStream("d:\\004.jpg"); //2读、写 byte[] buf=new byte[1024*4]; int len=0; while((len=is.read(buf))!=-1){ //buf缓冲区,0从第一个位置写,len写的长度 os.write(buf,0,len); } //3关闭 is.close(); os.close(); System.out.println("复制完成"); }
使用字符流复制文件
//2使用字符流复制文件 public static void copy2() throws Exception{ //1创建字符输入输出流 Reader reader=new FileReader("d:\\003.jpg"); Writer writer=new FileWriter("d:\\005.jpg"); //2读写 char[] buf=new char[1024*4]; int len=0; while((len=reader.read(buf))!=-1){ writer.write(buf, 0, len); } //3关闭 reader.close(); writer.close(); System.out.println("复制完成"); }
- 注意:如果复制的文件是文本文件 ,用字节流和字符流都可以
- 如果复制的文件是图片、音乐、电影, 使用字节流