Не сохраняется прогресс. Как добавить функцию автосохранения/или функцию сохранения?
Не могу сохранить прогресс
package sudoku.persistance;
import sudoku.problemdomain.IStorage;
import sudoku.problemdomain.SudokuGame;
import java.io.*;
public class LocalStorageImpl implements IStorage {
private static File GAME_DATA = new File (
System.getProperty ("user.home"),
"gamedata.txt"
);
@Override
public void updateGameData(SudokuGame game) throws IOException {
try {
FileOutputStream fileOutputStream = new FileOutputStream(GAME_DATA);
ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);
objectOutputStream.writeObject(game);
objectOutputStream.close();
} catch (IOException e) {
throw new IOException("Unable to access Game Data");
}
}
@Override
public SudokuGame getGameData() throws IOException {
FileInputStream fileInputStream = new FileInputStream(GAME_DATA);
ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);
try {
SudokuGame gameState = (SudokuGame) objectInputStream.readObject();
objectInputStream.close();
return gameState;
} catch (ClassNotFoundException e) {
throw new IOException("File Not Found");
}
}
}
Методы зовутся в двух классах:
SudokuBuildLogic:
package sudoku.buildlogic;
import sudoku.computationlogic.GameLogic;
import sudoku.persistance.LocalStorageImpl;
import sudoku.problemdomain.IStorage;
import sudoku.problemdomain.SudokuGame;
import sudoku.userinterface.IUserInterfaceContract;
import sudoku.userinterface.logic.ControlLogic;
import java.io.IOException;
public class SudokuBuildLogic {
public static void build (IUserInterfaceContract.View userInterface) throws IOException, ClassNotFoundException {
SudokuGame initialState;
IStorage storage = new LocalStorageImpl();
try {
initialState = storage.getGameData();
} catch (IOException e) {
initialState = GameLogic.getNewGame();
storage.updateGameData(initialState);
}
IUserInterfaceContract.EventListener uiLogic
= new ControlLogic(storage, userInterface);
userInterface.setListener(uiLogic);
userInterface.updateBoard(initialState);
}
}
И в ControlLogic:
package sudoku.userinterface.logic;
import sudoku.computationlogic.GameLogic;
import sudoku.constants.GameState;
import sudoku.constants.Messages;
import sudoku.problemdomain.IStorage;
import sudoku.problemdomain.SudokuGame;
import sudoku.userinterface.IUserInterfaceContract;
import java.io.IOException;
public class ControlLogic implements IUserInterfaceContract.EventListener {
private IStorage storage;
private IUserInterfaceContract.View view;
public ControlLogic(IStorage storage, IUserInterfaceContract.View view) {
this.storage = storage;
this.view = view;
}
@Override
public void onSudokuInput(int x, int y, int input) {
try {
SudokuGame gameData = storage.getGameData();
int [][] newGridState = gameData.getCopyOfGridState();
newGridState[x][y] = input;
gameData = new SudokuGame(
GameLogic.checkForCompletion(newGridState),
newGridState
);
storage.updateGameData(gameData);
view.updateSquare(x, y, input);
if (gameData.getGameState() == GameState.COMPLETE) {
view.showDialog (Messages.GAME_COMPLETE);
}
} catch (IOException e){
e.printStackTrace();
view.showError(Messages.ERROR);
}
}
@Override
public void onDialogClick() {
try {
storage.updateGameData(
GameLogic.getNewGame()
);
view.updateBoard(storage.getGameData());
} catch (IOException e) {
view.showError(Messages.ERROR);
}
}
}
Метод getGameData() зовётся здесь:
package sudoku.problemdomain;
import java.io.IOException;
public interface IStorage {
void updateGameData (SudokuGame game) throws IOException;
SudokuGame getGameData () throws IOException;
}
Далее не разбираюсь
Вот весь код: https://github.com/shodmon/JavaDesktopSudokuDemo
Ответы (1 шт):
Автор решения: Дмитрий
→ Ссылка
Попробуйте так :
@Override
public void updateGameData(SudokuGame obj) throws IOException {
if (GAME_DATA.exists()) GAME_DATA.delete();
try (final ObjectOutputStream outputStream = new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream(GAME_DATA)))) {
outputStream.writeObject(obj);
outputStream.flush();
}
}
@Override
public SudokuGame getGameData() throws IOException, ClassNotFoundException {
try (final ObjectInputStream is = new ObjectInputStream(new BufferedInputStream(new FileInputStream(GAME_DATA)))) {
return (SudokuGame)is.readObject();
}
}