day17 缓冲流
概述
缓冲流,也叫高效流,是对4个基本的`FileXxx` 流的增强,所以也是4个流,按照数据类型分类 通过定义数组的方式确实比以前一次读取一个字节的方式快很多,所以,看来有一个缓冲区还是非常好的。 既然是这样的话,那么,java开始在设计的时候,它也考虑到了这个问题,就专门提供了带缓冲区的字节类。 这种类被称为:缓冲区类(高效类) 写数据:BufferedOutputStream 读数据:BufferedInputStream 构造方法可以指定缓冲区的大小,但是我们一般用不上,因为默认缓冲区大小就足够了。 为什么不传递一个具体的文件或者文件路径,而是传递一个OutputStream对象呢? 原因很简单,字节缓冲区流仅仅提供缓冲区,为高效而设计的。但是呢,真正的读写操作还得靠基本的流对象实现。
缓冲流分类
| 名称 | 类 |
|---|---|
| 字节缓冲流 | BufferedInputStream BufferedOutputStream |
| 字符缓冲流 | BufferedReader BufferedWriter |
字节缓冲流
构造方法
| 方法名 | 说明 |
|---|---|
| public BufferedInputStream(InputStream in) | 创建一个 新的缓冲输入流。 |
| public BufferedInputStream(InputStream in,int size) | 创建 BufferedInputStream具有指定缓冲区大小,并保存其参数,输入流in,供以后使用。 |
| public BufferedOutputStream(OutputStream out) | 创建一个新的缓冲输出流。 |
| public BufferedOutputStream(OutputStream out,int size) | 创建一个新的缓冲输出流,以便以指定的缓冲区大小将数据写入指定的底层输出流。 |
二者基本都是用 InputStream 和 OutputStream 中的 writer() 和 reader() 的重载方法
字符缓冲流
构造方法
| 方法名 | 说明 |
|---|---|
| public BufferedReader(Reader in) | 创建一个 新的缓冲输入流。 |
| public BufferedReader(Reader in,int size) | 创建使用默认大小的输入缓冲区的缓冲字符输入流 |
| public BufferedWriter(Writer out) | 创建一个新的缓冲输出流。 |
| BufferedWriter(Writer out, int sz) | 创建一个新的缓冲字符输出流,使用给定大小的输出缓冲区。 |
常用方法
二者基本都是用 Reader 和 Writer 中的 writer() 和 reader() 的重载方法
字符缓冲流的特有方法
| 类名 | 方法名 | 说明 |
|---|---|---|
| BufferedReader | public String readLine() | 一次读取一行文字 |
| BufferedWriter | public void newLine() | 写一行行分隔符,由系统属性定义符号 // 换行符 |
注意
若是循环读取 用的是readLine方法 ,在while中判断的是用 null
转换流
编码
按照某种规则,将字符存储到计算机中
通俗理解::字符(能看懂的)--字节(看不懂的)==
解码
将存储在计算机中的二进制数按照某种规则解析显示出来
通俗理解:字节(看不懂的)-->字符(能看懂的)==
OutputStreamWriter类
是Writer的子类
将字节输出流转换为缓冲字符输出流
常用构造方法
| 方法名 | 说明 |
|---|---|
| OutputStreamWriter(OutputStream in) | 创建一个使用默认字符集的字符输出流。 |
| OutputStreamWriter(OutputStream in, String charsetName) | 创建一个指定字符集的字符输出流。 |
InputStreamReader类
是Reader的子类
将字节输入流转化为缓冲字符输入流
常用构造方法
| 方法名 | 说明 |
|---|---|
| InputStreamReader(InputStream in) | 创建一个使用默认字符集的字符流。 |
| InputStreamReader(InputStream in, String charsetName) | 创建一个指定字符集的字符流。 |
注意
用转换流复制时,转换流设置的输入输出流的编码一定要保持一致
序列化流
序列化: 把对象以流的形式进行流化,存储或者在网络中转输 对象 --- 流数据 ObjcetOutputStream
返序列化: 把文本中的数据据以流的形式进行还原成对象 流数据---对象 ObjectInPutStream
ObjectOutputStream类
父类是OutputStream
将Java对象的原始数据类型写出到文件,实现对象的持久存储。
常用的构造方法
4.2.1 构造方法
| 方法名 | 说明 |
|---|---|
| public ObjectOutputStream(OutputStream out) | 创建一个指定OutputStream的ObjectOutputStream。 |
常用方法
4.2.2 序列化常用方法
| 方法名 | 说明 |
|---|---|
| public final void writeObject (Object obj) | 将指定的对象写出。 |
注意
对某类要进行序列化,将其放入到文本文件中时,一定要将该类实现Serializable接口,并且要给该类一个版本号
ObjectInputStream类
父类是InputStream
将之前使用ObjectOutputStream序列化的原始数据恢复为对象。
常用构造方法
| 方法名 | 说明 |
|---|---|
| public ObjectInputStream(InputStream in) | 创建一个指定InputStream的ObjectInputStream。 |
常用方法
| 方法名 | 说明 |
|---|---|
| public final Object readObject () | 读取一个对象。 |
关键字
transient
被该关键字修饰的成员,数据将无法序列化到文件中
被反序列化出来的时候,该成员将被系统给与默认初始化的值
static
被该关键字修饰的成员,数据将无法序列化到文件中
注意
若是在同一个类中同时同时进行系列化和反序列化,直接使用序列化和反序列化,还是通过方法调用其他类或本类序列化和反序列化,只要是在同一个类中同时进行就直接调用的是还没被序列化对象,而不是调用文本文件中的对象
打印流
略
Properties集合
Properties集合概述
-
- 是一个Map体系的集合类 - Properties可以保存到流中或从流中加载 - 属性列表中的每个键及其对应的值都是一个字符串
Properties基本使用
public class PropertiesDemo01 {
public static void main(String[] args) {
//创建集合对象
// Properties<String,String> prop = new Properties<String,String>(); //错误
Properties prop = new Properties();
//存储元素
prop.put("itfxp001", "林青霞");
prop.put("itfxp002", "张曼玉");
prop.put("itfxp003", "王祖贤");
//遍历集合
Set<Object> keySet = prop.keySet();
for (Object key : keySet) {
Object value = prop.get(key);
System.out.println(key + "," + value);
}
}
}
Properties集合的特有方法
| 方法名 | 说明 |
|---|---|
| Object setProperty(String key, String value) | 设置集合的键和值,都是String类型,底层调用 Hashtable方法 put |
| String getProperty(String key) | 使用此属性列表中指定的键搜索属性 |
| Set<String> stringPropertyNames() | 从该属性列表中返回一个不可修改的键集,其中键及其对应的值是字符串 |
代码演示
/*
* 特殊功能:
* public Object setProperty(String key,String value):添加元素
* public String getProperty(String key):获取元素
* public Set<String> stringPropertyNames():获取所有的键的集合
*/
public static void main(String[] args) throws IOException, ClassNotFoundException {
// 创建集合对象
Properties prop = new Properties();
// 添加元素
prop.setProperty("张三", "30");
prop.setProperty("李四", "40");
prop.setProperty("王五", "50");
// public Set<String> stringPropertyNames():获取所有的键的集合
Set<String> set = prop.stringPropertyNames();
for (String key : set) {
String value = prop.getProperty(key);//获取元素(value)
System.out.println(key + "---" + value);
}
}
Properties和IO流相结合的方法
| 方法名 | 说明 |
|---|---|
| void load(InputStream inStream) | 从输入字节流读取属性列表(键和元素对) |
| void load(Reader reader) | 从输入字符流读取属性列表(键和元素对) |
| void store(OutputStream out, String comments) | 将此属性列表(键和元素对)写入此 Properties表中,以适合于使用 load(InputStream)方法的格式写入输出字节流 |
| void store(Writer writer, String comments) | 将此属性列表(键和元素对)写入此 Properties表中,以适合使用 load(Reader)方法的格式写入输出字符流 |
代码示例
/*
* 这里的集合必须是Properties集合:
* public void load(Reader reader):把文件中的数据读取到集合中
* public void store(Writer writer,String comments):把集合中的数据存储到文件
*/
public static void main(String[] args) throws IOException, ClassNotFoundException {
// myLoad();
myStore();
}
//写数据
private static void myStore() throws IOException {
// 创建集合对象
Properties prop = new Properties();
prop.setProperty("江一燕", "27");
prop.setProperty("jack", "30");
prop.setProperty("肉丝", "18");
//public void store(Writer writer,String comments) 把集合中的数据存储到文件
FileWriter w = new FileWriter("name.properties");
//写
prop.store(w, "写入文件的说明:因为我要学习所有我要写入");//comments:信息的描述
w.close();
}
//读数据
private static void myLoad() throws IOException {
Properties prop = new Properties();
// public void load(Reader reader) 把文件中的数据读取到集合中
// 注意:这个文件的数据必须是键值对形式
FileReader r = new FileReader("name.properties");
//读
prop.load(r);
r.close();
System.out.println("prop:" + prop);
}
JavaIO流:缓冲流、转换流和Properties集合详解
本文详细介绍了Java中的缓冲流,包括BufferedInputStream和BufferedOutputStream用于字节流的高效读写,以及BufferedReader和BufferedWriter用于字符流的优化。文章还提到了转换流OutputStreamWriter和InputStreamReader在字符编码中的作用,以及序列化和反序列化对象的ObjectOutputStream和ObjectInputStream。最后,讨论了Properties集合的使用,它是Map体系的集合类,可以与IO流结合进行数据的存储和加载。
1763

被折叠的 条评论
为什么被折叠?



