打印流
* 只有输出流
* printStream
* printWriter
* 可以打印任意类型的数据
* 有自动刷新功能,需要手动启动
* 可以直接操作文本的(这里说的直接操作文件就是有直接传入File对象的构造方法的流,高效流不可以操作文件)
* printWriter使用举例:
PrintWriter pw = new PrintWriter("fos.txt");
pw.write("hello");
pw.print(100);
pw.close();//该流需要刷新才能写入文件,close会刷新
/*
* 使用下面构造方法创建打印流对象时参数true表示开启自动刷新,
* 开启自动刷新后只能使用以下三个方法进行打印,其他方法不会自动刷新
* println()
* printf()
* format()
*/
PrintWriter pw = new PrintWriter(new FileWriter("fos.txt"), true);
pw.format("hello world");
标准输入输出流
* System类有2个成员变量
public static final InputStream in;//标准输入流
public static final PrintStream out;//标准输出流
* System.in
* 类型是InputStrema
* InputStream is = System.in;
* System.out
* 类型是PrintStream,是FileOutputStream的子类
* PrintStream ps = System.out;
* printStream.println = System.out.println
序列化和反序列化流
* ObjectOutputStream
* ObjectInputStream
* 使用举例:
* 定义一个类
* 重写toString()方法
* 实现Serializable接口
public class Animal implements Serializable {
private String color;
private String weight;
public Animal(String color, String weight) {
super();
this.color = color;
this.weight = weight;
}
@Override
public String toString() {
return "Animal [color=" + color + ", weight=" + weight + "]";
}
}
* 序列化一个对象后再反序列化
public static void main(String[] args) throws Exception {
Animal a = new Animal("red","50kg");
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("oos.txt"));
oos.writeObject(a);
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("oos.txt"));
Object obj = ois.readObject();
System.out.println(obj);
}
* 可能出现的问题
* java类在实现Serializable接口后会有一个序列化值标记这个类
* 如果修改了类中的属性则这个值也会发生变化
* 如果使用序列化流序列化一个类的对象之后更改了类的属性,序列化值发生变化,在发序列化的时候序列化会不匹配,发生异常
* 在类中生成一个固定的序列化值,这样即使修改了类中的属性,序列化值也不会发生变化
* 使用transient关键字修饰一个变量,该变量会在类的对象序列化时不被序列化
* 例如:private transient int age;