3

私はファイルのシリアル化と逆シリアル化を扱っています。さらに、私はで使用FileOutputStreamすることについてスタックしていObjectOutputStreamます。問題は、サーバー/クライアントチャットアプリケーションがあり、クライアントが接続されている場合は常に、接続されているクライアントが以前に登録されているかどうかをサーバーが確認する必要があることです。したがって、クライアントがサーバーに接続されると、サーバーは次のような出力ストリームを作成します。

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

このリストにこのオブジェクトが含まれているかどうかを確認するためのリンクリストを取得します。ただし、FileOutputStream内容のない新しいファイルを常に作成します。ファイルを追加するための2番目のパラメーターとして「true」値を渡すかどうかはわかりますが、この.txtファイルにはリンクリストであるオブジェクトが1つだけ含まれている必要があります。したがって、すべてのプロセスでリストを追加したくありません。どうすれば問題に対処できますか?ただ欲しいだけ

  • 内容のない特定のファイルがあり、オブジェクトを読み取らない場合は、リストを初めて追加するだけです。
  • 内容を含む指定されたファイルがある場合(つまり、リンクリストオブジェクトが1つしかない場合)、それを読み取り、新しいクライアントをリストに追加して、リンクリストオブジェクトをファイルに書き戻します。

私は私の問題についてあなたに明確になっていたことを願っています、そして私はすべての答えに感謝します。とにかくありがとう

編集:これは私が言おうとしていることの簡単な例です。

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は新しいファイルを開きます。ただし、true2番目のパラメーターに使用すると、リンクリストが追加されます。

4

2 に答える 2

5
  • 内容のない特定のファイルがあり、オブジェクトを読み取らない場合は、リストを初めて追加するだけです。
  • 内容を含む指定されたファイルがある場合(つまり、リンクリストオブジェクトが1つしかない場合)、それを読み取り、新しいクライアントをリストに追加して、リンクリストオブジェクトをファイルに書き戻します。


これは次の方法で実行できます。

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();
}
于 2013-03-24T14:27:22.257 に答える
4

これを試して:

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

FileOutputStream(文字列名、ブール値の追加)

指定された名前でファイルに書き込むファイル出力ストリームを作成します。2番目の引数がtrueの場合、バイトはファイルの先頭ではなく末尾に書き込まれます。このファイル接続を表すために、新しいFileDescriptorオブジェクトが作成されます。

于 2013-03-24T13:41:48.907 に答える