Properties
java.util.Properties集合 extends HashSet<k,v> implements Map<k,v>
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<String> 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