Properties && 缓冲流 && 内存输出流 && 随机读写流 && 标准输入输出流 && 转换流 && 序列化流 && 打印流

Properties

java.util.Properties集合 extends HashSet implements Map
Properties 类表示了一个持久的属性集.Properties可保存在流中或从流中加载
Properties集合是一个双列集合,key和value默认都是字符串

使用Properties集合存储数据,遍历取出Properties集合中的数据
	Properties集合含有一些操作字符串的特有方法
		Object setProperty(String key,String value):调用HashTable的方法put
		String getProperty(String key):通过key找到value值,此方法相当于Map集合中的get(key)方法
		Set stringPropertyNames():返回此属性列表中的键集,其中该键及其对应值是字符串,
			此方法相当于Map集合中的keySet方法

Properties 集合是唯一一个和IO流相结合的集合
	可以使用Properties集合中的方法store,把集合中的临时数据,持久化写入到硬盘中存储
		void store(OutputStream out,String comments):
		void store(Write write,String comments):
		参数:
			OutputStream out:字节输出流,不能写入中文
			Write write:字符输出流的,可以写中文
			String comments:注释,用来解释说明保存的文件是做什么用的
							不能使用中文,会产生乱码,默认是Unicode编码,一般使用""空字符串
			使用步骤:
				1.创建Properties集合对象,添加数据
				2.创建字节输出流/字符输出流对象,构造方法中绑定要输出的目的地
				3.使用Properties集合中的方法store,把集合中的临时数据,持久化写入到硬盘中存储
				4.释放资源

	可以使用Properties集合中的方法load,把硬盘中保存的文件(键值对),读取到集合中使用
		void load(InputStream inStream)
		void load(Reader reader)
		参数:
			InputStream inStream:字节输入流,不能读取含有中文的键值对
			Reader reader:字符输入流,能读取含有中文的键值对
		使用步骤:
			1.创建Properties集合对象
			2.使用Properties集合对象中的方法load读取保存键值对的文件
			3.遍历Properties集合
		注意:
			1.存储键值对的文件中,键与值默认的连接符号可以使用=,空格(其他符号)
			2.存储键值对的文件中,可以使用#进行注释,被注释的键值对不会再被读取
			3.存储键值对的文件中,键与值默认都是字符串,不再加引号

缓冲流

	缓冲流: 给基本的字节输入流增加一个缓冲区(数组)提高基本的字节输入流的读取效率

BufferedOutputStream:字节缓冲输出流	java.io.BufferedOutputStream extends OutputStream
	构造方法:
		BufferedOutputStream(OutputStream out):创建一个新的缓冲输出流,将数据写入指定的底层输出流
		BufferedOutputStream(OutputStream out , int size):创建一个新的缓冲输出流,
			将具有指定缓冲区大小的数据写入指定的底层输出流
		参数:
			OutputStream out:字节输出流
				我们可以传递FileOutputSream,缓冲流会给FileOutputStream增加一个缓冲区,提高FileOutputStream的写入效率
			int size:指定缓冲流内部缓冲区的大小,不写默认

		使用步骤:
			1.创建FileOutputStream对象,构造方法中绑定要输出的目的地
			2.创建BufferedOutputStream对象,构造方法中传递FileOutputStream对象,提高FileOutputSt
				ream对象效率
			3.使用BufferedOutputStream对象中的方法write,把数据写入到内部缓冲区中
			4.使用BufferedOutputStream对象中的方法flush,把内部缓冲区的数据,刷新到文件中
			5.释放资源

BufferedInputStream:字节缓冲输入流	java.io.BufferedInputStream extends InputStream
	构造方法:
		BufferedInputStream(InputStream in):创建一个BufferedInputStream并保存其参数.即输入流in
		BufferedInputStream(InputStream in , int size):
			创建具有指定缓冲区大小的BufferedInputStream,保存参数,即输入流in ,以便将来使用
		参数:
			InputStream in:字节输入流
				我们可以传递FileInputSream,缓冲流会给FileInputStream增加一个缓冲区,提高FileInputStream的读取效率
			int size:指定缓冲流内部缓冲区的大小,不写默认
	使用步骤:
		1.创建FileInputStream对象,构造方法中绑定要读取的数据源
		2.创建BufferedInputStream对象,构造方法中传递FileInputStream对象,提高FileInpurStream对象
			的读取效率
		3.使用BufferedInputStream对象中的方法read,读取文件
		4.释放资源

