2.IO原理和流的分类

Java IO原理

  • I/O是Input/Output的缩写,I/O技术是非常实用的技术,用于处理设备之间的数据传输。如读/写文件,网络通讯等。

  • Java程序中,对于数据的输入/输出操作以"流(stream)"的方式进行。

  • java.io包下提供了各类"流"类和接口,用以获取不同种类的数据,并通过标准的方法输入或者输出数据。

  • 输入input:读取外部数据(磁盘,光盘等存储设备中的数据)到程序(内存)中。

  • 输出output:将程序中的数据输出到磁盘,光盘等存储设备中。

流的分类

  • 按操作数据单位不同分为:字节流(8bit),字符流(16bit)

  • 按数据流的流向分为:输入流输出流

  • 按流的角色的不同分为:节点流处理流

(抽象基类) 字节流 字符流
输入流 inputStream Reader
输出流 OutputStream Writer
  1. Java的IO流共涉及40多个类,世界上非常规则,都是从上面4个抽象基类中派生的。

  2. 由这4个抽象基类派生出来的子类名称都是以父类名作为子类名的后缀。

[图片上传失败...(image-903905-1592743097813)]

  • 节点流:直接从数据源或目的地读写数据。

  • 处理流:不直接连接数据源或目的地,而是"连接"在已存在的流(节点流或处理流)之上,用过对数据的处理为程序提供更为强大的读写能力。

InputStream和Reader

  • InputStream和Reader是所有输入流的基类

  • InputStream(典型实现:FileInputStream)
    • int read()

      从输入流中读取数据的下一个字节。返回0到255范围之间的int字节值。如果因为到达流末尾而没有可用的字节。则返回值-1

    • int read(byte[] b)

      从输入流中将最多b.length个字节的数据读入一个byte数组中。如果因为到达流末尾而没有可用的字节。则返回值-1。否则以整数形式返回实际读取的字节数

    • int read(byte[] b,int off,int len)

      将输入流中最多 len 个数据字节读入 byte 数组。尝试读取 len 个字节,但读取的字节也可能小于该值。以整数形式返回实际读取的字节数。如果因为流位于文件末尾而没有可用的字节,则返回值 -1。

    • public void close() throws IOException

      关闭此输入流并释放与该流有关联的所有系统资源。

  • Reader(典型实现:FileReader)
    • int read()

      读取单个字符。作为整数读取的字符,范围在 0 到 65535 之间 (0x00-0xffff)(2个字节的Unicode码),如果已到达流的末尾,则返回 -1

    • int read(char[] c)

      将字符读入数组。如果已到达流的末尾,则返回 -1。否则返回本次读取的字符数。

    • int(char[] c,int off ,int len)

      将字符读入数组的某一部分。存到数组cbuf中,从off处开始存储,最多读len个字符。如果已到达流的末尾,则返回 -1。否则返回本次读取的字符数。

    • public void close() throws IOException 关闭此输入流并释放与该流关联的所有系统资源。

  • 程序中打开的文件IO资源不属于内存中的资源,垃圾回收机制无法回收该资源,所以应该显式关闭文件IO资源

  • FileinputStream从文件系统中的某个文件中获得输入字节。FileInputStream用于读取非文本数据之类的原始字节流。要读取字符流,需要使用FileReader。

OutputStream 和 Writer

OutputStream 和 Writer 也非常相似:

  • void write(int b/int c);

  • void write(byte[] b/char[] cbuf);

  • void write(byte[] b/char[] buff, int off, int len);

  • void flush();

  • void close(); 需要先刷新,再关闭此流

因为字符流直接以字符作为操作单位,所以 Writer 可以用字符串来替换字符数组,即以 String 对象作为参数

  • void write(String str);

  • void write(String str, int off, int len);

FileOutputStream 从文件系统中的某个文件中获得输出字节。FileOutputStream 用于写出非文本数据之类的原始字节流。要写出字符流,需要使用 FileWriter

OutputStream
  • void write(int b) 将指定的字节写入此输出流。write 的常规协定是:向输出流写入一个字节。要写入的字节是参数 b 的八个低位。b 的 24 个高位将被忽略。 即写入0~255范围的。

  • void write(byte[] b) 将 b.length 个字节从指定的 byte 数组写入此输出流。write(b) 的常规协定是:应该与调用 write(b, 0, b.length) 的效果完全相同。

  • void write(byte[] b,int off,int len) 将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此输出流。

  • public void flush()throws IOException 刷新此输出流并强制写出所有缓冲的输出字节,调用此方法指示应将这些字节立即写入它们预期的目标。

  • public void close() throws IOException 关闭此输出流并释放与该流关联的所有系统资源。

Writer
  • void write(int c) 写入单个字符。要写入的字符包含在给定整数值的 16 个低位中,16 高位被忽略。 即写入0 到 65535 之间的Unicode码。

  • void write(char[] cbuf) 写入字符数组。

  • void write(char[] cbuf,int off,int len) 写入字符数组的某一部分。从off开始,写入len个字符

  • void write(String str) 写入字符串。

  • void write(String str,int off,int len) 写入字符串的某一部分。

  • void flush() 刷新该流的缓冲,则立即将它们写入预期目标。

  • public void close() throws IOException 关闭此输出流并释放与该流关联的所有系统资源。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容