1

私はJavaコードのいくつかの行を持っています

class FileManager
{
    File f = new File("SD.DAT");

    public void wsv(ArrayList<Student> list) throws IOException
    {
        try
        {
            FileOutputStream fos = new FileOutputStream(f);
            ObjectOutputStream oos = new ObjectOutputStream(fos);
            oos.writeObject(list);
            fos.close();
            oos.close();
        }
        catch (FileNotFoundException ex)
        {
            Logger.getLogger(FileManager.class.getName()).log(L evel.SEVERE, null, ex);
        }
    }

    public ArrayList<Student> rsv() throws ClassNotFoundException, IOException
    {
        if (!f.exists())
        {
            return new ArrayList<SinhVien>();
        }

        ObjectInputStream ois = new ObjectInputStream(new FileInputStream(f));
        return (ArrayList<Student>) ois.readObject();
    }
}

質問したい:以下のコードでは、何をしますか?

public void wsv(ArrayList<Student> list) 

public ArrayList<Student> rsv()

平均?

なぜ戻らなければならないのか(ArrayList<Student>) ois.readObject();

配列についてはよくわかりませんので、見せていただければ幸いです。

どうもありがとう!

4

6 に答える 6

3
public void wsv(ArrayList<Student> list) 

これは、arrayListをパラメーターとして受け入れるメソッドです。arrayListは、Studentオブジェクトのコレクションです。したがって、次のように呼び出すことができます...

List<Student> myList = new ArrayList<Student>();
wsv(myList);

また、戻り値はありません(voidです)。以下の方法を検討してください。

public ArrayList<Student> rsv()

これは値(Student型のArrayList)を返す必要がありますが、メソッドパラメーターなしで呼び出されます。戻り値は、オブジェクトからArrayListにキャストされます...

return (ArrayList<Student>) ois.readObject();

キャスティングをざっと読むことを検討してください

于 2012-12-21T09:39:25.720 に答える
1

StudentクラスはSerializableインターフェースを実装していると思います。

このコードは、シリアル化/逆シリアル化の例です。メソッドwsv()では、StudentインスタンスのArrayListがシリアル化され、FileOutputStreamを使用してファイルに書き込まれます。他のメソッドrsv()では、同じファイルが読み取られ、同じファイルが読み取られ(ファイルが存在する場合)、ObjectInputStreamを使用してコンテンツが逆シリアル化され、結果がArrayListにキャストされて返されます。

オブジェクトのシリアル化と逆シリアル化の概要として、SerializableのJavadocを参照してください。

于 2012-12-21T09:39:55.917 に答える
1

最初の方法は::

public void wsv(ArrayList list)

私の観点からすると、wsvは書き込みを意味します。

StudentのarrayListをファイルに書き込みます

と::

public ArrayList rsv()

読むを意味します

ファイルからStudentのarrayListを読み取り、見つからない場合は新しいものを返します

これは、オブジェクトのシリアル化と逆シリアル化の例です

于 2012-12-21T09:40:24.740 に答える
1

(ArrayList<Student>) ois.readObject();
メソッドシグネチャ が

 public ArrayList<Student> rsv() throws ClassNotFoundException, IOException 

代わりにStudent型のArrayListを期待しています。

(ArrayList<Student>) ois.readObject(); 

シリアル化されたオブジェクトを読み取り、Student型のArrayListにキャストします。これは、メソッドから返されます。

于 2012-12-21T09:40:34.130 に答える
1

これらは両方ともメソッドシグネチャです。1つ目は、値で示される値を返さず、唯一の引数としてオブジェクトをvoid受け入れてArrayList含むメソッドを示します。Student

public void wsv(ArrayList<Student> list) 

return型のメソッドでは、メソッド本体にステートメントが存在するvoid必要はありません。return

2つ目は、オブジェクトArrayListを含み、引数を受け入れないを返します。Student

public ArrayList<Student> rsv()

publicはアクセス修飾子であり、メソッドの可視性、つまりメソッドをどこから呼び出すことができるかを制御します。

コードを分解すると、なぜ必要なのかがわかります(ArrayList<Student>) ois.readObject()

readObject()を返しますObject。これはメソッドから返すことはできませんArrayList<Student>。受け入れられるのは次の場合のみです。

final Object object = ois.readObject();

したがって、オブジェクトをキャストする必要があります。たとえば、別のタイプとして表示する必要があります。

final ArrayList<Student> students = (ArrayList<Student>) object;

これは、メソッドから返すことができます。

return students;

読み取られたオブジェクトが実際にタイプであることが確実である場合、この状況で、ある程度安全ににObjectをキャストできます。そうしないと、キャストが危険な状況になる可能性があり、不可能なタイプにキャストしようとすると、がスローされる可能性があります。たとえば、次のようになります。ArrayList<Student>ArrayList<Student>ClassCastException

final String string = (String) ois.readObject();

それがいくらか役立つことを願っています。

于 2012-12-21T09:52:39.973 に答える
1

残りのすべての答えは、問題をほぼ明確にしています。私はあなたの声明に照らしてこれを追加しようと思った:

配列についてはよくわかりませんので、見せていただければ幸いです。

array類似のデータ型のコレクションです。例: int num = new int[2]; データ型がの長さ2の配列を作成しますint

これで、intデータを入力できます。

言う:num[0] = 1, num[1] = 5

ただし、配列の長さは固定されています。

そのため、代わりにコレクションを使用します。あなたの場合ArrayList

ArrayList<Student>Objectタイプのsのコレクションであることを意味しStudentます。

于 2012-12-21T09:52:40.893 に答える