BufferedWrite:字符缓冲输出流		java.io.BufferedWrite extends Write
	构造方法:
		BufferedWrite(Write out):创建一个使用默认大小输出缓冲区的缓冲字符输出流
		BufferedWrite(Write out ,int size):创建一个给定大小输出的缓冲区字符输出流
		参数:
			Write out :字符输出流
				我们可以传递FileWrite,缓冲流会给FileWrite增加一个缓冲区,提高FileWwrite写入效率
			int size:指定缓冲区的大小,不写默认大小

	特有的成员方法:
		void newLine():写入一个行分隔符,会根据不同的操作系统,获取不同的行分隔符

	LineNumberReader是BufferedReader的子类, 具有相同的功能, 并且可以统计行号
				|--getLineNumber()方法可以获取当前行号
				|--setLineNumber()方法可以设置当前行号

BufferedReader:字符输入流 	java.io.BufferedReader extends Reader
	构造方法:
		BufferedReader(Reader in):创建一个使用默认大小输入缓冲字符输入流
		BufferedReader(Reader in,int size):创建一个使用指定大小输入缓冲区的缓冲字符流
		参数:
			Reader in:字符输入流
				我们可以传递FileReader,缓冲流会给FileReader增加一个缓冲区

	特有成员方法:
		String readLine():读取一个行文本,读取一行数据
				行的终止符:换行('\n'),回车('\r')或者回车后直接跟着换行(\r\n)
			返回值:
				包含该行内容的字符串,不包含任何终止符,如果已达到流末尾,则返回null
	使用步骤:
		1.创建字符缓冲输入流对象,构造方法中传递字符输入流
		2.使用字符缓冲流对象中的方法read/readLine读取文本
		3.释放资源

内存输出流

内存输出流: ByteArrayOutputStream  extends  OutputStream
ByteArrayOutputStream概述
	1.本身是内存中的流,不算真正意义上的I/O
	2.本质:用于缓存不完整字节信息的一个缓冲区
	3.底层:就是一个字节数组,只不过提供了自动增长空间的方法
方法:
	toString():将底层缓存区中的字节解码返回字符串
	toByteArray():返回底层缓存区数组中,有效的那部分字节

随机读写流: RandomAccessFile

1. 特点:
 	1、不属于流的体系
 	2、不仅可以读,还可以写
 	3、支持随机读写
2、构造方法:
 	RandomAccessFile(String path, String mode)
 	mode:访问模式(r:只读;rw:读写)
3、成员方法:
 	seek(long position)
 		随机的设定要访问的文件位置

标准输入输出流

	|--System.in是InputStream, 标准输入流, 默认可以从键盘输入读取字节数据
		|--System.setIn(InputStream)修改输入流
	|--System.out是PrintStream, 标准输出流, 默认可以向Console中输出字符和字节数据
		|--System.setOut(PrintStream)修改输出流
	|--键盘录入的两种方式
		|--Scanner sc = new Scanner(System.in);
		|--BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

转换流

OutputStreamWrite:
	是字符流通向字节流的桥梁,可使用指定的charset 将要写入的字符编码成字节(编码)
		java.io.OutputStreamWrite extends Write
	构造方法:
		OutputStreamWrite(OutputStream out):
			创建使用默认字符编码的 OutputStreamWrite
		OutputStreamWrite(OutputStream out,String charsetName):
			创建使用指定字符编码的 OutputStreamWrite
		参数:
			OutputStream out:字节输出流,可以用来写转换之后的字节到文件
			Stirng charsetName:指定的编码表名称,不区分大小写,不指定时根据软件默认
	使用步骤:
		1.创建OutputStreamWrite对象,构造方法中传递字节输出流和指定的编码表名称
		2.使用OutputStreamWrite对象中的方法write,把字符转换为字节存储在缓冲区中(编码)
		3.使用OutputStreamWrite对象中的方法flush,把内存缓冲区中的字节刷新到文件中
		4.释放资源

InputStreamReader:
	是字节流通向字符流的桥梁,可使用指定的charset 读取字节并将其解码为字符(解码)
		java.io.InputStreamReader extends Reader
	构造方法:
		InputStreamReader(InputStream in):
			创建一个使用默认字符集的 InputStreamReader
		InputStreamReader(InputStream in ,String charsetName):
			创建使用指定字符编码的 InputStreamReader
		参数:
			InputStreamReader in:字节输入流,用来读取文件中保存的字节
			String charsetName:指定的编码表名称,不区分大小写
	使用步骤:
		1.创建InputStreamReader对象,构造方法中传递字节输入流和指定编码表名称
		2.使用InputStreamReader对象中的方法read读取文件
		3.释放资源

	注意事项:
		构造方法中指定的编码表名称要和文件的编码一致,否则会发生乱码

序列化流

