32.缓冲流和对象流

概念

缓存是IO的一种性能优化,缓存流为IO流增加了内存缓存区。有了缓存区,便可以减少系统直接与硬盘交互传输的次数,增加每次传送的数据量,借以提高传输效率,保护硬件。没有缓存功能的流当去输出时直接存入硬盘或目的地,如果有缓冲功能,则会将输出的内容先放置到缓存区中,等到有一定的数据量的时候,或者是调用close()方法关闭流、或调用flush()方法刷新流,才会将相应的内容保存到硬盘或者其它目的地。
注意:

  • 在使用缓冲区对象时,要明确,缓冲的存在是为了增强流的功能而存在,所以在建立缓冲区对象时,要先有流对象存在。缓冲区的出现提高了对流的操作效率。

字符缓冲输入流

Reader类有一个子类BufferedReader:从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。
案例: 使用缓冲流读取文本内容。

public class BufferedReaderTest1 {

	public static void main(String[] args) {
		String path = "D:\\woniu\\oop.txt";
		File file = new File(path);

		try(BufferedReader bufferedReader = new BufferedReader(new FileReader(file))){
			while(true) {
				//readLine()读一行
				String readLine = bufferedReader.readLine();
				if(readLine != null) {
					System.out.println(readLine);
				}else {
					//当读到文件的末尾,结束循环的执行
					break;
				}
			}
		}catch (Exception e) {
			// TODO: handle exception
		}
	}
}

字符缓冲输出流

Writer类有一个子类BufferedWriter :将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。

public class BufferedWriterTest2 {

	public static void main(String[] args) {
		//1定位
		File file = new File("D:\\woniu\\hello.txt");
        //2建立管道
		try(BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(file,true))){
			//3写
            bufferedWriter.write("hello");
			//4换行
			bufferedWriter.newLine();
		}catch (Exception e) {
			// TODO: handle exception
		}
	}
}

CSV文件的读写

CSV文件类似于Excel表格

/**
 * 	csv文件的读
 *	 在csv文件中单元格与单元格之间使用逗号间隔
 */
public class CSVReaderTest1 {

	public static void main(String[] args) {
		//1.定位
		File file = new File("D:\\woniu\\demo.csv");
		try(BufferedReader bufferedReader = new BufferedReader(new FileReader(file))){
			while(true) {
				//readLine()读一行
				String readLine = bufferedReader.readLine();
				if(readLine != null) {
					System.out.println(readLine);
				}else {
					//当读到文件的末尾,结束循环的执行
					break;
				}
			}
		}catch (Exception e) {
			// TODO: handle exception
		}
	}
}

/**
 * csv文件的写
 * @author Administrator
 *
 */
public class CSVWriterTest2 {

	public static void main(String[] args) {
		//1.定位
		File file = new File("D:\\woniu\\demo.csv");
		try(BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(file,true))){
			bufferedWriter.write("chenyun,31");
			bufferedWriter.newLine();
		}catch (Exception e) {
			e.printStackTrace();
		}
	}
}

Properties文件读写

简介

Properties指的是文件的内容格式,跟文件的后缀没有关系。如果一个文件中以键值对的形式存储数据,那这个文件就是一个Properties文件。该类主要用于读取java的配置文件。
Properties文件中键不能重复,值可以重复。为了提高可读性,文件的后缀通常使用properties表示。

package com.woniuxy.io3;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Properties;

/**
 * properties格式数据的读写
 * properties格式:键值对的存储格式
 * 	
 * 	写
 * 	为了提高程序的可读性,我们通常把文件的后缀改为properties
 */
public class Test1 {

	public static void main(String[] args) {
		//1.创建Properties对象
		Properties properties = new Properties();
		properties.put("username", "admin");
		properties.put("password", "123456");
		//2.调用properties对象的store方法,把数据使用字节输出流写入文件

		try {
			properties.store(new FileOutputStream(new File("D:\\woniu\\a.properties")), null);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

package com.woniuxy.io3;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Properties;

/**
 *  读
 */
public class Test2 {

	public static void main(String[] args) {
		// 1.创建Properties对象
		Properties properties = new Properties();
		//2.调用properties对象的load方法,把文件中的数据读取到properties对象中
		try {
			properties.load(new FileInputStream(new File("D:\\woniu\\a.properties")));
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		//3.打印properties对象
		System.out.println(properties);
		//4.通过键取值
		String uname = (String) properties.get("username");
		System.out.println(uname);
	}
}

对象流(了解)

当创建一个对象,程序运行时它就会存在,但是程序停止时,对象也就消失了.但是如果希望对象在程序不运行的情况下仍能存在并保存其信息,将会非常有用,对象将被重建并且拥有与程序上次运行时拥有的信息相同。可以使用对象的序列化。

  • 对象的序列化: 将内存中的对象直接写入到文件设备中 ObjectOutput writeObject(Object obj)
    //将对象写入底层存储或流。

  • 对象的反序列化: 将文件设备中持久化的数据转换为内存对象 ObjectInput readObject(); //读取并返回对象。

序列化ObjectOutputStream

如果要将对象中的数据保存到文件中,需要使用对象流的序列化功能。
案例: 使用序列化将对象保存到文件中
在这里插入图片描述
在这里插入图片描述
注意: 在使用对象流操作对象时会报错:java.io.NotSerializableException,因为对象进行序列化和反序列化时实体类需要实现Serializable接口。
在这里插入图片描述

反序列化 ObjectInputStream

反序列化就是将序列化到文件中的内容读取出来。
案例: 使用反序列化读取文本内容。
在这里插入图片描述

注意:使用序例 化输出到文件的内容只能使用反序列化获得。

总结

  1. 对象的序列化:把java对象保存到文件中。
  2. 对象的反序列化:把文件中保存的数据转换为java对象。
  3. 在对象序列化时,被序列化的对象相关的类必须实现序列化接口。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值