首页技术文章正文

IO流、字节流和字符流分别是什么?

更新时间:2020-07-24 来源:黑马程序员 浏览量:

一:IO流的分类

  1)按流向分:

  输入流:读取数据,把持久设备的数据读取到内存中。

  输出流:写出数据,把内存的数据写出到持久设备。

  2)按数据类型分:

  计算机中一切数据都是:字节数据。

  字符数据:底层还是字节数据,但是可以根据某些规则,把字节变成人们认识的文字、符号等等。

  字节流:数据在持久设备上都是以二进制形式保存的。二进制就是字节数据。Java就给出了字节流可以直接操作字节数据。

  字节输入流:InputStream

  子类:FileInputStream

  字节输出流:OutputStream

  子类:FileOutputStream

  字符流:读取字符数据。数据在设备上是以二进制形式表示,但是有些二进制合并在一起可以表示一些字符数据。

  字符输入流:Reader

  子类:FileReader

  字符输出流:Writer

  子类:FileWriter

  注意:

  1)字节流可以对任意类型的文件按照字节进行读和写的操作;例如:图片、视频、文本文件、word文档、mp3等。

  2)字符流只能对文本类型的文件进行操作;例如:.java文件、.txt等文件。

二:字节流

  1)字节输出流 OutputStream

  public void close() :关闭此输出流并释放与此流相关联的任何系统资源。

  public void write(byte[] byte):把这个byte字节数组中的所有数据写到关联的设备中(设备包括文件、网络或者其他任何地方)。

  public void write(byte[] b, int off, int len) :把b字节中的数据从下标off位置开始往出写,共计写len个。

  public abstract void write(int b) : 把这个b数据写到关联的设备中。

  注意:close方法,当完成流的操作时,必须调用此方法,释放系统资源。

  2)字节输入流 InputStream

  public void close() :关闭此输入流并释放与此流相关联的任何系统资源。

  public abstract int read(): 调用一次read,就可以从关联的文件中读取一个字节数据,并返回这个字节数据。方法可以从关联的文件中读取数据。所有read方法如果读取到文件的末尾,都会返回-1。遇到-1就代表文件中的数据已经被读取完毕。

  public int read(byte[] byte):调用一次,读取多个字节数据,把读到的字节数据保存在传递的byte字节数组中。返回字节数组中读取的字节个数。注意:这个返回值不是数组长度。

  注意:close方法,当完成流的操作时,必须调用此方法,释放系统资源。

三:字符流

  1)字符输入流 Reader

  public void close() :关闭此流并释放与此流相关联的任何系统资源。

  public int read(): 调用一次读取一个字符,返回字符的编码值。即读取的内容存放到返回值中。如果读取到文件末尾返回-1;

  public int read(char[] chs):调用一次读取多个字符,把这些字符保存在chs中,返回给字符数组中存储的字符个数,如果读取到文件末尾返回-1;

  注意:虽然读取了一个字符,但是会自动提升为int类型。

  2)字符输出流 Writer

  public abstract void close() :关闭此输出流并释放与此流相关联的任何系统资源。

  public abstract void flush() :刷新此输出流并强制任何缓冲的输出字符被写出。

  public void write(int b) :写出一个字符。

  public void write(char[] chs):将字符从指定的字符数组写出此输出流。

  public abstract void write(char[] b, int off, int len) :从指定的字符数组写出 len字符,从偏移量 off开始输出到此输出流。

  public void write(String str) :写出一个字符串。

  说明:字符输入和字符输出流都是自带缓冲区的。缓冲区就是在类的底层封装了一个数组,如果我们使用字符输出流向目的地文件中写数据的时候,数据不会立刻写到目的地文件中,而是写到自带的数组中,数据还在内存中,所以我们必须调用FileWriter类中的刷新方法flush将数组中的数据刷新到目的地硬盘文件中。

  注意:

  1. 虽然参数为int类型四个字节,但是只会保留一个字符的信息写出。

  2. 未调用close方法,数据只是保存到了缓冲区,并未写出到文件中。


猜你喜欢:
  
Java高级软件工程师课程

  什么是敏捷开发?十分钟了解 

  两种常用的动态代理方式 



分享到:
在线咨询 我要报名
和我们在线交谈!