我正在处理文件中的序列化和反序列化。此外,我正在使用FileOutputStream
和ObjectOutputStream
。问题是我有服务器/客户端聊天应用程序,每当连接客户端时,服务器必须检查连接的客户端之前是否已注册。因此,当客户端连接到服务器时,服务器会创建一个输出流,如
FileOutputStream fos = new FileOutputStream("src\\example\\mainList.txt");
获取链表以检查此列表是否包含此对象。但是,FileOutputStream
始终创建一个没有内容的新文件。我知道如果我传递一个“true”值作为附加文件的第二个参数,但是这个.txt文件应该只包含一个作为链表的对象。因此,我不想在每个过程中附加一个列表。我如何处理问题?我只想要
我希望我对你的问题很清楚,我会对每一个答案表示赞赏。所以,谢谢
编辑:这是我想说的一个简单例子。public class PersonTest2 {
public static void main(String[] args) throws IOException, ClassNotFoundException {
LinkedList<Person> list = new LinkedList<Person>();
Person per = new Person("John","Thompson",22);
Person per2 = new Person("Suzie","Cash",23);
Person per3 = new Person("Peter","Jackson",24);
Person per4 = new Person("Michael","Coch",25);
list.add(per);
list.add(per2);
list.add(per3);
list.add(per4);
FileOutputStream fos = new FileOutputStream("person.txt");
BufferedReader br = new BufferedReader(new FileReader("person.txt"));
if (br.readLine() == null ) {
System.out.println("No errors, and file is empty");
}
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(list);
fos.close();
FileInputStream fis = new FileInputStream("person.txt");
ObjectInputStream ois = new ObjectInputStream(fis);
LinkedList<Person> list2;
list2 = (LinkedList) ois.readObject();
for (Iterator<Person> itr = list2.iterator(); itr.hasNext();) {
Person rper = itr.next();
System.out.println(rper.name + " " + rper.last_name + " " + rper.age);
}
}
}
每次运行此代码时,FileOutputStream都会打开一个新文件。但是,如果我使用true
作为第二个参数,它将附加链接列表。
答案 0 :(得分:4)
试试这个:
FileOutputStream fos = new FileOutputStream("src\\example\\mainList.txt" ,true);
FileOutputStream(String name,boolean append)
创建文件输出流以使用指定的文件写入文件 名称。如果第二个参数为true,则将写入字节 文件的结尾而不是开头。一个新的FileDescriptor 创建对象以表示此文件连接。
答案 1 :(得分:4)
- 如果有没有内容的特定文件没有读取对象,只需首次添加列表
- 如果指定的文件包含内容(意味着只有一个链表列表对象),则读取它,并将新客户端添加到 列表并将linkedlist对象写回文件。
您可以通过以下方式执行此操作:
File file = new File("person.txt");
boolean toWrite = false;
boolean toModify = false;
if (file.exists())
{
if (file.length() == 0)
{
toWrite = true;
}
else
{
toModify = true;
}
}
if (toWrite || !file.exists())
{
FileOutputStream fos = new FileOutputStream(file);
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(list);
fos.close();
oos.close();
}
else if (toModify)
{
FileInputStream fins = new FileInputStream(file);
ObjectInputStream oins = new ObjectInputStream(fins);
LinkedList<Person> temp = (LinkedList<Person>)oins.readObject();
fins.close();
oins.close();
temp.add(per);
temp.add(per2);
temp.add(per3);
temp.add(per4);
FileOutputStream fos = new FileOutputStream(file);
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(temp);
fos.close();
oos.close();
}