基本的流和高效的流能操作的数据类型有限,如果我想操作不同类型的数据,
那么,它们是做不到的
这个时候,Java就提供了一类流对象:打印流
注意:打印流仅仅提供输出功能,没有对应的读取功能
字节打印流 PrintStream -- 在JavaWeb中有使用
System.out.println() --System.out 类.字段 --> 对象 对象.方法()
1. 字符打印流 PrintWriter -->父类 Writer
为什么要学习打印流呢?
1)打印流可以输出任意类型的数据
2)如果启动了自动刷新,在调用println()的时候会自动刷新
3)可以直接对文件进行操作
哪些流对象可以直接对文件进行操作呢?
看构造方法,如果同时有构造参数File类型和String类型,
那么一般是可以直接对文件进行操作
特有功能:
println()方法--对比继承父类的write() 好处是:
写入,换行,自动刷新(在构造方法中已开启自动刷新)三合一 pw.println();
bw.write(s);
bw.newLine();
bw.flush();
2. 可变参数 -- 针对参数不确定的情况(形式参数...变量)
注意: 这里的变量其本质是该形式参数类型的一个数组
这里会把调用到的数据自动封装成一个数组
如果一个方法中有可变参数,并且有多个形式参数,可变参数在后面
3. public PrintWriter printf(String format, Object...args) format--格式字符串
System.out.printf("%.2f",100.123); -->输出:100.12
4. public static<T> List<T> asList(T...a) 把数组转成集合
注意:这里的数组应该是引用类型
转换后的集合的长度是固定的,所以不能做增add删remove操作,可以做修改set操作
Integer[] arr = {1,2,3};
List<Integer> list = Arrays.asList(arr);
5. Properties集合类 -->父类 HashTable -->父类 Map 键值对
是一个唯一的可以和IO流结合使用的集合类
和集合关联的特有功能
1)添加元素
Object setProperty(String key, String value)
2)获取元素
String getProperty(String key)
String getProperty(String key, String defaultValue)
Set<String> stringPropertyNames()
和IO流的结合使用
1)把数据从集合写到文件 -->打印流
void list(PrintStream out)
void list(PrintWriter out)
prop.list(new PrintWriter("out.txt")); //将prop集合中的内容复制到了out.txt文件中
2)把数据从文件写到集合(文件格式要求是键值对的形式)
void load(InputStream inStream)
void load(Reader reader)
3)把数据从集合中写到文本文件 --> 一般IO流
void store(OutputStream out, String comments)
void store(Writer writer, String comments)
应用场景:游戏的进度保存和加载
案例 : 读取copy.txt 修改后 保存
Properties prop = new Properties();
//加载
prop.load(new FileReader("copy.txt"));
//修改
for(String s:prop.stringPropertyNames()){
if(s.equals("lisi")){
prop.setProperty("lisi", "40");
}
}
//保存
prop.store(new FileWriter("copy.txt"), null);
6. ObjectOutputStream -- 序列化流:把对象按照流一样的方式操作
writeObject(Object obj)
ObjectInputStream -- 反序列化流:把流数据还原成对象
ReadObject()
Serializable接口 -- 序列化接口 是一个标记接口,实现该接口进而启动其序列化功能
String类已经实现了Serializable接口
ArrayList类也实现了Serializable接口
一个类被序列化后,会有一个标记值
在生成的class文件中也会有这个标记值
在把该类对象网文件中存储的时候,同时会记录这个标记值
如果修改了这个类,可能会造成类中的标记值与文件的标记值不同报错
假如我有办法知道这个标记值是怎么表示的,我写一个固定的值来做标记 就ok了
private static final long serialVersionUID = .....