IO流

java流类结构图

IO

概念

  • 在工作中,经常会操作磁盘上的资源,这个过程中实现了数据的输入和输出操作,磁盘上的文件和内存之间进行交互,数据的交互需要有一个媒介或者管道,把这个媒介或者管道就称为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("复制完成");
}
  • 注意:如果复制的文件是文本文件 ,用字节流和字符流都可以
  • 如果复制的文件是图片、音乐、电影, 使用字节流


转载请注明:Memory的博客 » 点击阅读原文

打赏一个呗

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