0

「contacts.txt」として知られている、参照したファイルにユーザー入力を保存しようとしています。ユーザー入力を収集して電話帳形式で保存し、ユーザーがこのファイルに保存した情報に電話をかけられるようにする必要があります。「contacts.txt」ファイルに入力を書き込めません。これが参照している 2 つの関数は、以下に示すdoSave()doAddEntry()です。

私はこれに何時間も取り組んできましたが、レンガの壁にぶつかり、何百万ものデバッグを (おそらく間違って) 実行して、これがどこでうまくいかないのかを確認しました...

誰かが私を正しい軌道に乗せることができるかもしれない洞察を提供できますか?

<解決済み>

4

1 に答える 1

0

クラスを作成Entryし、ファイルに配列を保存し、ファイルに保存されたバイトのストリームからオブジェクトの配列を取得するために使用する必要があります。たとえば、以下のコードを考えてみましょう。を実装するクラスです。 の配列の本体内でが作成され、. この配列は、 を使用してファイルから読み戻されます。SerializableSerializationEntry objectsdeserializationPersonjava.io.Serializable marker interfaceSerializeArrayPersonPersons.sersaveArrayloadArray

import java.io.*;
class Person implements Serializable //Make Person class Serializable so that its objects can be serialized.
{
    private static final long SerialVersionUID = 20L;
    String name;
    int age;
    public Person(String name,int age)
    {
        this.name = name;
        this.age = age;
    }
    public String toString()
    {
        return "Name:"+name+", Age:"+age;
    }
}
public class SerializeArray 
{
    public static void saveArray(Person[] arr)throws Exception //writes the array of Person to a file "Persons.ser"
    {
        ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream("Persons.ser"));
        os.writeObject(arr);
        os.close();
    }
    public static Person[] loadArray()throws Exception //Reads the array of Persons back from file.
    {
        ObjectInputStream oin = new ObjectInputStream(new FileInputStream("Persons.ser"));
        Person[] arr = (Person[]) oin.readObject();
        oin.close();
        return arr;
    }
    public static void main(String[] args) throws Exception
    {
        Person[] arr= new Person[3];
        for (int i = 0 ; i < arr.length ; i++)
        {
            arr[i] = new Person("Person"+i,25+i);
        }
        System.out.println("Saving array to file");
        saveArray(arr);
        System.out.println("Reading array back from file");
        Person[] per = loadArray();
        for (Person p : per)
        {
            System.out.println(p);
        }
    }
}

更新
この概念をプログラムに組み込むには、まず Entry クラスの宣言を次のように変更する必要があります。

public class Entry implements java.io.Serializable

次に、doSave()メソッドを次のように変更します。

public void doSave() throws Exception {
        ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream("contacts.txt"));
        os.writeObject(entryList);
        os.close();
    }

次に、doLoad()メソッドを次のように変更します。

public void doLoad() throws Exception {
    if (length != 0) {
        //throw new Exception ("I'm not empty"); 
        //File c = new File ("contacts.txt");//No need to access the File here..
        Scanner input = new Scanner(c);
        while (input.hasNextLine()) {
            Entry e = new Entry();
            e.name = input.next();
            if ("q".equalsIgnorecase(e.name))
            break;
            e.number = input.next();
            e.notes = input.next();
            doAddEntry(e);
        }
        doAddEntry(null);
    }   
}

そしてdoAddEntry、次のようにメソッドを変更します。

public void doAddEntry(Entry entry) throws Exception {
    if (entry == null)
    {
      //save file here..
      doSave(); 
    }
    else if (length == 200) {
    //save file here..
    doSave(); 
    throw new Exception("I'm full");
   }
   else
   {
    boolean matched = false;
    for (int i = 0; i<length; i++) {
    if (entryList[i].name.compareToIgnoreCase(entry.name) == 0) {
      matched = true;
      break;
    }
    if(!matched)
    {
      entryList[entryList.length] = entry;
    }
   }
}

}

于 2013-04-03T19:28:01.390 に答える