You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

文件反序列化方法及生成指定随机数集合技术求助

嘿,我来帮你搞定这两个编程问题:

问题1:如何对文件进行反序列化操作?

反序列化就是把之前通过序列化写入文件的对象,重新恢复成内存中可操作的Java对象。这里给你一套标准的实现步骤和代码示例:

核心步骤:

    1. 打开一个FileInputStream,指向存储序列化对象的文件
    1. 用ObjectInputStream包装这个文件输入流,它专门处理对象的反序列化
    1. 调用readObject()方法读取对象,记得强制转换为目标类型
    1. 务必关闭流(推荐用try-with-resources语法,自动帮你关闭资源,避免内存泄漏)

代码示例:

import java.io.FileInputStream;
import java.io.ObjectInputStream;
import java.io.Serializable;

// 注意:要反序列化的类必须实现Serializable接口
class User implements Serializable {
    private static final long serialVersionUID = 1L; // 固定版本号,避免类结构变化导致反序列化失败
    private String name;
    private int age;

    // 构造方法、getter/setter省略
}

public class DeserializeExample {
    public static void main(String[] args) {
        // 用try-with-resources自动关闭流
        try (FileInputStream fis = new FileInputStream("user.ser");
             ObjectInputStream ois = new ObjectInputStream(fis)) {

            // 读取并转换为目标对象
            User user = (User) ois.readObject();
            System.out.println("反序列化成功:" + user.getName() + ", " + user.getAge());

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

注意事项:

  • 目标类必须实现Serializable接口,否则会抛出NotSerializableException
  • 类的serialVersionUID要保持和序列化时一致,不然可能反序列化失败
  • 要处理ClassNotFoundException(如果类的定义找不到)、IOException等异常

问题2:创建集合并填充20个1到15的随机整数

你原来的写法重复写了20次rand.nextInt,太冗余啦!这里给你两种更简洁的实现方式,而且能准确生成1到15(包含边界)的随机数:

方式1:用普通循环(兼容性好,适合所有Java版本)

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

public class RandomListExample {
    public static void main(String[] args) {
        Random rand = new Random();
        List<Integer> list1 = new ArrayList<>();

        // 循环20次,每次添加1-15的随机整数
        for (int i = 0; i < 20; i++) {
            // nextInt(15)生成0-14,加1后变成1-15
            list1.add(rand.nextInt(15) + 1);
        }

        System.out.println("生成的集合:" + list1);
    }
}

方式2:用Java 8+的Stream API(代码更简洁)

import java.util.List;
import java.util.Random;
import java.util.stream.Collectors;

public class RandomListStreamExample {
    public static void main(String[] args) {
        // ints(数量, 起始值(包含), 结束值(不包含)),所以1到16就是1-15的范围
        List<Integer> list1 = new Random().ints(20, 1, 16)
                                         .boxed() // 把int转换为Integer
                                         .collect(Collectors.toList());

        System.out.println("生成的集合:" + list1);
    }
}

关键说明:

  • rand.nextInt(15)生成的是0到14的整数,所以要加1才能得到1-15
  • 用ints(20,1,16)时,结束值是16(不包含),所以实际生成的是1到15的整数

内容的提问来源于stack exchange,提问作者user9676458363

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:23:05