Javaday19IO流2

本文详细介绍了Java中的缓冲流,包括其作用、常见缓冲流类型及其提高读写效率的原理。此外,还讨论了装饰设计模式在缓冲流中的应用,以及Scanner类的使用。同时,提到了字符集、乱码处理和序列化流的相关知识。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

缓冲流的简介
基本介绍
给普通的IO流, 套上一个缓冲区。 所有的使用缓冲流进行的读写操作, 都是和缓冲区进行交
互的, 避免了频繁的IO操作。 这样一来, 带来的好处就是可以提高读写的效率。 这个缓冲
区, 其实是一个数组。
缓冲流的作用
为了提高读写的能力,本身没有读写的能力,要想进行读写就必须借助于字符流/字节流实现.
可以将缓冲流类比于催化剂或者高速的小车
常见的缓冲流:
BufffferedInputStream : 缓冲字节输入流
BufffferedOutputStream : 缓冲字节输出流
BufffferedReader : 缓冲字符输入流
BufffferedWriter : 缓冲字符输出流
使用缓冲流实现读写的步骤与字符流一样,只是需要我们先通过构造方法传入一个字符流对象.
同时缓冲流可以提高读写效率.
总结:
大家在使用流读写数据时,尽量使用缓冲流,缓冲流中尽量使用缓冲字符流,在字符缓冲流中比缓
冲字节流多了readLine()和newLine()方法.
BufffferedReader 类中多了一个方法 readLine()
意义: 读取缓冲流中的一行数据, 可以逐行读取。 一直到读取到的数据是null, 表示数
据读取完了, 没有下一行数据了。
注意事项: readLine() 是逐行读取, 但是, 只能读取到一行中的内容, 并不能读取走换
行符。
BufffferedWriter 类中多了一个方法 newLine()
写换行符 ,不同的系统使用的默认换行符不一样 windows系统 \r\n linux \n
意义: 无参的方法, 写一个换行符,支持跨平台(平台无关性)
是BufffferedReader的子类,不能读.但是可以提高效率,特有功能:设置行号,获取行号
设计模式
设计模式, 前人总结出来的对一些常见问题的解决方案,后人直接拿来使用
装饰设计模式
基于已经实现的功能,提供增强的功能.
装饰设计模式特点
装饰设计模式的由来就来自于对缓冲流的实现.
从缓冲流的角度讲解
1.使流原来的继承体更加的简单
2.提高了效率
3.由于是在原有的基础上提高增强的功能,所以他还要属于原来的体系
Scanner
这个类, 并不是一个IO流。 是一个扫描器, 这个类最主要的作用, 是从一个文件中或者从
一个流中浏览数据。 在这个类中封装了若干个方法, 方便了数据的读取。
next()
读取一个单词,遇到空格或者换行符就不再读取了。
hasNext()
判断是否还有下一个单词可以读取。
nextLine()
读取一行内容,遇到换行符就不再读取了。
hasNextLine()
判断是否还有下一行可以读取。
这里nextLine和BufffferedReader中的readLine都可以读取一行数据。 但是区别在于: 结束
条件不同。
BufffferedReader: 如果读取到的数据是null, 说明没有下一行数据了。
Scanner: 如果没有下一行了,再去读取,会出现异常。 所以, 此时的结束条件是
hasNextLine() 为false。
标准输入流: System.in : “标准”输入流。此流已打开并准备提供输入数据。通常,此流对
应于键盘输入或者由主机环境或用户指定的另一个输入源。
输入源:可以发送数据到内存的设备
输出源:可以接收内存的数据的设备
1.当前的流已经打开并关联了输入源--键盘
2.如果不想让键盘充当输入源,可以通过setIn进行更换
3.是一个字节流
标准输出流: System.out : 标准”输出流。此流已打开并准备接受输出数据。通常,此流
对应于显示器输出或者由主机环境或用户指定的另一个输出目标。
在进行文件读取的时候, 如果项目采用的字符集和文件的字符集不同,会出现乱码的情况。
打印流分类
除了拥有输出流的特点之外,还有打印的功能.
字节打印流:PrintStream
字符打印流:PrintWriter
字节打印流
字节打印流支持的设备:
1.File类型的文件
2.字符串类型的文件
3.字节输出流
字符打印流
字符打印流支持的设备:
1.File类型的文件
2.字符串类型的文件
3.字节输出流
4.字符写出流
注意点:
方法:public PrintWriter(Writer out, boolean autoFlush)
autoFlush - boolean 变量;如果为 true,则 println、printf 或 format 方法将自动刷新
输出缓冲区但是执行print方式时需要手动刷新
常用字符集
中国的字符集:GBK/GB2312
欧洲的:ISO8859-1
通用的:UTF-8
美国的:ASCII
对中文的处理
一个汉字:GBK:2个字节 ISO8859-1:1个字节 utf-8:3个字节 unicode:2个字节
(内部编码)
说明:GBK,UTF-8是支持中文的,ISO8859-1不支持中文
编码:将字符串转化成byte序列的过程
解码:是将byte序列转成字符串的过程
编码错误:乱码:在执行读与写的时候,由于使用的字符集不同,造成了编码的错误.
解决办法:再编码再解码
中文乱码处理
注意点:乱码解决的办法是再编码再解码
但是如果是编码出错了,无法解决.
如果是解码出错了,可以利用再编码再解码
使用常用字符集GBK,utf8,ISO8859-1,进行编码解码出现乱码的情况分析
编码 解码 结果
GBK utf8 不可以(GBK2个字节,utf83个字节)
GBK ISO8859-1 可以
utf8 GBK 有时可以
utf8 ISO8859-1 可以
ISO8859-1 GBK 不可以(编码就出错了)
ISO8859-1 utf8 不可以(编码就出错了)
总结:只有使用GBKutf8进行编码,使用ISO8859-1进行解码,才能使用再编码再解码解决
乱码问题
这里使用的是utf8GBK进行的编码解码测试,只有在编码和解码使用同一种字符集时,才是
正确的编码方法
序列化流
将短期存储的数据实现长期存储,这个过程对应的流就是序列化流
数据的存储分成两类:
1.短期存储:存放在内存中,随着程序的关闭而释放---对象,集合,变量,数组
2.长期存储:存储在磁盘中,即使程序关闭了,数据仍然存在------文件
序列化:将数据从内存放入磁盘,可以实现数据的长久保存
反序列化:将数据从磁盘放回内存
ObjectInputStream、 ObjectOutputStream, 主要是用来做对象的序列化和反序列化
的。
序列化、 反序列化, 是对象的持久化存储的一种常用手段。
所有的要序列化到本地的类的对象, 类必须实现 java.io.Serilizable 接口
实现了Serializable接口的类可以达到的目的:
1.可以进行序列化
2.进行序列化的类的元素都必须支持序列化
3.可序列化类的所有子类型本身都是可序列化的。
4.接口本身没有方法或字段,只是用来表示可序列化的语义
合理使用序列化流和反序列化流,要与输入流与输出流配合使用
进行序列化的类一定要实现Serializable接口,只要实现了接口就可以序列化.包括集合,包
装类等
进行序列化的类要保证当前类与内部的类都要实现Serializable接口
Properties也不是一个IO流, 是一个集合。 是Hashtable的子类。
使用Properties主要是为了描述程序中的属性列表文件。 有时候, 我们会将一些比较简单的
项目的配置信息, 以 .properties 格式的文件进行存储。 可以使用Properties对象读写
.properties 文件。
因为存储的是属性,属性本来就是以键值对的方式存储.这里的键和值都必须是字符串.所以不需
要考虑泛型
Properties作用
1.是HashTable的子类,所以也是键值对形式,保存,操作更容易
2.默认键值都是字符串,所以不需要再考虑泛型
3.提供了一批好用的方法,方便使用(load(),store(),list()等)
加载一个 .properties 文件中的数据,后缀名也可以不是properties.但是一般我们写成
properties,方便使用.
a.properties文件内容
注意:
1.这里是修改过一次的文件
2.Propertes文件中对应的也应该是键值对
3.键和值之间可以是=或者空格或者冒号
4.默认每行只写一个键值对
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值