序列化:附加到 Java 中的目标文件
Serialization: Appending to Object Files in Java
我最近为用户制作了一个连续文件。当用户尝试登录时,我会读到它。如果新用户注册,则将用户添加到其中。但是每当我添加新用户时,我添加的先前记录都会被删除。有没有办法将对象附加到串行文件?
P.S 我正在使用包含用户名、密码、角色(教师或学生)和分数 (int) 变量的用户对象。
public static void addRecordStudent(String userName, String password, String role, int score)
{
openFile();
try
{
// create new record; this example assumes valid input
User usr = new User(userName, password, role, score);
// serialize record object into file
output.writeObject(usr);
}
catch (NoSuchElementException elementException)
{
System.err.println("Invalid input. Please try again.");
}
catch (IOException ioException)
{
System.err.println("Error writing to file. Terminating.");
}
closeFile();
}
public static void openFile()
{
try
{
output = new ObjectOutputStream(Files.newOutputStream(Paths.get("users.ser")));
}
catch (IOException ioException)
{
System.err.println("Error opening file. Terminating.");
System.exit(1); // terminate the program
}
}
public static void closeFile()
{
try
{
if (output != null)
output.close();
}
catch (IOException ioException)
{
System.err.println("Error closing file. Terminating.");
}
}
您必须明确选择附加到文件 - 否则旧内容将被替换:
Files.newOutputStream(file, StandardOpenOption.APPEND)
除此之外,每次您创建新的 ObjectOutputStream 时都会启动新的流。您将无法使用单个 ObjectInputStream 读回它们。您可以避免使用 this trick
如果文件不是太大,读取所有现有对象然后使用单个 ObjectOutputStream 写回现有对象和新对象可能是更好的主意。
我最近为用户制作了一个连续文件。当用户尝试登录时,我会读到它。如果新用户注册,则将用户添加到其中。但是每当我添加新用户时,我添加的先前记录都会被删除。有没有办法将对象附加到串行文件? P.S 我正在使用包含用户名、密码、角色(教师或学生)和分数 (int) 变量的用户对象。
public static void addRecordStudent(String userName, String password, String role, int score)
{
openFile();
try
{
// create new record; this example assumes valid input
User usr = new User(userName, password, role, score);
// serialize record object into file
output.writeObject(usr);
}
catch (NoSuchElementException elementException)
{
System.err.println("Invalid input. Please try again.");
}
catch (IOException ioException)
{
System.err.println("Error writing to file. Terminating.");
}
closeFile();
}
public static void openFile()
{
try
{
output = new ObjectOutputStream(Files.newOutputStream(Paths.get("users.ser")));
}
catch (IOException ioException)
{
System.err.println("Error opening file. Terminating.");
System.exit(1); // terminate the program
}
}
public static void closeFile()
{
try
{
if (output != null)
output.close();
}
catch (IOException ioException)
{
System.err.println("Error closing file. Terminating.");
}
}
您必须明确选择附加到文件 - 否则旧内容将被替换:
Files.newOutputStream(file, StandardOpenOption.APPEND)
除此之外,每次您创建新的 ObjectOutputStream 时都会启动新的流。您将无法使用单个 ObjectInputStream 读回它们。您可以避免使用 this trick
如果文件不是太大,读取所有现有对象然后使用单个 ObjectOutputStream 写回现有对象和新对象可能是更好的主意。