JavaIO流(二)标准输入输出流,字符打印流,序列化,dataInputStream,dataOutputStream
标准输入流
源数据源是标准输入设备(键盘、鼠标、触摸屏)等输入设备。在java中用System.in 得到一个InputStream字节输入流。
InputStream in = System.in;
注意:
[1] 标准输入流以字节流流入内存,如果在控制台中输入字符,字符以默认编码(win简体:gbk)编码成字节进入标准输入流。
标准输出流(PrintStream)
数据目的地是标准输出设备(显示器)等输出设备。在java中用System.out得到一个PrintStream 字节输出流(字节打印流)。提供了更强大的
println
打印方法用于打印各种数据类型。
字符打印流(PrintWriter)
继承于Writer,实现了PrintStream中的所有print方法。此类中的方法不会抛出异常。
比PrintStream多了
write(char[] buf) (写入字符数组。)
write(String s) (写入字符串)
等方法。
序列化:
将内存中的对象永久存储在硬盘中,称为对象序列化,也称永久化
把硬盘持久化的内存恢复到内存的过程称为对象反序列化。
Serializable
类通过实现 java.io.Serializable 接口以启用其序列化功能。未实现此接口的类将无法使其任何状态序列化或反序列化,并抛出异常
Serializable接口没有方法或字段,仅用于标识可序列化的语义
1 public class Student implements Serializable{ 2 // 。。。
序列化对象
ObjectOutputStream 继承于OutputStream,专门用于把对象序列化到本地。提供了
writeXXX
writeObject() 用于写入一个对象
1 public static void main(String[] args) throws IOException { 2 3 Student stu = new Student("001", "大狗", 20, Gender.男); 4 5 /** 6 * 方案1:取stu所有的属性,通过特定的字符串(-),把各个属性值连接起来 7 * 001-大狗-20-男 8 */ 9 10 File file = new File("d:\\javatest\\l.txt"); 11 FileOutputStream out = new FileOutputStream(file); 12 ObjectOutputStream oos = new ObjectOutputStream(out); 13 14 oos.writeObject(stu); 15 16 oos.close(); 17 out.close(); 18 }
反序列化对象
ObjectInputStream 继承于InputStream ,专门用于把本地持久化内容反序列化到内存,提供了
readXXX
readObject() 用于读取一个序列化内容并返回一个对象。
1 public static void main(String[] args) throws IOException, ClassNotFoundException { 2 3 File file = new File("d:\\javatest\\l.txt"); 4 5 6 FileInputStream in = new FileInputStream(file); 7 ObjectInputStream ois = new ObjectInputStream(in); 8 9 Student student = (Student) ois.readObject(); 10 System.out.println(student.getId()); 11 System.out.println(student.getName()); 12 System.out.println(student.getAge()); 13 System.out.println(student.getGender()); 14 15 ois.close(); 16 in.close(); 17 }
序列化版本
当序列化完成后,后期升级程序中的类(Student),此时再反序列化时会出现异常。
异常原因:序列化流的serialVersionUID和升级后类的版本不匹配。
解决方案:给Student类加序列化版本号,有两种方式
default serial version ID 生成默认的serial version ID 一般值都是1L。
generated serial version ID 根据当前类的属性、方法生成一个唯一ID。
public class Student implements Serializable { private static final long serialVersionUID = -1003763572517930507L;
transient
开发过程中,如果想忽略某些字段不让其序列化时,可以使用transient修饰。
public class Student implements Serializable { private static final long serialVersionUID = 7222966748321328300L; private String id; private transient String name; private transient int age; private Gender gender; private String phone;
DataInputStream/DataOutputStream
DataOutputStream 继承OutputStream,专门用于把基本java数据类型写入输出流。提供了writeXXX 写入基本java数据类型。
DataInputStream 继承于InputStream,允许应用程序以与机器无关方式从底层输入流中读取基本 Java 数据类型。
DataInputStream/DataOutputStream 特别适合读取/写入在网络传输过程中的数据流。
写入基本java数据类型
1 public static void main(String[] args) throws IOException { 2 3 File file = new File("d:\\javatest\\n.txt"); 4 FileOutputStream out= new FileOutputStream(file); 5 DataOutputStream dos = new DataOutputStream(out); 6 7 dos.writeInt(10); 8 dos.writeUTF("hello中国"); 9 10 dos.close(); 11 out.close(); 12 13 System.out.println("写入完成"); 14 15 }
读取基本java数据类型
1 public static void main(String[] args) throws IOException { 2 3 File file = new File("d:\\javatest\\n.txt"); 4 FileInputStream in = new FileInputStream(file); 5 DataInputStream dis = new DataInputStream(in); 6 7 int a = dis.readInt(); 8 String str = dis.readUTF(); 9 10 System.out.println(a); 11 System.out.println(str); 12 13 }