1 数据流(了解)
1.1 概述
- 为了方便的操作java语言的基本数据类型和String类型的数据,可以使用数据流。
- 数据流的分类:
- DataInputStream
- DataOutputStream
- 常用方法:
- 读取boolean类型的数据:
public final boolean readBoolean(){}
public final void writeBoolean(boolean v){}
-
- 读取byte类型的数据:
public final byte readByte(){}
public final void writeByte(int v){}
-
- 读取char类型的数据:
public final void writeChar(int v){}
public final char readChar(){}
-
- 读取float类型的数据:
public final float readFloat(){}
public final void writeFloat(float v){}
-
- 读取double类型的数据:
public final double readDouble(){}
public final void writeDouble(double v){}
-
- 读取short类型的数据:
public final short readShort(){}
public final void writeShort(int v){}
-
- 读取long类型的数据:
public final long readLong(){}
public final void writeLong(long v){}
-
- 读取int类型的数据:
public final int readInt(){}
public final void writeInt(int v){}
-
- 读取String类型的数据:
public final String readUTF(){}
public final void writeUTF(String str){}
-
- 读取byte[]类型的数据:
public final void readFully(byte b[]){}
public void write(byte b[]){}
1.2 应用示例
- 示例:
package day20; import java.io.*; public class DataStreamTest { public static void main(String[] args) { DataOutputStream dataOutputStream = null; try { dataOutputStream = new DataOutputStream(new FileOutputStream("hello.txt")); dataOutputStream.writeBoolean(true); dataOutputStream.writeChar('a'); dataOutputStream.writeUTF("我是中国人"); } catch (IOException e) { e.printStackTrace(); } finally { if (dataOutputStream != null) { try { dataOutputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } } }
- 示例:
package day20; import java.io.*; public class DataStreamTest { public static void main(String[] args) { DataInputStream dataInputStream = null; try { dataInputStream = new DataInputStream(new FileInputStream("hello.txt")); boolean b = dataInputStream.readBoolean(); System.out.println("读取boolean类型的数据:" + b); char c = dataInputStream.readChar(); System.out.println("读取char类型的数据:" + c); String s = dataInputStream.readUTF(); System.out.println("读取String类型的数据:" + s); } catch (IOException e) { e.printStackTrace(); } finally { if (dataInputStream != null) { try { dataInputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } } }
2 对象流
2.1 概述
- ObjectInputStream和ObjectOutputStream是用于存储和读取基本数据类型数据或对应的处理流。
- 其强大之处在于可以把java对象写入到数据源中,也能把对象从数据源中还原回来。
- 序列化:用ObjectOutputStream类保存基本数据类型数据或对象的机制。
- 反序列化:用ObjectInputStream类读取基本数据类型数据或对象的机制。
- ObjectInputStream和ObjectOutputStream不能序列化static和transient修饰的成员变量。
2.2 对象的序列化
- 对象序列化机制允许把内存中的java对象转换成平台无关的二进制流,从而允许把这种二进制流持久化的保存在磁盘上,或通过网络将这种二进制流传输到另一个网络节点。当其他程序获取了这种二进制流,就可以恢复成原来的java对象。
- 序列化的好处在于可将任何实现了Serializable接口的对象转换成字节数据,使其在保存和传输的时候可以被还原。
- 序列化是RMI过程的参数和返回值都必须实现的机制,而RMI是JavaEE的基础。因此序列化机制是JavaEE平台的基础。
- 如果需要让某个对象支持序列化机制,则必须让对象所属的类及其属性是可序列化的,为了让某个类是可序列化的,该类必须实现Serializable,否则,会抛出NotSerializableException异常。
2.3 应用示例
- 示例:
package day20; import java.io.Serializable; public class Person implements Serializable { private String name; private Integer age; public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } }
package day20; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectOutputStream; /** * 对象流 */ public class ObjectStreamTest { public static void main(String[] args) { ObjectOutputStream objectOutputStream = null; try { objectOutputStream = new ObjectOutputStream(new FileOutputStream("object.txt")); Person person = new Person(); person.setName("张三"); person.setAge(12); objectOutputStream.writeObject(person); } catch (IOException e) { e.printStackTrace(); } finally { if (objectOutputStream != null) { try { objectOutputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } } }
package day20; import java.io.*; /** * 对象流 */ public class ObjectStreamTest { public static void main(String[] args) { ObjectInputStream objectInputStream = null; try { objectInputStream = new ObjectInputStream(new FileInputStream("object.txt")); Object o = objectInputStream.readObject(); if (o instanceof Person) { Person person = (Person) o; System.out.println("姓名:" + person.getName() + ",年龄:" + person.getAge()); } } catch (IOException | ClassNotFoundException e) { e.printStackTrace(); } finally { if (objectInputStream != null) { try { objectInputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } } }