0

2 つのハッシュマップがあり、メニュー ボタンをクリックしたときに両方を保存し、それらをロードできるようにしたい (この例では、1 つだけ保存しています)。

void saveHash(HashMap<String, Object> hash, HashMap<String, Object> logicalMatrix2) {
    JFrame parentFrame = new JFrame();

    JFileChooser fileChooser = new JFileChooser();
    fileChooser.setDialogTitle("Especifique um diretório:");
    fileChooser.setAcceptAllFileFilterUsed(false);

    int userSelection = fileChooser.showSaveDialog(parentFrame);

    if (userSelection == JFileChooser.APPROVE_OPTION) {
        File fileToSave = new File(fileChooser.getSelectedFile() + ".alg");
        Set<Entry<String, Object>> entry = hash.entrySet();
        FileWriter outFile;
        try {
            outFile = new FileWriter(fileToSave.getAbsolutePath());
            PrintWriter out = new PrintWriter(outFile);
            out.println(entry);
            out.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }   
    }
}

これにより、entrySet() を txt ファイルに保存できますが、このコンテンツを再度読み込む方法がわかりません。ソフトウェアは HashMap が空の状態で開始し、ロード プロセスを通じて、それに応じてキーとそれぞれの値を入力できるようにしたいと考えています。しかし、それが txt ファイルに保存されていることを考えると、未知のキーを識別するために「読み取りループ」を実行するにはどうすればよいでしょうか? 各キーの値が ArrayList であると考えると、問題はさらに複雑になります。

どうもありがとうございました!

4

2 に答える 2

2

おそらく最も簡単な方法は、 PrintWriter の代わりにObjectOutputStreamを使用することであり、 ObjectInputStreamを使用して結果を読み取ることができます。これは、HashMap に含まれるオブジェクトがSerializableまたはExternalizable
のいずれかであると想定しています。 entrySet の代わりに HashMap 自体をシリアライズするだけです。オブジェクトのシリアル化を使用する際には、いくつかの考慮事項 (バージョン管理、一時オブジェクト、列挙型定数など) があるため、この件名について読んでおくことをお勧めします。

XMLEncoderXMLDecoderを使用すると、Java 環境の外部でファイルを読み取る必要がある場合や、人間が判読できるようにしたい場合に、移植性を高めることができます。

于 2013-05-14T23:42:46.723 に答える
0

他の人が言及したシリアライゼーションを使用する以外に、調査する別の方法は、JSON を永続的な形式として使用することです。これを実現するには、 Gsonを使用できます。

于 2013-05-15T01:43:28.227 に答える