1 数据流(了解)
1.1 概述
- 为了方便的操作java语言的基本数据类型和String类型的数据,可以使用数据流。
- 数据流的分类:
- DataInputStream
- DataOutputStream
- 常用方法:
public final boolean readBoolean(){}
public final void writeBoolean(boolean v){}
public final byte readByte(){}
public final void writeByte(int v){}
public final void writeChar(int v){}
public final char readChar(){}
public final float readFloat(){}
public final void writeFloat(float v){}
public final double readDouble(){}
public final void writeDouble(double v){}
public final short readShort(){}
public final void writeShort(int v){}
public final long readLong(){}
public final void writeLong(long v){}
public final int readInt(){}
public final void writeInt(int v){}
public final String readUTF(){}
public final void writeUTF(String str){}
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();
}
}
}
}
}