Не могу динамично изменить файл з параметрами загрузки

203
11 января 2017, 00:47

Очень нужна помощь.В Java не долго, так что костылей полно, прошу сильно не пинать). Есть клас Level1State в котором я вызываю saveProp() чтоб занести параметры в файл и lastLoad() чтобы получить параметры

public static GameProps p = new GameProps();
//saveProp 
public void saveProp(){
p.save(getHero(), hero.getHealth(), getXposition(), getYposition(),getState(),tileMap.getx(), tileMap.gety());
}
//lastLoad
public void lastLoad()
{
p.load();
tileMap.setPosition((double) p.loadInt().get(3), (double) p.loadInt().get(4));
}

Здесь собственно сам клас который все делает

public class GameProps {
String homeDir = System.getProperty("user.home");
final String settingsFilename = homeDir + File.separator + "mySettings.txt";
final Properties props = new Properties();
String hero_type;
int hero_health;
int hero_position_x;
int hero_position_y;
String game_state;
double tilemap_position_x;
double tilemap_position_y;
 public List<String> lines = new ArrayList<>();
public List<Integer> linesInt = new ArrayList<>();
FileOutputStream output;
 public void save(String hero_type, int hero_health, int hero_position_x, int hero_position_y,
        String game_state, double tilemap_position_x, double tilemap_position_y) {
    try {
        output = new FileOutputStream(settingsFilename);
    } catch (Exception ignore) {
    }
    try {
        props.setProperty("hero_type", hero_type);
        props.setProperty("hero_health", Integer.toString(hero_health));
        props.setProperty("hero_position_x", Integer.toString(hero_position_x));
        props.setProperty("hero_position_y", Integer.toString(hero_position_y));
        props.setProperty("game_state", game_state);
        props.setProperty("tilemap_position_x", Double.toString(tilemap_position_x));
        props.setProperty("tilemap_position_y", Double.toString(tilemap_position_y));
    } catch (NumberFormatException e) {
        this.hero_type = "Drago";
        this.hero_health = 2;
        this.hero_position_x = 10;
        this.hero_position_y = 10;
        this.game_state = "Level1State";
        this.tilemap_position_x = 0.0;
        this.tilemap_position_y = 0.0;
    }
    try {
        props.store(output, "Saved settings");
        output.close();
    } catch (IOException ex) {
    }
}
public void load() {
    try {
        FileInputStream input = new FileInputStream(settingsFilename);
            props.load(input);
    } catch (Exception ignore) {
    }
    hero_health = Integer.parseInt(props.getProperty("hero_health", Integer.toString(hero_health)));
    hero_type = props.getProperty("hero_type", hero_type);
    hero_position_x = Integer.parseInt(props.getProperty("hero_position_x", Integer.toString(hero_position_x)));
    hero_position_y = Integer.parseInt(props.getProperty("hero_position_y", Integer.toString(hero_position_y)));
    game_state = props.getProperty("game_state", game_state);
    tilemap_position_x = Double.parseDouble(props.getProperty("tilemap_position_x", Double.toString(tilemap_position_x)));
    tilemap_position_y = Double.parseDouble(props.getProperty("tilemap_position_y", Double.toString(tilemap_position_y)));
    Collections.addAll(lines, hero_type, game_state);
    Collections.addAll(linesInt, hero_health, hero_position_x, hero_position_y,
            (int) tilemap_position_x, (int) tilemap_position_y);
    System.out.println(linesInt.get(0));

}
public List<Integer> loadInt() {
    return linesInt;
}
public List<String> loadString() {
    return lines;
}
}

Когда запускаю прогу, последние сохраненные параметры загружаются, все ок, но они сохраняются только когда прога завершает свою роботу,а когда хочу сохранить во время эксплуатации то не получается.

Answer 1

проблема в том, что в методе Save вы сначала сохраняете состояние props, потом меняете состояние props

public void save(String hero_type, int hero_health, int hero_position_x, int hero_position_y,
        String game_state, double tilemap_position_x, double tilemap_position_y) {
    try {
        FileOutputStream output = new FileOutputStream(settingsFilename);
            props.store(output, "Saved settings"); // **вот тут вы сохраняете в файл** 
    } catch (Exception ignore) {
    }
   // **дальше меняйте  props** 
    try {
        props.setProperty("hero_type", hero_type);
        props.setProperty("hero_health", Integer.toString(hero_health));
        props.setProperty("hero_position_x", Integer.toString(hero_position_x));
        props.setProperty("hero_position_y", Integer.toString(hero_position_y));
        props.setProperty("game_state", game_state);
        props.setProperty("tilemap_position_x", Double.toString(tilemap_position_x));
        props.setProperty("tilemap_position_y", Double.toString(tilemap_position_y));
    } catch (NumberFormatException e) {
        this.hero_type = "Drago";
        this.hero_health = 2;
        this.hero_position_x = 10;
        this.hero_position_y = 10;
        this.game_state = "Level1State";
        this.tilemap_position_x = 0.0;
        this.tilemap_position_y = 0.0;
    }
 // метод завершается и последнее сохранение не пишем в файл.
}

Вам нужно кусок props.store(output, "Saved settings"); выполнить в конце метода save

READ ALSO
Получение файла

Получение файла

Есть следующие переменные, которые формируют из себя весь путь к файлу:

402
Override warning

Override warning

Есть класс

283
О логировании в java

О логировании в java

Приводится на хабре в статье библиотека Apache Commons Logging (не знаю смысл этой библиотеки, не юзал) и комментарий:

333
Deadlock при использовании wait и notify

Deadlock при использовании wait и notify

Сегодня приступил к изучению многопоточности на java, не понимаю, почему программа в некоторых случаях выдает корректный результат, а в остальных...

324