对象操作流(序列化流)
每次读取和写出的都是JavaBean对象.
序列化:将对象写入到文件中的过程
反序列化:从文件中读取对象到程序的过程
transient: 标识瞬态,序列化的时候,该修饰符修饰的成员不能序列化
ObjectOutputStream
构造方法:
public ObjectOutputStream(OutputStream out) : 创建一个指定OutputStream的ObjectOutputStream。
特有方法:
public final void writeObject (Object obj) : 将指定的对象写出。
ObjectInputStream
构造方法:
public ObjectInputStream(InputStream in) : 创建一个指定InputStream的ObjectInputStream。
特有方法:
public final Object readObject () : 读取一个对象。
java.io.EOFException : 数据输出流到了末尾,继续读取会抛出此异常(读到文件的末尾)
解决方案:使用集合存储要写出的对象,写数据的时候只需要写一个集合对象,下次使用的时候只需要读取了一次就可以.
举个例子:
package review.serializable;
import lombok.*;
import java.io.Serializable;
import java.net.ServerSocket;
/**
* 创建学生类
* 利用lombok可以使用注解来写get,set等方法,使实体类看起来很简单
* @author WZLOVE
* @create 2018-07-25 19:17
*/
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class Student implements Serializable {
private static final long serialVersionUID = -1495868075552053159L;
private String name;
private int age;
private double score;
}
package review.serializable;
import java.io.*;
import java.util.ArrayList;
/**
* 测试序列化流
*
* @author WZLOVE
* @create 2018-07-25 19:19
*/
public class SerializableDemo {
public static void main(String[] args) throws IOException, ClassNotFoundException {
// 创建对象输出流
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("stu1.txt"));
// 向文件中输出数据(为了方便读取,所以存入集合,这样的话,读取的时候只用读取一次,查看源码也可以看出,集合也实现了Serializable接口)
ArrayList list = new ArrayList<>();
// 向集合中添加数据
list.add(new Student("stu1",23,100.0));
list.add(new Student("stu2",23,98.0));
list.add(new Student("stu3",24,96.0));
// 利用对象输入流向文件中写入内容
oos.writeObject(list);
oos.close();
// 创建对象输入流
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("stu1.txt"));
// 利用对象输入流获取文件内容
Object object = ois.readObject();
// 强制类型转换,将Object转换为集合
ArrayList arrayList = (ArrayList)object;
// 进行遍历
for (int i = 0; i < arrayList.size(); i++) {
System.out.println(arrayList.get(i));
}
// 关闭流
ois.close();
}
}
打印流(只有输出流)
字节打印流(了解)
PrintStream:
字符打印流(掌握)
PrintWriter
构造方法:
public PrintStream(String fileName) : 使用指定的文件名创建一个新的打印流。
PrintWriter(File file) 使用指定的文件创建一个新的PrintWriter,而不需要自动的线路刷新。
PrintWriter(OutputStream out) 从现有的OutputStream创建一个新的PrintWriter,而不需要自动线路刷新。
PrintWriter(Writer out) 创建一个新的PrintWriter,没有自动线冲洗(追加内容考虑参数的变化)。
PrintWriter(Writer out, boolean autoFlush)创建一个新的PrintWriter。
PrintWriter(OutputStream out, boolean autoFlush) 从现有的OutputStream创建一个新的PrintWriter。
特有方法(自动换行(实现自动换行,必须使用println方法)和自动刷新(在构造方法中启用并且要使用println()方法)功能):
void println(Object x) 打印一个对象,然后终止该行。
注意:
实现自动换行必须使用PrintWriter中特有的方法println
实现自动刷新必须满足两个要求,第一个是在构造方法中启用自动刷新,第二个是使用PrintWriter中特有的方法println
举个例子:
package review.print;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
/**
* 测试打印流的书写
* 打印流也是用写文件的,简单的是他能实现自动刷新和自动换行,其他的都简单,就不演示了
* 打印流分为打印字节流和打印字符流
* @author WZLOVE
* @create 2018-07-25 19:55
*/
public class PrintWriteDemo {
public static void main(String[] args) throws IOException {
// 打印流只有输出流
// 创建打印字符流对象(一个true表示追加,第二个true代表开启自动刷新)
PrintWriter pw = new PrintWriter(new FileWriter("pw.txt",true),true);
// 利用特有的方法进行输出(无论是自动刷新还是自动换行,都要利用这个特有的方法)
pw.println("qazxswedc,我爱你");
pw.println("qazxswedc,我爱你");
pw.println("qazxswedc,我爱你");
// 关闭流
pw.close();
}
}