【发布时间】:2016-10-07 15:00:51
【问题描述】:
我的程序有一个奇怪的问题。 我写了一个小程序,将对象写入特定目录中的文件。
玩家等级:
package readwrite;
import java.io.Serializable;
public class Player implements Serializable {
private String name;
private int level;
public Player(String name, int level) {
this.name = name;
this.level = level;
}
public String getName() {
return name;
}
public int getLevel() {
return level;
}
public void setName(String name) {
this.name = name;
}
public void setLevel(int level) {
this.level = level;
}
public String toString() {
return "Name: " + name + ", Level: " + level;
}
public void printInfo() {
System.out.println(this.toString());
}
}
PlayerReaderWriter-类:
package readwrite;
import java.io.*;
public class PlayerReaderWriter {
public static Player readPlayer(String path) {
Player p = null;
try {
FileInputStream fileIn = new FileInputStream(path);
ObjectInputStream in = new ObjectInputStream(fileIn);
p = (Player) in.readObject();
in.close();
fileIn.close();
} catch(IOException | ClassNotFoundException e) {
e.printStackTrace();
}
return p;
}
public static void writePlayer(String path, Player p) {
try {
File file = new File(path);
if (file.exists()) {
file.delete();
file.createNewFile();
} else {
file.mkdirs();
file.createNewFile();
}
FileOutputStream fileOut = new FileOutputStream(path);
ObjectOutputStream out = new ObjectOutputStream(fileOut);
out.writeObject(p);
out.close();
fileOut.close();
} catch(IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
Player p = new Player("Foo", 64);
p.printInfo();
writePlayer("players/Player.ser", p);
Player q = readPlayer("players/Player.ser");
q.printInfo();
}
}
问题是:当我第一次运行我的程序时,当目录“玩家”不存在时,我收到以下错误:
D:\Projects>java readwrite/PlayerReaderWriter
Name: Foo, Level: 64
java.io.FileNotFoundException: players\Player.ser (Access is denied)
at java.io.FileOutputStream.open0(Native Method)
at java.io.FileOutputStream.open(FileOutputStream.java:270)
at java.io.FileOutputStream.<init>(FileOutputStream.java:213)
at java.io.FileOutputStream.<init>(FileOutputStream.java:101)
at readwrite.PlayerReaderWriter.writePlayer(PlayerReaderWriter.java:34)
at readwrite.PlayerReaderWriter.main(PlayerReaderWriter.java:47)
java.io.FileNotFoundException: players\Player.ser (Access is deniedt)
at java.io.FileInputStream.open0(Native Method)
at java.io.FileInputStream.open(FileInputStream.java:195)
at java.io.FileInputStream.<init>(FileInputStream.java:138)
at java.io.FileInputStream.<init>(FileInputStream.java:93)
at readwrite.PlayerReaderWriter.readPlayer(PlayerReaderWriter.java:11)
at readwrite.PlayerReaderWriter.main(PlayerReaderWriter.java:49)
Exception in thread "main" java.lang.NullPointerException
at readwrite.PlayerReaderWriter.main(PlayerReaderWriter.java:50)
现在程序已经创建了“players”目录,并且由于某种原因它还创建了一个名为“Player.ser”的子目录。
当我第二次运行它时,它会工作并在“players”目录中创建一个“Player.ser”文件。
当我只用一个名为“players”的空目录运行它时,它也不起作用。
问候:)
【问题讨论】:
-
我相信你会得到你想要的。 :-) 第一次,该文件不存在,所以您的程序执行 file.mkdirs() — 这将创建目录播放器和 目录 Player.ser。下一次 Player.ser 目录存在(你没有问它是否是一个目录,只问它是否存在),所以你的程序删除目录并创建一个文件。只有一个空的玩家目录,你会得到第一个行为,除了玩家目录没有创建,因为它已经存在,其余的都是一样的。顺便说一句,您应该能够在一个更小的示例中重现该行为。 :-)
标签: java file object io directory