JAVA IO流简介

1. IO流概述

IO,即in和out,也就是输入和输出,指应用程序和外部设备之间的数据传递,常见的外部设备包括文件、管道、网络连接。

流(Stream),是一个抽象的概念,是指一连串的数据(字符或字节),是以先进先出的方式发送信息的通道。

关于流的特性有下面几点:
1.先进先出:最先写入输出流的数据最先被输入流读取到。
2.顺序存取:可以一个接一个地往流中写入一串字节,读出时也将按写入顺序读取一串字节,不能随机访问中间的数据。(RandomAccessFile除外)
3.只读或只写:每个流只能是输入流或输出流的一种,不能同时具备两个功能,输入流只能进行读操作,对输出流只能进行写操作。在一个数据传输通道中,如果既要写入数据,又要读取数据,则要分别提供两个流。

  • IO流的分类

    • 按照数据的流向

      • 输入流:读数据
      • 输出流:写数据
    • 按照数据类型来分

      • 字节流

        • 字节输入流
        • 字节输出流
      • 字符流

        • 字符输入流
        • 字符输出流
  • IO流的使用场景

    • 如果操作的是纯文本文件,优先使用字符流
    • 如果操作的是图片、视频、音频等二进制文件。优先使用字节流
    • 如果不确定文件类型,优先使用字节流。字节流是万能的流

2. File类

File类介绍

  • 它是文件和目录路径名的抽象表示
  • 文件和目录是可以通过File封装成对象
  • 对于File而言,其封装的并不是一个真正存在的文件,仅仅是一个路径名而已。它可以是存在的,也可以是不存在的。将来是要通过具体的操作把这个路径的内容转换为具体存在的

构造方法

方法名 | 说明

  • File(String pathname) 通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例
    File(String parent, String child) 从父路径名字符串和子路径名字符串创建新的 File实例
    File(File parent, String child) 从父抽象路径名和子路径名字符串创建新的 File实例

File创建与删除功能

方法名 | 说明

  • public boolean createNewFile() 当具有该名称的文件不存在时,创建一个由该抽象路径名命名的新空文件。—— 父路径必须存在,否则会报“系统找不到指定的路径”
    public boolean mkdir() 创建由此抽象路径名命名的目录
    public boolean mkdirs() 创建由此抽象路径名命名的目录,包括任何必需但不存在的父目录
    public boolean delete() 删除此File表示的文件或目录(只能删除空目录)

3. 字节流

  • 字节流抽象基类

    • InputStream:这个抽象类是表示字节输入流的所有类的超类
    • OutputStream:这个抽象类是表示字节输出流的所有类的超类
    • 子类名特点:子类名称都是以其父类名作为子类名的后缀

字节输出流

  • 父类:OutputStream(抽象类)
  • 子类:FileOutputStream;文件输出流用于将数据写入文件

使用字节输入流写数据的步骤

1、创建字节输出流对象(调用系统功能创建了文件,创建字节输出流对象,让字节输出流对象指向文件):FileOutputStream(String name) ,(name表示文件路径)
2、调用字节输出流对象的写数据方法:void write(int b)
3、释放资源(关闭此文件输出流并释放与此流相关联的任何系统资源):void close()

写入数据的三种方式
方法名 | 说明

  • void write(int b) 将指定的字节写入此文件输出流一次写一个字节数据
    void write(byte[ ] b) 将b.length字节从指定的字节数组写入此文件输出流一次写一个字节数组数据
    void wirte(byte[ ] b,int off,int len) 将len字节从指定的字节数组开始,从偏移量off开始写入此文件输出流一次写一个字节数组的部分数据

字节流写数据加异常处理

  • finally:在异常处理时提供finally块来执行所有清除操作。比如说O流中的释放资源
  • 特点:被finally控制的语句一定会执行,除非JVM退出

字节输入流

  • 父类:InputStream(抽象类)
  • 子类:FileInputStream(实现类:从文件系统中的文件获取输入字节)

构造方法

方法名 说明
public FileInputStream(File path) 创建一个字节输入流管道与源文件对象接通
public FileInputStream(String pathName) 创建一个字节输入流管道与文件路径对接

读取方法

方法名 说明
public int read() 每次读取一个字节返回!读取完毕会返回 -1
public int read(byte[] buffer) 从字节输入流中读取字节到字节数组中去,返回读取的字节数量,没有字节可读返回 -1
  • 使用字节输入流读数据的步骤

    • 1、创建字节输入流对象
    • 2、调用字节输入流对象的读数据方法
    • 3、释放资源

字节缓冲流

BufferedInputStream:创建BufferedInputStream将创建一个内部缓冲区数组。 当从流中读取或跳过字节时,内部缓冲区将根据需要从所包含的输入流中重新填充,一次填充字节

BufferedOutputStream:该类实现缓冲输出流。通过设置这样的输出流, 应用程序可以向底层输出流写入字节。

构造方法

方法名 说明
BufferedOutputStream(OutputStream out) 创建字节缓冲输出流对象
BufferedInputStream(InputStream in) 创建字节缓冲输入流对象

4. 字符流

  • 字符流抽象基类

    • Reader:字符输入流的抽象类
    • Writer:字符输出流的抽象类

字符流概述

由于字节流操作中文不是特别的方便,所以Java就提供字符流

字符流 = 字节流 + 编码表

汉字在存储的时候,无论选择哪种编码存储,第一个字节都是负数

编码规则:

128个US-ASCII字符,只需一个字节编码

拉丁文等字符,需要二个字节编码

大部分常用字(含中文),使用三个字节编码

其他极少使用的Unicode辅助字符,使用四字节编码

字符串中的编码解码问题

方法名 说明
byte[] getBytes() 使用平台的默认字符集将该 String编码为一系列字节
byte[] getBytes(String charsetName) 使用指定的字符集将该 String编码为一系列字节
String(byte[] bytes) 使用平台的默认字符集解码指定的字节数组来创建字符串
String(byte[] bytes, String charsetName) 通过指定的字符集解码指定的字节数组来创建字符

字符流中的编码解码问题

  • InputStreamReader:是从字节流到字符流的桥梁

    它读取字节,并使用指定的编码将其解码为字符

    它使用的字符集可以由名称指定,也可以被明确指定,或者可以接受平台的默认字符集

  • OutputStreamWriter:是从字符流到字节流的桥梁

    是从字符流到字节流的桥梁,使用指定的编码将写入的字符编码为字节

    它使用的字符集可以由名称指定,也可以被明确指定,或者可以接受平台的默认字符集

构造方法

方法名 | 说明

  • InputStreamReader(InputStream in) 使用默认字符编码创建InputStreamReader对象
    InputStreamReader(InputStream in,String chatset) 使用指定的字符编码创建InputStreamReader对象
    OutputStreamWriter(OutputStream out) 使用默认字符编码创建OutputStreamWriter对象
    OutputStreamWriter(OutputStream out,String charset) 使用指定的字符编码创建OutputStreamWriter对象

字符输出流

方法名 | 说明

  • void write(int c) 写一个字符
    void write(char[] cbuf) 写入一个字符数组
    void write(char[] cbuf, int off, int len) 写入字符数组的一部分
    void write(String str) 写一个字符串
    void write(String str, int off, int len) 写一个字符串的一部分

    关闭和刷新的方法

方法名 说明
flush() 刷新流,之后还可以继续写数据
close() 关闭流,释放资源,但是在关闭之前会先刷新流。一旦关闭,就不能再写数据

字符缓冲流

BufferedReader:从字符输入流读取文本,缓冲字符,以提供字符,数组和行的高效读取,可以指定缓冲区大小,或者可以使用默认大小。默认值足够大,可用于大多数用途

BufferedWriter:将文本写入字符输出流,缓冲字符,以提供单个字符,数组和字符串的高效写入,可以指定缓冲区大小,或者可以接受默认大小。默认值足够大,可用于大多数用途

构造方法

方法名 说明
BufferedWriter(Writer out) 创建字符缓冲输出流对象
BufferedReader(Reader in) 创建字符缓冲输入流对象

字符缓冲流特有功能

BufferedWriter:

方法名 说明
void newLine() 写一行行分隔符,行分隔符字符串由系统属性定义

字符缓冲流特有功能

BufferedWriter:

方法名 说明
void newLine() 写一行行分隔符,行分隔符字符串由系统属性定义

5. IO流小结

JAVA IO流简介_第1张图片

6. 特殊流

标准输入输出流

标准输入流

System类中有两个静态的成员变量:
public static final InputStream in:标准输入流,通常该流对应于键盘输入或由主机环境或用户指定的另一个输入源
public static final PrintStream out:标准输出流,通常该流对应于显示输出或由主机环境或用户指定的另一个输入源

标准输出流

  • 输出语句的本质:是一个标准的输出流

    • PrintStream ps = System.out;
    • PrintStream类有的方法,System.out都可以使用

打印流

  • 打印流分类:

    • 字节打印流:PrintStream
  • 字符打印流:PrintWriter
  • 打印流特点:

    • 只负责输出数据,不负责读取数据
    • 有自己特有方法

对象操作流

对象序列化:就是将对象保存到磁盘中,或者在网络中传输对象

这种机制就是使用一个字节序列表示个对象,该字节序列包含:对象的类型、对象的数据和对象中存储的属性等信息字节序列写到文件之后,相当于文件中持久保存了一个对象的信息

反之,该字节序列还可以从文件中读取回来,重构对象,对它进行反序列化

  • 要实现序列化和反序列化就要使用对象序列化流和对象反序列化流:

    • 对象序列化流: ObjectOutputStream
    • 对象反序列化流:ObjectInputStream

你可能感兴趣的:(javaio)