所以,我试图在一个更高级的程序上实现序列化,但它不起作用,所以我try 了一个简单的测试,当我try 写入我的.ser文件

MAIN CLASS

import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;


public class App implements Serializable {
    public static void main(String[] args) throws Exception {
       person p = new person("John", 30);
        FileOutputStream fos = new FileOutputStream("person.ser");
        ObjectOutputStream oos = new ObjectOutputStream(fos);
        oos.writeObject(p);
        oos.close();
        fos.close();
    }
}

CLASS I WANT TO SERIALIZE

import java.io.Serializable;

public class person implements Serializable {
    private String name;
    private int age;
    person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    @Override
    public String toString() {
        return "helloworld";
    }
}

ERROR MESSAGE

Exception in thread "main" java.io.IOException: Access is denied
        at java.base/java.io.FileOutputStream.writeBytes(Native Method)
        at java.base/java.io.FileOutputStream.write(FileOutputStream.java:347)
        at java.base/java.io.ObjectOutputStream$BlockDataOutputStream.drain(ObjectOutputStream.java:1891)
        at java.base/java.io.ObjectOutputStream$BlockDataOutputStream.setBlockDataMode(ObjectOutputStream.java:1800)
        at java.base/java.io.ObjectOutputStream.<init>(ObjectOutputStream.java:251)
        at App.main(App.java:10)

这可能是一个非常简单的解决方案,但我完全不知所措.谢谢

UPDATE

我运行的是Windows 11,文件在工作区目录(Test\person.ser)中,java文件在Test\src\目录中,根据Visual Studio代码默认,它在Test\bin\目录中启动.只读是未选中的,我已try 以管理员身份运行.

推荐答案

你的Java代码根本没有什么问题.当我在我的(Linux)机器上运行它时,它就正常工作了.没有错误."person.ser"按预期在当前目录中创建.它在windows 上的表现也一样.

所以你的问题与你的电脑和你运行App代码的方式有关.操作系统告诉您不允许写入该文件.

但这不仅仅是文件权限.当我(故意)使"person.ser"文件不可写时,我会得到一个不同的堆栈跟踪:

$ java App 
Exception in thread "main" java.io.FileNotFoundException: person.ser (Permission 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 App.main(App.java:9)

请注意,打开文件时会引发异常.This is what I would expect to happen.

但在stacktrace中,文件打开(用于写入)已成功,当您试图将序列化头写入文件时,"权限被拒绝".

奇怪的很奇怪.

我怀疑当前目录和/或它所在的文件系统有些奇怪.是在远程安装的共享上吗?它在可移动设备上吗?文件系统本身是否设置为只读?它是否是一种不同寻常的文件系统类型(例如,不是NTFS)?你是在一个有某种"强制访问控制"强化的系统上运行它的,这种强化会阻止一些写操作吗?可能是一个过于激进的反病毒应用程序?

运行代码时,是否在预期位置创建了一个空的"person.ser"文件?你能删除它然后再试一次吗?这是可重复的吗?

你能写一个简单的程序,将"hello world"写入当前目录中名为"person.ser"的文本文件吗?that行吗?

Java相关问答推荐

虚拟线程似乎在外部服务调用时阻止运营商线程

当切换javaFX场景时,stage的大小正在Minimize

Spring boot:Bean和动态扩展器

Java中后期绑定的替代概念

参数值[...]与预期类型java.util.Date不匹配

多个Java线程和TreeMap.put()的非预期行为

Jlink选项&-strie-ative-Commands";的作用是什么?

确定Java中Math.Ranb()输出的上限

在Java Swing Paint应用程序中捕获快速鼠标移动时遇到困难

由于我在Main方法中关闭了 scanner ,但在该方法中创建了一个新的 scanner ,因此出现了错误

在Spring Boot中使用哪个Java类来存储创建时间戳?

把一条整型短裤和两条短裤装成一条长的

在JDK 1.8源代码中,为什么使用A-B 0来确定哪个更大,而不是A B?

如何将Java文档配置为在指定的项目根目录中生成?

在Oracle JDBC连接中,连接失效和身份验证失效是什么意思?

如何在Jooq中获取临时表列引用?

如何在Java springboot中从一个端点发送多个时间响应?

在缺少字段时使用Jackson With Options生成Optional.Empty()

Java嵌套流查找任意值

Spring Mapstruct如何获取Lazy初始化实体字段的信息?