ObjectOutputStream:对象的序列化
	java.io.ObjectOutputStream extends OutputStream
	作用:
		把对象以流的方式写入到文件中保存
	构造方法:
		ObjectOutputStream(OutputStream out):创建写入指定OutputStream的ObjectOutputStream
		参数:
			OutputStream out:字节输出流
	特有的成员方法
		void writeObject(Object obj) 将指定的对象写入到 ObjectOutputStream
	使用步骤:
		1.创建ObjectOutputStream对象,构造方法中传递字节输出流
		2.使用ObjectOutputStream对象中的方法writeObject,把对象写入到文件中
		3.释放资源

NotSerializableException:没有序列化异常
	类通过实现 java.io.Serializable 接口
		以启用其序列化功能,未实现此接口的类将无法使其任何状态的序列化或反序列化
	Serializable接口也叫标记型接口
		要进行序列化和反序列化的类必须实现Serializabal接口,就会给类添加一个标记
		当我们进行序列化和反序列化的时候,就会检测是否有这个标记
			有:就可以序列化和反序列化
			没有:就会抛出NotSerializableException 异常

ObjectInputStream:对象的反序列化流
	java.io.ObjectInputStream extends InputStream
	作用:
		把文件中保存的对象,以流的方式读取出来使用
	构造方法:
		ObjectInputStream(InputStream in)
			创建从指定InputStream读取的ObjectInputStream
			参数:
				InputStream in:字节输入流
	特有的成员方法
		Object readObject() 从ObjectInputStream 读取对象
	使用步骤:
		1.创建ObjectInputStream对象,构造方法中传递字节输入流
		2.使用ObjectInputStream对象中的方法readObject读取保存对象的文件
		3.释放资源
		4.使用读取出来的对象(打印)

InvalidClassException异常
	原因:
		1.该类的序列版本号与从流中读取的类的描述符版本号不匹配
		2.该类包含未知的数据类型
		3.该类没有可访问的无参数构造方法

	Serializable接口给需要的序列化的类,提供了一个序列版本号.
		问题:
			每次修改类的定义,都会给class文件生成一个新的序列号
		解决:
			无论是否对类的定义进行修改,都不重新生成新的序列号
			可以手动给类添加一个序列号
		格式在Serializable规定:
			serialVersionUID字段(该字段必须是静态的,最终的long型字段)
			static final long serialVersionUID = 42L;

transient关键字:瞬态关键字
	被transient修饰的成员变量,不能被序列化
	被static修饰的成员变量,不能被序列化,序列化的都是对象

打印流:java.io.PrintStream extends OutputStream

PrintStream:为其他输出流添加了功能,使他们能够方便的打印各种数据值表示形式,以字符串表示数据
特点:
	1.只负责数据的输出,不负责数据的读取
	2.与其他输出流不同,PrintStream永远不会抛出IOException
	3.有特有的方法
		void print(任意类型的值)
		void println(任意类型的值并换行)
构造方法:
	1.PrintStream(File file):输出目的地是一个文件
	2.PrintStream(OutputStream out):输出的目的地是一个字节输出流
	3.PrintStream(String fileName):输出目的地是一个文件路径
注意:
	1.如果使用继承父类的write方法写数据,那么查看数据的时候会查询编码表 97-> a
	2.如果使用自己特有的方法print/println 方法写数据,写的数据原样输出 97-> 97
方法:
	static void setOut(PrintStream out):重新分配"标准"输出流
		可以改变输出语句的目的地(打印流的流向)
		输出语句,默认在控制台输出
		使用System.setOut方法改变输出语句的目的地改为参数中传递的打印流的目的地
			System.out.println("我在控制台输出");
			PrintStream ps = new PrintStream("打印流目的地.txt");
			System.setOut(ps);
			System.out.println("我从主方法来");
			ps.close();

打印字符流
	1、PrintWriter
	2、是Writer的子类,具有普通的字符输出流的全部方法,并不关注继承而来的这些输出字符的方法,关注的是PrintWriter中的print和println这两个特有方法
	3、常用方法:
	 	print和println方法,和PrintStream中的方法作用一样
	4、和PrintStream的不同点:
	 	PrintStream是字节流,没有缓冲区,PrintWriter是Writer的子类,因此具有缓冲区,有了刷新的操作;
	 	PrintWriter具有自动刷新的功能:
	 	 	1、使用具有刷新功能的构造方法:
	 	 	 	PrintWriter(OutputStream os, boolean autoFlush)
	 	 	 	PrintWriter(Writer w, boolean autoFlush)
	 	 	 	 	可以将一个普通的字节输出流或者字符输出流,加强为一个具有自动刷新				功能的打印流对象(第二个参数必须为:true)
	 	 	2、使用带有自动刷新的写出方法
	 	 	 	 	Println,print,format

你可能感兴趣的:(javase)