目录
8.转换流(InPutStreamReader与OutPutStreamWriter)
前言
什么是流:流就是数据在数据源与程序之间经历的路径。数据源在程序中就是以流的形式来传输的。
一、文件
1.文件流分为两种:
输入流与输出流
输入流:数据从数据源到程序的路径
输出流:数据从程序到数据源的路径
2.文件流常用的方法:
①创建文件对象的方法:
new File(String str);//根据路径构建一个文件
new File(File file , String str);//根据父目录 + 子路径
new File(String str1 , String ste2);//根据父目录 + 子路径
注:只有使用file的createNewFile() , 才会真正的在磁盘中创建文件。
②获取文件的相关信息的常用方法:
file.getName();//获取文件名
file.exists();//查看文件是否存在
file.getAbsolutePath();//获取文件的绝对路径
file.length();//查看文件字节大小
file.getParent();//获取文件的父目录
③目录的创建与删除
file.mkdir();//创建一级目录
file.mkdirs();//创建多级目录
file.delete();//删除目录或文件
二、IO流
1.概念
1)IO是InPut/OutPut的缩写,用于处理数据的传输(网络通讯,文件传输...)
2)Java程序中,对于数据的传输操作的以流(Stream)的方式进行的
3)java.io这个包提供了各种流的接口和类,用以获取不同种类的数据,并通过方法输入或输出数据
4)输入InPut:读取外部数据(磁盘,数据库等)到程序中
5)输出OutPut:将程序中的数据传输到外部存储设备中(磁盘,数据库等)
2.抽象基类
抽象基类 | 字节流 | 字符流 |
输入流 | InPutStream | Reader |
输出流 | OutPutStream | Writer |
注:Java的IO流涉及40多个类,每个子类的都是从上面四个基类中派生的,并且子类的名称都是用其父类名作为后缀。
3.字符流与字节流
字符流:按字符来操作,常用来处理文本文件(字符输入流与字符输出流)
字节流:按字节来操作,用户来处理音频图片等文件(字节输入流与字节输出流)
4.文件流(File)
①文件输入流
字节文件输入流:FileInPutStream
字符文件输入流:FileReader
②文件输出流
字节文件输出流:FileOutPutStream
注:使用FileOutPutStream(String name,boolean append)创建方式,追加内容时,会在已有内容后追加新的内容
使用FileOutPutStream(String name)创建方式,追加内容时,新内容会覆盖原有内容
字符文件输出流:FileWriter
常用方法:
char[] chars = {'a', 'b', 'c'};
FileWriter fileWriter = new FileWriter(filePath, true);
//write(int) 写入单个字符
fileWriter.write('H');
//write(char[]) 写入指定数组
fileWriter.write(chars);
//write(char[] , off , len) 写入指定数组的指定部分
fileWriter.write("苏州".toCharArray(), 0, 1);
//write(String) 写入字符串数组
fileWriter.write(" 杭 州");
//write(String , off , len) 写入字符串的指定部分
fileWriter.write("上海 , 天津", 0, 2);
fileWriter.close();
5.缓冲流(Buffered)
缓冲流也叫处理流
例如:BufferedWriter就可以对Writer进行包装(其他三种同理)
BufferedOutPutStream,实现了缓冲的输出流,可以将多个字节写入到底层输出流中,从而避免每次写入都调用底层系统。
6.对象流(Object)(序列化与反序列化)
①概念
1)在保存数据的同时,还需要保存数据的值和数据类型,就需要用到对象流,且这个过程就是序列化,反序列化是在恢复数据的时候,将数据的值和数据类型一同恢复。
2)需要让某个对象支持序列化机制,则必须让该类实现可序列化(实现两个接口其一即可):
Serializable // 这是一个标记接口,其中并没有方法(推荐使用)
Externalizable // 该接口有方法需要实现
②功能
提供了对基本类型或者对象类型的序列化和反序列化的方法
ObjectInPutStream: 提供了反序列化的功能
ObjectOutPutStream: 提供了序列化的功能
③注意事项
1)读写的顺序一定要一致
2)要实现序列化或者反序列化对象,需要实现Serializable(Externalizable)接口
3)序列化的类中建议添加serialVersionUID,为了提高版本的兼容性
4)序列化对象时,默认将其所有属性都序列化,但除了Static(静态)与transient(临时)
5)序列化对象时,要求其属性类型也实现序列化
6)序列化具有继承性,其父类实现了序列化接口,其子类也默认实现了序列化
7.标准输入流与标准输出流
类型 | 默认设备 | ||
System.in | 标准输入 | InPutStream | 键盘 |
System.out | 标准输出 | PrintStream | 显示器 |
注:System.out 可以使用setOut() 修改输出路径
8.转换流(InPutStreamReader与OutPutStreamWriter)
1)InPutStreamReader:是Reader的子类,可以将InPutStream(字节输入流)转换成 Reader(字符输入流)
2)OutPutStreamWriter:是Writer的子类,可以将OutPutStream(字节输出流)转换成 Writer(字符输出流)
注:当处理纯文本数据时,如果使用字符流效率更高,并且可以有效解决中文乱码问题,所以在纯文本情况下,建议将字节流转换成字符流。
9.节点流与处理流
①介绍:
1)节点流:可以从一个特定的数据源中读写数据
2)处理流(包装流):是"连接" 已存在的流(包括节点流也包括处理流),为程序提供更强大的读写功能
②区别和联系
1)节点流是底层流,直接和数据源相连
2)处理流包装节点流,可以消除不同节点流的实现差异,也可以提供更方便的方法来完成输出
3)处理流对节点流进行包装,使用了修饰器设计模式,不会直接与数据源相连
③主要体现
例如(BufferedReader和BufferedWriter)
1)性能的提高:主要以增加缓冲的方式来提高输出的效率
2)操作的便捷:处理流可能提供了一系列便捷的方法来一次性输入大量数据,使用更加灵活方便