如何多次运行程序而又不会丢失数据?

时间:2019-03-23 04:14:44

标签: java

嗨,我是Java的新手,我什至不确定我是否在问一个有效的问题。但我会尽我所能来形容我。

我正在尝试永久保存数据,但是无论何时我重新运行程序或删除主要方法中的内容时,它都会重新启动。例如,考虑以下代码:

public class Player {
    private int wins;

    public Player {
        wins = 0; 
    }

    public getWins() {
        return wins;
    }

    public addWins() {
        this.win++;
    }
}

public class Game {
    public static void main(String[] args) {
        Player john = new Player();
        Player jayson = new Player();
        coinFlipMatch(john, jayson);
    }
    public void coinFlipMatch(Player p1, Player p2) {
        int coinFlip = (int) (Math.random() * 2 + 1);
        if (coinFlip == 0) {
            p1.addWins();
        } else {
            p2.addWins();
        }
    }
}

因此,基本上,我希望玩家赢得硬币掷骰游戏时的赢利增加。但是我只能做很多事情,因为我实际上希望获胜的人数永久保持在那儿。当然,如果我重新运行程序或删除主方法上的内容,“ int wins”的值将不会保留。但这就是我在这里的原因。我想知道这样的想法是否可能?我如何做到这一点,以使“ int wins”永远存在,除非我添加更多内容,否则不会改变?

感谢您阅读这个较长的(也许是愚蠢的)问题。希望您能提供任何帮助!

4 个答案:

答案 0 :(得分:2)

您可以通过两种方式运行程序:

  1. 商店在某些外部存储器中获胜。
  2. 您可以基于命令行的while循环,仅当您按“否”时才会退出。否则,它将再次接受输入。在这里,您可以将胜利存储在内存中。

答案 1 :(得分:1)

您好,欢迎来到Stack Overflow!

您已经注意到,程序完成执行后,将从内存中清除该程序,所有未保存的数据都会丢失。

这是为什么?

一台计算机只有这么多的内存,清除不需要的内存可以释放RAM并将其重新分配给新进程,从而保持计算机的平稳运行。

好吧,那么我如何保存数据并在程序启动,停止和重新启动时使用它们?

如果您希望跨程序的多次执行对某些数据进行持久存储(存储和调用),则需要以某种方式保存。有很多方法可以保存数据。您可以将其保存到本地文件系统,数据库中,或者将其发送到API以便由另一个系统保存,等等。

考虑到这一点,请花一些时间并考虑如何以及在何处保存数据。考虑到系统的要求,您选择的方法应该有意义。例如,如果您要为未连接到互联网的系统构建程序,那么使用API​​并不是一个好的选择。

一旦您决定,请添加注释以告知我您选择的方法,然后我将向您展示如何根据给定的方法保存数据。

答案 2 :(得分:0)

您的数据存储在内存中。 main()方法的运行完成后,程序结束,数据丢失。要保留数据,必须防止程序结束。

可以使用while循环来防止程序结束。

示例:

import java.util.Scanner;

public class Player {
    private int wins;

    public Player {
        wins = 0; 
    }

    public getWins() {
        return wins;
    }

    public addWins() {
        this.win++;
    } 
}

public class Game {

    public static void main(String[] args) {
        Player john = new Player();
        Player jayson = new Player();

        Scanner sc = new Scanner(System.in); 
        do{ 
           coinFlipMatch(john, jayson); 
           System.out.println("Press 1 to continue");
        }while(sc.nextInt()==1);

        // Here you can write the logic to which one of the players out of 2 won
    }
    public void coinFlipMatch(Player p1, Player p2) {
        int coinFlip = (int) (Math.random() * 2 + 1);
        if (coinFlip == 0) {
            p1.addWins();
        } else {
            p2.addWins();
        }
    } }

另一种选择是将数据存储在某些外部存储中,例如数据库。

答案 3 :(得分:0)

正如其他人已经指出的那样,数据可以保存在外部文件或数据库中。如果要成为独立程序,则可以使用Java序列化/反序列化,根据名称将数据保存在每个播放器的文件中。这样,您可以一次又一次地继续运行该程序。可以对其进行修改以将玩家名称作为参数,以便您可以每次为不同的玩家运行该程序。 这是使用相同代码的更新代码:

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

class Player implements java.io.Serializable {

    private int wins;
    private String name;

    public Player(String name) {
        this.wins = 0;
        this.name = name;
    }

    public int getWins() {
        return wins;
    }

    public void addWins() {
        this.wins++;
    }

    public String getName() {
        return name;
    }

    @Override
    public String toString() {
        return "Name: " + this.getName() + "; Wins: " + this.getWins();
    }
}

public class Game {

    public static void main(String[] args) {
        Player john = deserializePlayer("john");
        if (john==null) {
            john = new Player("john");
        }

        Player jayson = deserializePlayer("jayson");
        if (jayson==null) {
            jayson = new Player("jayson");
        }

        coinFlipMatch(john, jayson);
        serializePlayer(john);
        serializePlayer(jayson);
    }

    public static void coinFlipMatch(Player p1, Player p2) {
        double random = Math.random();
        System.out.println("Random: " + random);
        int coinFlip = (int) (random * 2 );
        System.out.println("coinFlip " + coinFlip);
        if (coinFlip == 0) {
            p1.addWins();
        } else {
            p2.addWins();
        }
    } 

    public static void serializePlayer(Player object) {
        // Serialization
        try
        {
            //Saving of object in a file
            FileOutputStream file = new FileOutputStream(object.getName());
            ObjectOutputStream out = new ObjectOutputStream(file);

            // Method for serialization of object
            out.writeObject(object);

            out.close();
            file.close();

            System.out.println(object.toString());
        }
        catch(IOException ex)
        {
            System.out.println("IOException is caught");
        }
    }

    public static Player deserializePlayer(String filename) {
        Player player = null;
        try
        {
            File f = new File(filename);
            if(f.exists() ) {
                // Reading the object from a file
                FileInputStream file = new FileInputStream(filename);
                ObjectInputStream in = new ObjectInputStream(file);

                // Method for deserialization of object
                player = (Player) in.readObject();

                in.close();
                file.close();

                System.out.println(player.toString());
            } else {
                System.out.println("Player " + filename +  " doesnt exist");
            }
        }
        catch(IOException ex)
        {
            System.out.println("IOException is caught");
        }
        catch(ClassNotFoundException ex)
        {
            System.out.println("ClassNotFoundException is caught");
        }
        return player;
    }
}