问题
I have a problem with a file saving alogrithm.
error:
dec 11, 2012 4:56:18 PM tetris.FileIO loadHighscores
SEVERE: null
java.io.FileNotFoundException: file:\C:\Users\Koen\Dropbox\2TI\vgo\Eindwerk\Tetris\build\classes\tetris\LineHighscores.txt (De syntaxis van de bestandsnaam, mapnaam of volumenaam is onjuist)
at java.io.FileInputStream.open(Native Method)
at java.io.FileInputStream.<init>(FileInputStream.java:138)
at java.util.Scanner.<init>(Scanner.java:656)
at tetris.FileIO.loadHighscores(FileIO.java:44)
at tetris.FileIO.getLineScores(FileIO.java:31)
at tetris.FileIO.main(FileIO.java:69)
Exception in thread "main" java.lang.NullPointerException
at tetris.FileIO.loadHighscores(FileIO.java:49)
at tetris.FileIO.getLineScores(FileIO.java:31)
at tetris.FileIO.main(FileIO.java:69)
Java Result: 1
BUILD SUCCESSFUL (total time: 0 seconds)
idk what is wrong, this is a saveing algorithm for a small tetris game.
The files are saved under :
...\Eindwerk\Tetris\build\classes\tetris\LineHighscore.txt ...\Eindwerk\Tetris\build\classes\tetris\TimeHighscore.txt
I've added a main class to this class. paste it into your ide and run it, i get many errors
public class FileIO {
private File file;
private Scanner filescScanner, lineScanner;
private Writer fileWriter, lineWriter;
private String[][] data;
public FileIO () {
String[][] data = new String[100][1];
}
public String[][] getLineScores(){
return this.loadHighscores(this.getClass().getResource("LineHighscores.txt").toString());
}
public String[][] getTimeScores(){
return this.loadHighscores(this.getClass().getResource("TimeHighscores.txt").toString());
}
public String[][] loadHighscores(String path){
int x=0;
String test = "";
file = new File(path);
try {
filescScanner = new Scanner(file);
} catch (FileNotFoundException ex) {
Logger.getLogger(FileIO.class.getName()).log(Level.SEVERE, null, ex);
}
System.out.println(file.toString());
while((test=filescScanner.nextLine())!=null) {
lineScanner = new Scanner(test);
lineScanner.useDelimiter("-/-");
System.out.println(lineScanner);
System.out.println(lineScanner.toString());
data[x][0]=lineScanner.next();//name
data[x][1]=lineScanner.next();//data
x++;
}
lineScanner.close();
filescScanner.close();
return data;
}
public static void main(String[] args){
FileIO file = new FileIO();
System.out.println(file.getLineScores());
}
}
回答1:
The issue is that you are not passing a valid path to new File
. this.getClass().getResource("LineHighscores.txt")
returns a URL object. You're then getting a String representation of the URL object.
But when calling new File(String)
, the constructor expects a path name, not a String containing a file:// URL. Since "file:\C:\Users\Koen\Dropbox\2TI\vgo\Eindwerk\Tetris\build\classes\tetris\LineHighscores.txt" is not a valid Windows path name, an exception is thrown.
There are a few ways to address this. An easy method would be to use getResourceAsStream
instead of getResource().toString()
. Then change
public String[][] loadHighscores(String path){
int x=0;
String test = "";
file = new File(path);
try {
filescScanner = new Scanner(file);
} catch (FileNotFoundException ex) {
Logger.getLogger(FileIO.class.getName()).log(Level.SEVERE, null, ex);
}
to
public String[][] loadHighscores(InputStream resourceStream){
int x=0;
String test = "";
filescScanner = new Scanner(resourceStream);
This will allow you to read directly from the input files. And loadHighScores
no longer cares whether the data is coming from an actual File, or another location. This can be handy if you ever need to read from a resource within a jar file on the classpath. You won't be able to read it directly as a file, but using getResourceAsStream can give you the content.
来源:https://stackoverflow.com/questions/13829484/file-not-found-error-when-saving-txt-file