缓冲流、转换流、序列化流
目录
一、缓冲流
1.缓冲流的作用
2.缓冲流的分类
3.字节缓冲流的介绍和使用
4.字符缓冲流的介绍和使用
5.综合练习:文本排序
二、转换流
1.字符编码
2.字符集
3.编码引出的问题
4.InputStreamReader类
5.OutputStreamWriter类
三、序列化流
1.什么是序列化流
2.ObjectOutputStream类的使用
(1)构造方法
(2)序列化操作的前提
(3)写出对象方法
3.ObjectInputStream类的使用
(1)构造方法
(2)反序列化操作的异常分析
(3)读取对象方法
4.序列化多个对象练习
四、打印流PrintStream
1.介绍
2. 构造方法
3.小练习:改变打印流向
一、缓冲流
1.缓冲流的作用
缓冲流又叫增强流,用来给四大基本流做性能方面的加强。
2.缓冲流的分类
字节缓冲流: BufferedInputStream , BufferedOutputStream
字符缓冲流: BufferedReader , BufferedWriter
3.字节缓冲流的介绍和使用
(1)字节缓冲流的构造
public BufferedInputStream(InputStream in) :创建一个 新的缓冲输入流。
public BufferedOutputStream(OutputStream out) : 创建一个新的缓冲输出流。
4.字符缓冲流的介绍和使用
(1)字符缓冲流的构造
public BufferedReader(Reader in) :创建一个 新的缓冲输入流。
public BufferedWriter(Writer out) : 创建一个新的缓冲输出流。
(2)特有方法
BufferedReader: public String readLine() : 读一行文字。
BufferedWriter: public void newLine() : 写一行行分隔符,由系统属性定义符号。
5.综合练习:文本排序
HashMap<String, String> linemap = new HashMap<>();//创建流对象try (BufferedReader br = new BufferedReader(new FileReader("出师表"));BufferedWriter bw = new BufferedWriter(new FileWriter("出师表02.txt"));) {String line = null;//读取数据while ((line = br.readLine()) != null) {//解析文本String[] split = line.split("\\.");//保存到集合linemap.put(split[0], split[1]);}//遍历集合for (int i = 1; i <= linemap.size(); i++) {//获取map中文本String value = linemap.get(String.valueOf(i));//写出拼接文本bw.write(i + "." + value);//换行bw.newLine();}} catch (IOException e) {e.printStackTrace();}
二、转换流
1.字符编码
就是一套自然语言的字符与二进制数之间的对应规则。
编码:字符通过编码转成对应的码值(看的懂的变为看不懂的)
解码:码值通过解码转成对应的字符(看不懂的变为看的懂的)
2.字符集
是一个系统支持的所有字符的集合,包括各国家文字、标点符号、图形符号、数字等。
3.编码引出的问题
在IDEA中,使用FileReader 读取项目中的文本文件。由于IDEA的设置,都是默认的UTF-8 编码,所以没有任何问题。但是,当读取Windows系统中创建的文本文件时,由于Windows系统的默认是GBK编码,就会出现乱码。
4.InputStreamReader类
转换流java.io.InputStreamReader ,是Reader的子类,是从字节流到字符流的桥梁。
(1)构造方法
InputStreamReader(InputStream in) : 创建一个使用默认字符集的字符流。
InputStreamReader(InputStream in, String charsetName) : 创建一个指定字符集的字符流。
5.OutputStreamWriter类
转换流java.io.OutputStreamWriter ,是Writer的子类,是从字符流到字节流的桥梁。
(1)构造方法
OutputStreamWriter(OutputStream in) : 创建一个使用默认字符集的字符流。
OutputStreamWriter(OutputStream in, String charsetName) : 创建一个指定字符集的字符流。
三、序列化流
1.什么是序列化流
Java 提供了一种对象序列化的机制。用一个字节序列可以表示一个对象,该字节序列包含该对象的数据、对象的类型和对象中存储的数据等信息。字节序列写出到文件之后,相当于文件中持久保存了一个对象的信息。
反之,该字节序列还可以从文件中读取回来,重构对象,对它进行反序列化。
2.ObjectOutputStream类的使用
(1)构造方法
public ObjectOutputStream(OutputStream out) : 创建一个指定OutputStream的ObjectOutputStream。
(2)序列化操作的前提
一个对象要想序列化,必须满足两个条件:
①该类必须实现java.io.Serializable 接口, Serializable 是一个标记接口,不实现此接口的类将不会使任何状态序列化或反序列化,会抛出NotSerializableException 。
②该类的所有属性必须是可序列化的。如果有一个属性不需要可序列化的,则该属性必须注明是瞬态的,使用transient 关键字修饰。
(3)写出对象方法
public final void writeObject (Object obj) : 将指定的对象写出。
3.ObjectInputStream类的使用
(1)构造方法
public ObjectInputStream(InputStream in) : 创建一个指定InputStream的ObjectInputStream。
(2)反序列化操作的异常分析
①InvalidClassException异常
当JVM反序列化对象时,能找到class文件,但是class文件在序列化对象之后发生了修改,那么反序列化操作也会失败,抛出一个InvalidClassException 异常。发生这个异常的原因如下:
A.该类的序列版本号与从流中读取的类描述符的版本号不匹配
B.该类包含未知数据类型
C.该类没有可访问的无参数构造方法
Serializable 接口给需要序列化的类,提供了一个序列版本号。serialVersionUID 该版本号的目的在于验证序列化的对象和对应类是否版本匹配。
②ClassNotFoundException异常
序列化前后,被序列化类被删除了。
(3)读取对象方法
public final Object readObject () : 读取一个对象。
4.序列化多个对象练习
分析:
(1)把若干学习对象 ,保存到集合中。
(2)把集合序列化。
(3)反序列化读取时,只需要读取一次,转换为集合类型。
(4)遍历集合,可以打印所有的学生信息
代码如下:
public class Student implements Serializable {private static final long serialVersionUID = 8002194731998770433L;private String name;private int age;public Student() {}public Student(String name, int age) {this.name = name;this.age = age;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +'}';}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}
}
public static void main(String[] args) throws Exception {// 创建 学生对象Student student = new Student("老王", 20);Student student2 = new Student("老张", 22);Student student3 = new Student("老李", 24);ArrayList<Student> arrayList = new ArrayList<>();arrayList.add(student);arrayList.add(student2);arrayList.add(student3);// 序列化操作serializ(arrayList);// 反序列化ObjectInputStream ois = new ObjectInputStream(new FileInputStream("list.txt"));// 读取对象,强转为ArrayList类型ArrayList<Student> list = (ArrayList<Student>) ois.readObject();for (int i = 0; i < list.size(); i++) {Student s = list.get(i);System.out.println(s.getName() + "‐‐" + s.getAge());}}private static void serializ(ArrayList<Student> arrayList) throws Exception {// 创建 序列化流ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("list.txt"));// 写出对象oos.writeObject(arrayList);// 释放资源oos.close();}
四、打印流PrintStream
1.介绍
作用:用来打印各种数据类型
特点:
a.永远不会抛出IOException
b.不需要关心字符字节,打印什么就是什么
2. 构造方法
public PrintStream(String fileName) : 使用指定的文件名创建一个新的打印流。
PrintStream(OutputStream out): 创建一个新的打印流。
PrintStream(File file): 使用指定的文件创建一个新的打印流。
3.小练习:改变打印流向
// 调用系统的打印流,控制台直接输出97System.out.println(97);// 创建打印流,指定文件的名称PrintStream ps = new PrintStream("ps.txt");// 设置系统的打印流流向,输出到ps.txtSystem.setOut(ps);// 调用系统的打印流,ps.txt中输出97System.out.println(97);
缓冲流、转换流、序列化流相关推荐
- 集合到文件 文件到集合 点名器 集合到文件数据排序版 标准输入流 打印流 对象序列化流 对象返序列化流 Properties 游戏次数 进程和线程 线程 多线程的实现方式 设置和获取线程名称
文章目录 集合到文件 文件到集合 点名器 集合到文件数据排序版 标准输入流 打印流 对象序列化流 对象返序列化流 Properties 游戏次数 进程和线程 线程 多线程的实现方式 设置和获取线程名称 ...
- Java基础-22总结登录注册IO版,数据操作流,内存操作流,打印流,标准输入输出流,转换流,随机访问流,合并流,序列化流,Properties...
你需要的是什么,直接评论留言. 获取更多资源加微信公众号"Java帮帮" (是公众号,不是微信好友哦) 还有"Java帮帮"今日头条号,技术文章与新闻,每日更新 ...
- Java基础-22总结登录注册IO版,数据操作流,内存操作流,打印流,标准输入输出流,转换流,随机访问流,合并流,序列化流,Properties
你需要的是什么,直接评论留言. 获取更多资源加微信公众号"Java帮帮" (是公众号,不是微信好友哦) 还有"Java帮帮"今日头条号,技术文章与新闻,每日更新 ...
- File类,字节字符输入输出流,缓冲流,标准流,对象序列化流
一,File文件类 1 File类创建功能: public boolean createNewFiLe():当具有该名称的文件不存在时,创建一个由该抽象路径名命名的新空文件 如果文件 ...
- IO流案例以及特殊操作流/对象对象序列化流/Properties集合
文章目录 IO流案例 复制单级文件夹 复制多级文件夹 IO特殊操作流 标准输入流 字节打印流 字符打印流 对象序列化流 serialVersionUID&transient Propertie ...
- 【小白学Java】D32》》》IO流 之 序列化流 打印流
[友情链接]➡➡▶IO流 之 File类 & 递归 [友情链接]➡➡▶IO流 之 过滤器 & 字节流 [友情链接]➡➡▶IO流 之字符流 & 属性集(Properties集合) ...
- Java19-day10【标准输入输出流、字节字符打印流、对象序列化-反序列化流、serialVersionUIDtransient、Properties】
视频+资料[链接:https://pan.baidu.com/s/1MdFNUADVSFf-lVw3SJRvtg 提取码:zjxs] Java基础--学习笔记(零起点打开java世界的大门)--博 ...
- java io文件流序列化_Java——Properties集合,Object序列化流与反序列化流,打印流,commons-IO文件工具类...
一.properties集合 集合对象Properties类,继承Hashtable,实现Map接口,可以和IO对象结合使用,实现数据的持久存储. 特点: Hashtable的子类,map集合中的方法 ...
- java序列化流_java 序列化流与反序列化流
一 对象序列化流ObjectOutputStream ObjectOutputStream 将Java对象的基本数据类型和图形写入OutputStream.可以使用ObjectInputStream ...
- 对象序列化流与对象反序列化流(ObjectOutputStream,ObjectInputStream)
这个连接包含了常用的流------IO流(总篇章) 对象序列化:就是将对象保存到磁盘中,或者在网络中传输对象 这种机制就是使用一个字节序列表示一个对象,该字节序列包含:对象的类型.对象的数据和对象中存 ...
最新文章
- Wiley-中国科学院文献情报中心开放科学联合研讨会第一讲:开放科学全球和中国发展态势...
- 吴恩达:人工智能寒冬不会到来,但我们太乐观了
- JavaScript一次性定时器的设置和取消
- 物联网在医疗保健中的应用
- 开发中常遇到的linux系统配置操作整理
- 财富信息不需要传userID后台会根据保存的session提供数据
- pytorch nn.Conv1d
- 金三银四的面试黄金季节,Android面试题来了!
- yum下载文件的缓存位置
- 著作权登记信息采集表
- xshell5产品秘钥
- Matlab学习笔记 kron函数
- 光棍.com市场推广策划书(爆笑)
- 国信安web安全——文件上传漏洞
- Assertion failed: Protocol wrong type for socket [10041] zeromq 4.3.1\src\ip.cpp:417)错误
- 在aws亚马逊云EC2上创建root用户,并使用root用户登录
- 计算机专业英语实战记录(整理了上千个相关单词)
- Xctf Reverse菜鸟题解之csaw2013reversing2
- 什么是DHCP?为什么要用DHCP?(中科三方)
- NVMe SSD测试为何要先做预处理?
热门文章
- go.sum中特殊hash如何计算
- 删除有序数组中的重复项(数组去重)
- MySQL—视图(二)
- django_rest_framework之GenericAPIView(一)源码讲解
- Linux Kernel5.10的软中断(softirq)的本质
- Chrome好用的插件
- 03-CA/TA编程:aes_auth demo
- OpenSSL“心脏出血”漏洞
- 宝塔 mysql迁移_(2020年最新方法)如何快速迁移网站?使用宝塔一键迁移转移网站数据详细教程...
- angr学习笔记(13)(static_binary)