对象流的使用

1.ObjectInputStream 和 ObjectOutputStream
2.作用:用于存储和读取基本数据类型数据或对象的处理流。它的强大之处就是可以把Java中的对象写入到数据源中,也能把对象从数据源中还原回来。
3.要想一个java对象是可序列化的,需要满足相应的要求。见Person.java

Person.java

import java.io.Serializable;


/**

 

 

 


Person需要满足如下的要求,方可序列化

 

 

 


1.需要实现接口:Serializable

 

 

 


2.当前类提供一个全局常量:serialVersionUID

 

 

 


3.除了当前Person类需要实现Serializable接口之外,还必须保证其内部所有属性

 

 

 


也必须是可序列化的。(默认情况下,基本数据类型可序列化)

 

 

 

 

 


补充:ObjectOutputStream和ObjectInputStream不能序列化static和transient修饰的成员变量

 

 

 

 

 


@author shkstart

 

 

 


@create 2019 上午 10:38

*/

public class Person implements Serializable{

 


public static final long serialVersionUID = 475463534532L;

 


private String name;

private int age;

private int id;

private Account acct;

 


public Person(String name, int age, int id) {

this.name = name;

this.age = age;

this.id = id;

}

 


public Person(String name, int age, int id, Account acct) {

this.name = name;

this.age = age;

this.id = id;

this.acct = acct;

}

 


@Override

public String toString() {

return "Person{" +

"name='" + name + ''' +

", age=" + age +

", id=" + id +

", acct=" + acct +

'}';

}

 


public int getId() {

return id;

}

 


public void setId(int id) {

this.id = id;

}

 


public String getName() {

return name;

}

 


public void setName(String name) {

this.name = name;

}

 


public int getAge() {

return age;

}

 


public void setAge(int age) {

this.age = age;

}

 


public Person(String name, int age) {

 

this.name = name;
this.age = age;

 


}

 


public Person() {

 


}

}

 

 

 


class Account implements Serializable{

public static final long serialVersionUID = 4754534532L;

private double balance;

 

@Override
public String toString() {
return "Account{" +
"balance=" + balance +
'}';
}

public double getBalance() {
return balance;
}

public void setBalance(double balance) {
this.balance = balance;
}

public Account(double balance) {

this.balance = balance;
}


this.name = name;
this.age = age;
@Override
public String toString() {
return "Account{" +
"balance=" + balance +
'}';
}

public double getBalance() {
return balance;
}

public void setBalance(double balance) {
this.balance = balance;
}

public Account(double balance) {

this.balance = balance;
}
}

4.序列化机制:
对象序列化机制允许把内存中的Java对象转换成平台无关的二进制流,从而允许把这种二进制流持久地保存在磁盘上,或通过网络将这种二进制流传输到另一个网络节点。当其它程序获取了这种二进制流,就可以恢复成原来的Java对象。

RandomAccessFile的使用
RandomAccessFile直接继承于java.lang.Object类,实现了DataInput和DataOutput接口
RandomAccessFile既可以作为一个输入流,又可以作为一个输出流
如果RandomAccessFile作为输出流时,写出到的文件如果不存在,则在执行过程中自动创建。如果写出到的文件存在,则会对原有文件内容进行覆盖。(默认情况下,从头覆盖)
可以通过相关的操作,实现RandomAccessFile“插入”数据的效果
示例代码:

/*
使用RandomAccessFile实现数据的插入效果
*/
@Test
public void test3() throws IOException {

RandomAccessFile raf1 = new RandomAccessFile("hello.txt","rw");

raf1.seek(3);//将指针调到角标为3的位置
//保存指针3后面的所有数据到StringBuilder中
StringBuilder builder = new StringBuilder((int) new File("hello.txt").length());
byte[] buffer = new byte[20];
int len;
while((len = raf1.read(buffer)) != -1){
builder.append(new String(buffer,0,len)) ;
}
//调回指针,写入“xyz”
raf1.seek(3);
raf1.write("xyz".getBytes());

//将StringBuilder中的数据写入到文件中
raf1.write(builder.toString().getBytes());

raf1.close();


RandomAccessFile raf1 = new RandomAccessFile("hello.txt","rw");

raf1.seek(3);//将指针调到角标为3的位置
//保存指针3后面的所有数据到StringBuilder中
StringBuilder builder = new StringBuilder((int) new File("hello.txt").length());
byte[] buffer = new byte[20];
int len;
while((len = raf1.read(buffer)) != -1){
builder.append(new String(buffer,0,len)) ;
}
//调回指针,写入“xyz”
raf1.seek(3);
raf1.write("xyz".getBytes());

//将StringBuilder中的数据写入到文件中
raf1.write(builder.toString().getBytes());

raf1.close();
}

posted @ 2022-04-19 15:51  93丶Fss  阅读(90)  评论(0)    收藏  举报