IO流分为
字符流 能操作所有类型的文件 但中文会出现乱码
FileOutputStream 字符输出流 是将数据从内存传输到硬盘的
方法 write();写数据
一次可以写一个字节,或一个字节数据,或字节数据其中的部分数据
close(); 释放资源 关闭流。
创建 new FileOutputStream(字符串类型 文件路径名);
FileInputStream 字符输入流 是将数据从硬盘传输到内存的
方法 read();读数据
返回的是读入缓冲区的总字节数,也就是实际的读取字节个数
输入流的结尾已经到达,则为-1
一次可以读一个字节,或一个字节数据,或字节数据其中的部分数据
创建 new FileInputStream(字符串类型 文件路径名);
字节缓冲输出流
BufferedOutputSream; 设置缓冲流,应用程序可以向底层输出流写入字节,这样就不回去调用底层,节约底层资源减少对底层系统的调用
字节缓冲输入流
BufferedInputStream; 他会在内部创建缓冲区数组,当从流中读取或跳过字节时,内部缓冲区将根据需要从所包含的输入流中重新填充,一次很多字节。提高数据读取效率。
创建字节缓冲流
new BufferedOutputSream(new FileOutputSream(String类型 的 文件路径名))
缓冲字节输出流
new BufferedInputSream(new FileInputSream(String类型 的 文件路径名))
缓冲字节输入流
字符流 他底层是 字节流+字符集
FileWrite 字符输出流 FileRead 字符输入流
创建格式
new FileWriter(String类型 的 文件路径名,也可以通过 new File()创建)存数据的
写数据 writer();
一次可以写 一个字符 、一个字符数组,字符数组中的一部分
也可以是 一个字符串、一个字符串中的一部分
void write(char[] cbuf, int off, int len)
new FileRead(String类型 的 文件路径名,也可以通过 new File()创建)不存数据的
read();读数据结果包含行的内容的字符串,不包括任何行终止字符输入流的结尾已经到达,则为-1
一次可以读 一个字符 、一个字符数组,字符数组中的一部分
int read(char[] cbuf);
flush();涮新数据,刷新后还可以写数据
close();关闭流
字符缓冲流
BufferedWriter 字符缓冲输出流
创建格式 new BufferedWriter(new FileWriter(”文件路径名”));
文件路径名存在就写入,不存在就创建新的文件写入保存
BufferedRead 字符缓冲纯输入流
创建格式 new BufferedRead(new FileRead(“文件路径名”)
文件存在就读取,不存在就不读
-
BufferedWriter:将文本写入字符输出流,缓冲字符,以提供单个字符,数组和字符串的高效写入,可以指定缓冲区大小,或者可以接受默认大小。默认值足够大,可用于大多数用途
-
BufferedReader:从字符输入流读取文本,缓冲字符,以提供字符,数组和行的高效读取,可以指定缓冲区大小,或者可以使用默认大小。 默认值足够大,可用于大多数用途
字符缓冲流特殊功能
void newLine(); 写数据时的换行 bw.newLine();
String readline(); 一次读一行文字,结果包含行的内容的字符串,不包括任何行终止字符输入流的结尾已经到达,则为null
转换流 作用 -----------》字符流中和编码解码问题
InputStreamReader(InputStream in)
使用默认字符编码创建InputStreamReader对象
InputStreamReader(InputStream in,String chatset)
使用指定的字符编码创建InputStreamReader对象
OutputStreamWriter(OutputStream out)
使用默认字符编码创建OutputStreamWriter对象
OutputStreamWriter(OutputStream out,String charset)
使用指定的字符编码创建OutputStreamWriter对象
-
InputStreamReader:是从字节流到字符流的桥梁,父类是Reader
它读取字节,并使用指定的编码将其解码为字符
它使用的字符集可以由名称指定,也可以被明确指定,或者可以接受平台的默认字符集 -
OutputStreamWriter:是从字符流到字节流的桥梁,父类是Writer
是从字符流到字节流的桥梁,使用指定的编码将写入的字符编码为字节
它使用的字符集可以由名称指定,也可以被明确指定,或者可以接受平台的默认字符集
字符集 ---------》 是一个系统支持的所有字符的集合
常见的字符集
ASCII字符集:
GBXXX字符集:GBK:最常用的中文码表。
Unicode字符集:UTF-8编码:可以用来表示Unicode标准中任意字符
lASCII:是基于拉丁字母的一套电脑编码系统,用于显示现代英语,主要包括控制字符(回车键、退格、换行键等)和可显示字符(英文大小写字符、阿拉伯数字和西文符号)
基本的ASCII字符集,使用7位表示一个字符,共128字符。ASCII的扩展字符集使用8位表示一个字符,共256字符,方便支持欧洲常用字符。是一个系统支持的所有字符的集合,包括各国家文字、标点符号、图形符号、数字等
GBK:最常用的中文码表。是在GB2312标准基础上的扩展规范,使用了双字节编码方案,共收录了21003个汉字,完全兼容GB2312标准,同时支持繁体汉字以及日韩汉字等
UTF-8编码:可以用来表示Unicode标准中任意字符,它是电子邮件、网页及其他存储或传送文字的应用 中,优先采用的编码。互联网工程工作小组(IETF)要求所有互联网协议都必须支持UTF-8编码。它使用一至四个字节为每个字符编码
对象操作流 分为 : 对象序列化流 与 对象反序列化流
对象序列化:就是将对象保存到磁盘中,或者在网络中传输对象
对象反序列化流:该字节序列还可以从文件中读取回来,重构对象,对它进行反序列化
对象序列化流—>输出
new ObjectOutputStream(new FileOutputStream(“文件路径名”))
写数据方法 writerObject(Object obj);将指定的对象写入ObjectOutputStream
这里参数是Object类型 所以要在 对象反序列化流 读出数据后 进行输出打印时 记得强转数据类型
对象反序列化流 -------> 输入
new ObjectInputStream(new FileInputStream("文件路径名“)
读数据 方法 Object readObject(Object obj), 从ObjectInputStream读取一个对象
这里参数是Object类型 所以要在 对象反序列化流 读出数据后 进行输出打印时 记得强转数据类型
- serialVersionUID关键字
- 用对象序列化流序列化了一个对象后,假如我们修改了对象所属的类文件,读取数据会不会出问题呢?
- 会出问题,会抛出InvalidClassException异常
- 如果出问题了,如何解决呢?
- 重新序列化
- 给对象所属的类加一个serialVersionUID
- private static final long serialVersionUID = 42L;
- transient关键字
- 如果一个对象中的某个成员变量的值不想被序列化,又该如何实现呢?
- 给该成员变量加transient关键字修饰,该关键字标记的成员变量不参与序列化过程
Properties集合 它是一个Map体系的集合类
Properties 可以保存到流中 或从流中加载
Properties 属性列表中的每个键及其对应的值都是一个字符串
Properties方法
Object setProperty(String key, String value)
设置集合的键和值,都是String类型,底层调用 Hashtable方法 put
String getProperty(String key)使用此属性列表中指定的键搜索属性
Set stringPropertyNames()从该属性列表中返回一个不可修改的键集,其中键及其对应的值是字符串
和IO流结合的方法
void load(Reader reader)
从输入字符流读取属性列表(键和元素对)
void store(Writer writer, String comments)
将此属性列表(键和元素对)写入此 Properties表中,以适合使用 load(Reader)方法的格式写入输出字符流
在Properties文件中手动写上姓名和年龄,读取到集合中,将该数据封装成对象,写到本地文件
//1.创建Properties集合,将本地文件中的数据加载到集合中
Properties prop = new Properties();
FileReader fr = new FileReader("prop.properties");
prop.load(fr);
fr.close();
//2.获取集合中的键值对数据,封装到学生对象中
String name = prop.getProperty("name");
int age = Integer.parseInt(prop.getProperty("age"));
Student s = new Student(name,age);
//3.创建序列化流对象,将学生对象序列化到本地文件中
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("a.txt"));
oos.writeObject(s);
oos.close();
}