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();
}
}
}
}
}
05-29 01:18