IO流 I input 输入 O Output 输出 流:Stream是一种抽象的概念,是对数据传输的总称, 也就是说数据在设备直接进行传输就称为流。流的本质是数据传输。 IO流就是用来处理设备之间的传输问题的,比较常见的应用:文件上传、文件下载、文件复制 基础流: IO流的分类: 按照流向分类 输入流:读数据 输出流:写数据 按照流的数据类型分类: 字节流 字节输入流 字节输出流 字符流 字符输入流 字符输出流 IO流的使用场景 如果操作的是纯文本文件,优先使用字符流 如果操作的是图片、视频、音频、有格式文本等等二进制文件,那么一定要使用字节流。 如果操作的文件类型不确定,优先使用字节流。 字节流: 字节流基类(父类): InputStream 这个抽象类是所有字节输入流类的父类 OutputStream 这个抽象类是所有字节输出流类的父类 文件字节输入流:FileInputStream 是InputStream的子类,专门用来做文件的输入操作 它操作文件数据的方法:read() 文件字节输出流:FileOutputStream 是OutputStream的子类,专门用来做文件的输出操作 它操作文件数据的方法:write() write(int b) 写入一个字节 write(byte[] bytes) 写入一个字节数组 write(byte[] bytes,int off,int len) 写入一个字节数组,从off开始写入len长度个字节。 //Windows系统换行 \r\n 案例: 结合23种设计模式中的模板模式,实现如下操作: 调用该方法并传入参数后,会在D盘中创建《title》.txt文件,并在文件中自动写出文章。 public static boolean AutoWriting(String title){ return true; } -[模板设计模式] 把抽象类整体看成一种模板,模板种不能决定的东西都定义为抽象方法。 让使用模板的类(继承抽象类的类),去重写抽象方法,自己实现需求。 模板设计模式的优势: 模板已经定义了通用的结构,使用的人只需要关心自己要实现的功能就可以了。 abstract class 作文模板类{ public void write(){ System.out.println("《我的爸爸》"); body(); System.out.println("啊~这就是我的爸爸!"); } public abstract void body(); } 处理流: 基于基础流进行的强化,比如缓冲流。因为是对基础流的强化,所以创建处理流的时候,构造方法的参数是基础流对象 字节缓冲流 |-字节缓存输入流 BufferedInputStream new BufferedInputStream(new FileInputStream()); |-字节缓存输出流 BufferedOutPutStream 字符缓冲流 字符流: 字符流=字节流+字符编码表 字符编码表--字符集 字符集是一个系统支持的所有字符的集合,包括各个国家的文字、标点符号、图形符号、数字等等 计算机想要准确的存储和识别各种字符集符号,就需要进行字符编码,一套字符集必须要有一套编码表。 常见的字符集:ASCII字符集,GB-XXXX字符集 Unicode字符集 把字符串转换为字节的方法: byte[] getBytes(); 使用平台默认的字符集把String类型字符串转换为一系列字节。 byte[] getBytes(String charsetName); 使用指定的字符集把String类型字符串转换为一系列字节。 new String(byte[] bytes); 使用平台默认的字符集把一系列字节转换为String类型字符串 new String(byte[] bytes,charsetName);使用指定的字符集把一系列字节转换为String类型字符串 字符流: 输入字符流-抽象类 Reader |-文件输入字符流 FileReader |-构造方法: |- new FileReader(File file) |- new FileReader(String fileName) |-成员方法: |- int read() 一次读取一个字符数据 |- int read(char[] cbuf) 一次读取一个字符数组数据 输出字符流-抽象类 Writer |-文件输出字符流 FileWriter |-构造方法: |- new FileWriter(File file) |- new FileWriter(File file,boolean append) |- new FileWriter(String pathName) |- new FileWriter(String pathName,boolean append) |-普通方法: |- void write(int c) 写一个字符 |- void write(char[] cbuf) 写一个字符数组 |- void write(String str) 写一个字符串 |- void write(String str,int off,int len) 写一个字符串的一部分 |- flush() 刷新流,刷新后还可以继续写数据。 |- close() 关闭流 案例需求: 用户注册 - 编写方法代码,实现用户的用户名和密码保存到本地实现永久化存储 public static boolean registerUser(String username,String password){ return false; } - 实现步骤 - 获取用户输入的用户名和密码 - 将用户输入的用户名和密码写入到本地文件中 - 关流,释放资源 处理流: 基于基础流进行的强化,比如缓冲流。因为是对基础流的强化,所以创建处理流的时候,构造方法的参数是基础流对象 字符缓冲流 |- 字符缓冲输入流 BufferedReader |-特有方法:String readLine() 读取一行文字,结果包含行的内容的字符串,不包含任何终止字符,如果已经到达流的结尾,则为null。 |- 字符缓冲输出流 BufferedWriter |-特有方法:void newLine() 写一行行分隔符,行分隔符字符串有系统属性定义。