Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java-无法将对象作为文件写入目录_Java_File_Object_Io_Directory - Fatal编程技术网

Java-无法将对象作为文件写入目录

Java-无法将对象作为文件写入目录,java,file,object,io,directory,Java,File,Object,Io,Directory,我的程序有个奇怪的问题。 我编写了一个小程序,将对象写入特定目录中的文件 球员级别: 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

我的程序有个奇怪的问题。 我编写了一个小程序,将对象写入特定目录中的文件

球员级别:

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)
现在,程序已经创建了Player目录,出于某种原因,它还创建了一个子目录Player.ser

当我再次运行它时,它会工作并在players目录中创建一个Player.ser文件

当我用一个名为players的空目录运行它时,它也不会工作

注意:

查看此代码:

if (file.exists()) {
    file.delete();
    file.createNewFile();
} else {
    file.mkdirs();
    file.createNewFile();
}
您的意思是,如果players/Player.ser不存在,您应该将其创建为一个目录,然后再创建为一个文件。坏了

如果文件已经存在,您根本不需要删除它——您只需使用FileOutputStream,让它覆盖文件,并将其截断,这是默认行为

您只需要首先检查目录是否存在,例如

File file = new File(path);
File parent = file.getParentFile();
// TODO: Handle parent existing, but not being a directory,
// or file existing, but being a directory...
if (!parent.exists()) {
    parent.mkdirs();
}

try (OutputStream output = new FileOutputStream(file)) {
    // ...
}
请注意try with resources语句,这样即使引发异常,输出流也始终关闭。

请查看以下代码:

if (file.exists()) {
    file.delete();
    file.createNewFile();
} else {
    file.mkdirs();
    file.createNewFile();
}
您的意思是,如果players/Player.ser不存在,您应该将其创建为一个目录,然后再创建为一个文件。坏了

如果文件已经存在,您根本不需要删除它——您只需使用FileOutputStream,让它覆盖文件,并将其截断,这是默认行为

您只需要首先检查目录是否存在,例如

File file = new File(path);
File parent = file.getParentFile();
// TODO: Handle parent existing, but not being a directory,
// or file existing, but being a directory...
if (!parent.exists()) {
    parent.mkdirs();
}

try (OutputStream output = new FileOutputStream(file)) {
    // ...
}

请注意try with resources语句,这样即使引发异常,您的输出流也将始终关闭。

请查看Filemkdirs上的JavaDoc:

创建由此抽象路径名命名的目录

也就是说,假定该文件表示一个目录,因此将Player.ser创建为一个目录。使用file.getParentFile.mkdirs,请记住,根据路径的不同,可能没有父级


由于您的代码正在创建目录,因此对该文件对象的任何写入操作都将失败,因为您无法将数据直接写入目录。

请查看Filemkdirs上的JavaDoc:

创建由此抽象路径名命名的目录

也就是说,假定该文件表示一个目录,因此将Player.ser创建为一个目录。使用file.getParentFile.mkdirs,请记住,根据路径的不同,可能没有父级


由于您的代码正在创建目录,因此对该文件对象的任何写入操作都将失败,因为您无法将数据直接写入目录。

getParentFile而不是getParent:getParentFile而不是getParent:我相信您得到了您想要的结果。:-第一次,该文件不存在,因此您的程序执行file.mkdirs-这将创建目录播放器和目录播放器.ser。下次目录Player.ser存在时,您不会询问它是否是一个目录,只有当它存在时,您的程序才会删除该目录并创建一个文件。如果只有一个空的players目录,你会得到第一个行为,除了players目录没有被创建,因为它已经在那里了,其余的都是一样的。顺便说一句,你应该能够在一个小得多的例子中重现这种行为-我相信你得到了你想要的第一次,该文件不存在,因此您的程序执行file.mkdirs-这将创建目录播放器和目录播放器.ser。下次目录Player.ser存在时,您不会询问它是否是一个目录,只有当它存在时,您的程序才会删除该目录并创建一个文件。如果只有一个空的players目录,你会得到第一个行为,除了players目录没有被创建,因为它已经在那里了,其余的都是一样的。顺便说一句,你应该能够在一个小得多的例子中重现这种行为-