打印流
1,基本流和高效流操作的数据类型有限,如果我想操作不同数据类型的数据。那么它是做不到的。
这个时候,Java提供了一种流对象的类:打印流。
字节打印流:PrintStream
字符打印流:PrintWriter
注意:打印流仅提供了输出,并没有对应的读取功能。
2,特点:
a,打印流可以输出任意类型数据。
b,如果启用了自动刷新,调用println()方法的时候,可以自动刷新并换行。
c,可以直接操作文件。
哪些流对象可以直接操作文件呢?
看其构造方法, 同时有File和String构造参数的。
3,案例:
打印流案例
可变参数
1,在定义功能的时候,可能不知道将来需要多少个参数,Java提供了一种可变参数的用法。
2,格式:
修饰符 返回值类型 函数名(形式参数....变量){
}
注意:
这里的变量其本质是该参数类型的一个数组。
这里会把调用这数据自动封装成一个数组。
如果一个方法中有可变参数,并且有多个形式参数,如果可变参数在前,会把所有的参数封装成一个数组,因此需要把可变参数放后面。
3,应用:
public static <T> List <T> asList(T...a)
把数组转成集合。
注意:
这里的数组应该是引用类型。
转换后的数组长度是固定的,不能做增删操作,可做修改操作。
public PrintWriter printf(String format,Object...args)
把后面的数据按照前面的格式输出。
格式:%d
Properties
1,是一个集合类hashtable的子类,内置了IO流的操作,是一个唯一能和IO流结合使用的集合类。
2,属性列表中键及其对应值都是一个字符串。
3,特有功能 :
添加:
Object setProperty(String key,String value)
获取:
String getProperty(String key)
String getProperty(String key,String defaultValue)
Set<String> stringPropertyNames()
//示例 Properties prop=new Properties(); prop.setProperty("01","hello"); prop.setProperty("02","world"); prop.setProperty("03","java"); Set<String> set=prop.stringPropertyNames(); for(String key:set){ String value=prop.getProperty(key); System.out.println(key+""+value); }
4,和IO流结合的功能:
a,list把集合中的数据写到文本文件。只能使用打印流。
b,load把文本文件中的数据加载到集合中。
c,store把集合中的数据写到文本文件。
5,案例:
Properties案例
序列化
1,Serialized,就是把对象按照流一样的操作。主要用于网络传输。
2,序列化和反序列化:
ObjectOutputStream
writeObject(Object obj)
ObjectInputStream
readObject(Object obj)
3,类通过 java.io.Serialized实现序列化接口,以启用序列化功能。
序列化接口是一个标记接口,如果一个类实现了这个接口,仅仅表示这个类的对象可以像流数据一样的存储或网络中传输。
4,注意事项:
a,类实现序列化接口,需要知道,这个类的对象可以像流一样使用。
b,实现序列化接口的类,是可以被序列化流操作的。
c,类实现序列化接口时,如果对类中的内容有所改动,将会读取失败,并报java.io.InvalidClassException异常,怎么解决?
一个类序列化的时候,会有一个标记值。
在生成class文件的时候也会有这个标记值。
在把该类对象往文件中存储的时候,同时会存储该标记值。
但是,如果修改了类的内容,它会自动生成一个新的标记值,这样就和原来的标记值不匹配了。
定义标记值:
因此需要定义一个标记值,可以自动生成,也可以自定义。
private static final long seriaVersionUID=10000;