FileOutputStream открывает новый файл и удаляет содержимое всякий раз, когда он создается.

Я имею дело с сериализацией и десериализацией в файлах. Более того, я не согласен с использованием FileOutputStream с ObjectOutputStream. Проблема в том, что у меня есть приложение чата сервер/клиент, и всякий раз, когда клиент подключается, сервер должен проверять, зарегистрирован ли ранее подключенный клиент. Итак, когда клиент подключается к серверу, сервер создает выходной поток, например

FileOutputStream fos = new FileOutputStream("src\\example\\mainList.txt");

чтобы получить связанный список, чтобы проверить, содержит ли этот список этот объект или нет. Но FileOutputStream всегда создает новый файл без содержимого. Я знаю, передаю ли я «истинное» значение в качестве второго параметра для добавления файла, но этот файл .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 для второго параметра, он добавит связанные списки.


person quartaela    schedule 24.03.2013    source источник
comment
Что это удалено? Комментарий или что?   -  person    schedule 24.03.2013
comment
у меня есть объект связанного списка, который сериализуется в этом файле.   -  person quartaela    schedule 24.03.2013
comment
Если вы хотите добавить элементы, не сериализуйте объект списка. Вместо этого сериализуйте элементы один за другим. Таким образом, вы всегда можете использовать режим добавления.   -  person Eyal Schneider    schedule 24.03.2013
comment
хорошо, я не хочу добавлять связанные списки. я просто хочу прочитать объект связанного списка, который содержит клиентские объекты, и после некоторых операций проверки я снова запишу его в файл   -  person quartaela    schedule 24.03.2013
comment
связанный список всегда терпит неудачу, если вы выбираете несколько объектов, попробуйте сначала их десериализовать.   -  person    schedule 24.03.2013
comment
Что вы имеете в виду под выбором нескольких объектов? Потому что файл .txt будет содержать только один объект, который является связанным списком. Итак, запись .readObject за один раз будет работать правильно, чтобы получить список?   -  person quartaela    schedule 24.03.2013
comment
я добавляю РЕДАКТИРОВАТЬ по основному вопросу   -  person quartaela    schedule 24.03.2013


Ответы (2)


  • Если есть указанный файл без содержимого, не читайте объект, просто добавьте список только в первый раз
  • Если есть указанный файл с содержимым (имеется в виду, что есть только один объект связанного списка), то прочитайте его, добавьте нового клиента в список и запишите объект связанного списка обратно в файл.


Это можно сделать следующим образом:

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();
}
person Vishal K    schedule 24.03.2013

Попробуй это:

FileOutputStream fos = new FileOutputStream("src\\example\\mainList.txt" ,true);

FileOutputStream(строковое имя, логическое добавление)

Создает поток вывода файла для записи в файл с указанным именем. Если второй аргумент верен, то байты будут записаны в конец файла, а не в начало. Новый объект FileDescriptor создается для представления этого подключения к файлу.

person Achintya Jha    schedule 24.03.2013