嗨,我是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”永远存在,除非我添加更多内容,否则不会改变?
感谢您阅读这个较长的(也许是愚蠢的)问题。希望您能提供任何帮助!
答案 0 :(得分:2)
您可以通过两种方式运行程序:
答案 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;
}
}