-1
我需要一些关于Java文件IO操作的帮助。我试图追加序列化的对象到我的文件,但只有最后一个对象被追加到文件。 我尝试了很多建议,但没有成功。 我如何才能做到这一点,请帮忙?附加Java序列化对象
这里是我的代码:
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.Scanner;
public class Working {
String FILENAME = "E:\\assignment\\userpass\\userpass.txt";
Scanner sc = new Scanner(System.in);
String sUser = null, sPass = null, sRole = null;
Signup signup = new Signup();
public void createUser(){
System.out.println(" Enter username: ");
sUser = sc.next();
System.out.println(" Enter password: ");
sPass = sc.next();
System.out.println(" Enter Role: ");
sRole = sc.next();
Working obj = new Working();
signup.setUsername(sUser);
signup.setPassword(sPass);
signup.setRole(sRole);
obj.serializeUser(signup);
}
public void serializeUser(Signup signup){
FileOutputStream fout = null;
ObjectOutputStream oout= null;
File file = new File(FILENAME);
try{
// fout = new FileOutputStream(file);
// fout = new FileOutputStream(file.getAbsoluteFile(), true);
fout = new FileOutputStream(file, true);
// fout = new FileOutputStream(FILENAME);
oout = new ObjectOutputStream(fout);
oout.writeObject(signup);
System.out.println("User has been serialized");
} catch(Exception e){
e.printStackTrace();
} finally {
if(fout != null){
try{
fout.close();
} catch(IOException e){
e.printStackTrace();
}
}
if(oout != null){
try{
oout.close();
} catch(IOException e){
e.printStackTrace();
}
}
}
}
// for test purpose
public void showUsers(){
Working obj = new Working();
Signup add = obj.deserializeUser(FILENAME);
System.out.println(add);
}
// to show data
//test purpose
public Signup deserializeUser(String filename){
Signup userDetails = null;
File file = new File(FILENAME);
FileInputStream fin = null;
ObjectInputStream oin = null;
try{
fin = new FileInputStream(file);
oin = new ObjectInputStream(fin);
userDetails = (Signup) oin.readObject();
} catch(Exception ex){
ex.printStackTrace();
} finally{
if (fin != null) {
try {
fin.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (oin != null) {
try {
oin.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return userDetails;
}
}
我在这里已经检查: 1. http://www.enseignement.polytechnique.fr/informatique/Java/1.8/java/io/FileOutputStream.html#FileOutputStream-java.lang.String-boolean- 2. Appending to an ObjectOutputStream
快速浏览一下ObjectOutputStream文档并不会让我相信有一个writeObject的重载会追加新的对象。我认为这有很好的理由。您可能需要考虑不直接序列化对象,而是将其序列化为字符串,然后使用带附加选项的输出流将其写入文件。反序列化将涉及将文件中的每一行解组到新的Signup对象。或者,您可以序列化您的对象的集合,并从它解组相同的集合类型。 –
@MarkW'String'不是二进制数据的容器。 – EJP
@EJP我建议他将它序列化为一个字符串。他没有理由为什么他不能把他的东西放在一根绳子上。字符串可以是从XML到逗号分隔的字段键值对之间的任何内容。没关系。无论存储格式如何,序列化都是序列化的。 –