JavaIO流(二)标准输入输出流,字符打印流,序列化,dataInputStream,dataOutputStream

标准输入流

数据源是标准输入设备(键盘鼠标、触摸屏)输入设备。在java中用System.in 得到一个InputStream字节输入流

InputStream in = System.in;

注意:

[1] 标准输入流以字节流流入内存,如果在控制台中输入字符,字符以默认编码(win简体:gbk)编码成字节进入标准输入流。

标准输出流(PrintStream)

数据目的地是标准输出设备(显示器)输出设备。java中用System.out得到一个PrintStream 输出流(字节打印流)。提供了更强大的

print

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     }

猜你喜欢

转载自www.cnblogs.com/qq308015824/p/10828533.html