0

オブジェクトをファイルに読み込む方法 ObjectInputStream および ObjectOutputStream クラスを使用して、このデモのカスタム クラス Student のオブジェクトを読み書きします。

書き込みおよび読み取り用のコード::

            try
            {
                if(af.filepath==null || af.filepath=="")//file path
                {
                    JOptionPane.showMessageDialog(null, "Please Set File Path", "File Path Error", JOptionPane.ERROR_MESSAGE);
                }
                else
                {
                    FileOutputStream fs=new FileOutputStream(af.filepath,true);
                    ObjectOutputStream fo=new ObjectOutputStream(fs);   
                    fo.writeObject(af.s);//write the Super Class Object
                    fo.close();
                }

            }
            catch (Exception ex)
            {
                    System.out.println(ex);
            }

   ---------------------------------------------------------------------------------
        try
        {
            if(af.filepath==null || af.filepath=="")//file path have whole path of the file
            {
                JOptionPane.showMessageDialog(null, "Please Set File Path", "File Path Error", JOptionPane.ERROR_MESSAGE);
            }
            else
            {
                Student sp;
                FileInputStream fs=new FileInputStream(af.filepath);
                ObjectInputStream fo=new ObjectInputStream(fs);
                while ((sp=(Student)fo.readObject())!=null) 
                {
                    sp.set();//for print object
                }
                fo.close();
            }

        }
        catch (Exception ex)
        {
                ex.printStackTrace();
        }

これを使用すると、ファイル内の最初のオブジェクトが読み取られますが、その後エラーが発生します

4

1 に答える 1

1

1 つのオブジェクトを書き込んで、複数のオブジェクトを読み取ろうとしています。2 番目のものを読み取ろうとすると、必ず例外が発生します。

不特定数のオブジェクトを読み返したい場合...そのように...ストリームにaを書き込むことをお勧めします:null

    fo.writeObject(null);

(javadoc にはこれができるとは書かれていませんが、Java Object Serialization 仕様にはできると書かれています。http://docs.oracle.com/javase/7/docs/platform/serialization/spec/output.html#933 を参照してください ... ステップ 3.)


もう 1 つの問題 (これが破損の原因です) は、シリアル化されたオブジェクトを既存のファイルに追加しようとしていることです。それはうまくいきません。シリアライゼーション プロトコルでは、ストリームはヘッダーとそれに続く 0 個以上のシリアライズされたオブジェクト、そしてファイルの終わりで構成されます。あるストリームを別のストリームに追加する場合 (たとえばFileOutputStream(path, true)、余分なヘッダーにより、結合されたファイルが、追加されたものが始まる時点で読み取り可能になります。

于 2013-10-21T08:10:44.400 に答える