Reputation: 197
So, here's the problem. I'm making a game, and I'm having trouble with the file saving class that saves your progress. It is able to load default values in the file to create a new game, then restarts the game so the changes can take effect. The thing is, the default values are saved, but the game no longer recognizes them. then, when I manually delete the file, the same exact method is used to re-create the file, then the game recognizes it. Here is the class I used:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import mario.simulator.MarioSimulator;
/**
*
* @author Jaca
*/
public class filer {
private static File f;
private static BufferedReader br;
private static BufferedWriter bw;
private boolean docterlicense;
private boolean driverlicense;
private boolean policelicense;
private boolean finishedschool;
private boolean bullied;
private boolean messedtubby;
private boolean toadmode;
private long candy;
private long coin;
private long spaghetti;
private long cake;
private long water;
private long mushroom;
private long bomb;
private long gun;
private int hunger;
private long respawn;
private long swag;
private long awesome;
public filer(){
f = new File("resource\\config\\save.sav");
if(!f.exists()){
try {
f.createNewFile();
filer.reset();
br = new BufferedReader(new FileReader(f));
docterlicense = Boolean.parseBoolean(br.readLine());
policelicense = Boolean.parseBoolean(br.readLine());
finishedschool = Boolean.parseBoolean(br.readLine());
driverlicense = Boolean.parseBoolean(br.readLine());
bullied = Boolean.parseBoolean(br.readLine());
messedtubby = Boolean.parseBoolean(br.readLine());
toadmode = Boolean.parseBoolean(br.readLine());
candy = Long.parseLong(br.readLine());
coin = Long.parseLong(br.readLine());
spaghetti = Long.parseLong(br.readLine());
cake = Long.parseLong(br.readLine());
water = Long.parseLong(br.readLine());
mushroom = Long.parseLong(br.readLine());
bomb = Long.parseLong(br.readLine());
gun = Long.parseLong(br.readLine());
hunger = Integer.parseInt(br.readLine());
respawn = Long.parseLong(br.readLine());
swag = Long.parseLong(br.readLine());
awesome = Long.parseLong(br.readLine());
MarioSimulator.loadSave(docterlicense, policelicense, finishedschool, driverlicense, bullied, messedtubby, toadmode, candy, coin, spaghetti, cake, water, mushroom, bomb, gun, hunger, respawn, swag, awesome);
} catch (IOException ex) {
Logger.getLogger(filer.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
public static void reset(){
try {
bw = new BufferedWriter(new FileWriter(f));
bw.write("false");
bw.newLine();
bw.write("false");
bw.newLine();
bw.write("false");
bw.newLine();
bw.write("false");
bw.newLine();
bw.write("false");
bw.newLine();
bw.write("false");
bw.newLine();
bw.write("false");
bw.newLine();
bw.write("0");
bw.newLine();
bw.write("0");
bw.newLine();
bw.write("0");
bw.newLine();
bw.write("0");
bw.newLine();
bw.write("0");
bw.newLine();
bw.write("0");
bw.newLine();
bw.write("0");
bw.newLine();
bw.write("0");
bw.newLine();
bw.write("100");
bw.newLine();
bw.write("0");
bw.newLine();
bw.write("0");
bw.newLine();
bw.write("0");
bw.flush();
bw.close();
} catch (IOException ex) {
Logger.getLogger(filer.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
Any help is helpful.
Upvotes: 0
Views: 107
Reputation: 197
I see what I did. The program only reads the file if it doesn't exist! That was just me not paying attention to my code. Maybe, debugging it would be easier if I organize everything a little better, like this:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import mario.simulator.MarioSimulator;
/**
*
* @author Jaca
*/
public class filer {
private static File f;
private static BufferedReader br;
private static BufferedWriter bw;
private boolean docterlicense;
private boolean driverlicense;
private boolean policelicense;
private boolean finishedschool;
private boolean bullied;
private boolean messedtubby;
private boolean toadmode;
private long candy;
private long coin;
private long spaghetti;
private long cake;
private long water;
private long mushroom;
private long bomb;
private long gun;
private int hunger;
private long respawn;
private long swag;
private long awesome;
public filer(){
f = new File("resource\\config\\save.sav");
if(!f.exists()){ //creates the file if it does not exist
try {
f.createNewFile();
filer.reset(); //loads default values to new file
} catch (IOException ex) {
Logger.getLogger(filer.class.getName()).log(Level.SEVERE, null, ex);
}
}
this.read(); //reads the file
}
public void read(){ //reads the file, then passes variables to game thread
try {
br = new BufferedReader(new FileReader(f));
docterlicense = Boolean.parseBoolean(br.readLine());
policelicense = Boolean.parseBoolean(br.readLine());
finishedschool = Boolean.parseBoolean(br.readLine());
driverlicense = Boolean.parseBoolean(br.readLine());
bullied = Boolean.parseBoolean(br.readLine());
messedtubby = Boolean.parseBoolean(br.readLine());
toadmode = Boolean.parseBoolean(br.readLine());
candy = Long.parseLong(br.readLine());
coin = Long.parseLong(br.readLine());
spaghetti = Long.parseLong(br.readLine());
cake = Long.parseLong(br.readLine());
water = Long.parseLong(br.readLine());
mushroom = Long.parseLong(br.readLine());
bomb = Long.parseLong(br.readLine());
gun = Long.parseLong(br.readLine());
hunger = Integer.parseInt(br.readLine());
respawn = Long.parseLong(br.readLine());
swag = Long.parseLong(br.readLine());
awesome = Long.parseLong(br.readLine());
MarioSimulator.loadSave(docterlicense, policelicense, finishedschool, driverlicense, bullied, messedtubby, toadmode, candy, coin, spaghetti, cake, water, mushroom, bomb, gun, hunger, respawn, swag, awesome);
} catch (IOException ex) {
Logger.getLogger(filer.class.getName()).log(Level.SEVERE, null, ex);
}
}
public static void reset(){ //loads defaults values
try {
bw = new BufferedWriter(new FileWriter(f));
bw.write("false");
bw.newLine();
bw.write("false");
bw.newLine();
bw.write("false");
bw.newLine();
bw.write("false");
bw.newLine();
bw.write("false");
bw.newLine();
bw.write("false");
bw.newLine();
bw.write("false");
bw.newLine();
bw.write("0");
bw.newLine();
bw.write("0");
bw.newLine();
bw.write("0");
bw.newLine();
bw.write("0");
bw.newLine();
bw.write("0");
bw.newLine();
bw.write("0");
bw.newLine();
bw.write("0");
bw.newLine();
bw.write("0");
bw.newLine();
bw.write("100");
bw.newLine();
bw.write("0");
bw.newLine();
bw.write("0");
bw.newLine();
bw.write("0");
bw.flush();
bw.close();
} catch (IOException ex) {
Logger.getLogger(filer.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
It's amazing how badly a little error in the code can greatly mess up a program. For those begginner programmers out there, check your code thoroughly before unintentionally wasting other peoples time, like what I just did. Sorry, everybody!
Upvotes: 0
Reputation: 347204
Basically, you're ignoring the save file if it exists...
f = new File("resource\\config\\save.sav");
if(!f.exists()){
//...
} // And then what??
Instead, you should reset
the file and THEN load it anyway...
f = new File("resource\\config\\save.sav");
if(!f.exists()){
filer.reset();
}
try (BufferedReader br = new BufferedReader(new FileReader(f))) {
// Load the file...
} catch (IOException ex) {
Logger.getLogger(filer.class.getName()).log(Level.SEVERE, null, ex);
}
Make sure you are managing your readers and make the best effort to ensure they are closed appropriately, remember, if you create, you should close it.
If you're using Java 7+ you can use try-with-resources
as demonstrated above, otherwise you should have a finally
clause which closes and resources you might have opended (each will probably need there own try-catch
)
Upvotes: 5