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

Java项目:如何生成随机二进制文件并加载HashSet与LinkedList?

Java从二进制文件加载HashSet和LinkedList的实现方案

没问题,我来一步步帮你搞定这个需求。核心思路很简单:先把随机生成的集合序列化到二进制文件(也就是你说的预先生成cards.dat和date.dat),再通过反序列化从文件里把集合加载回来。下面是完整的代码实现和细节说明:

1. 先搞定二进制数据文件的生成

首先我们需要一个工具类来生成这两个二进制文件,随机生成足够的元素存入集合,再写入文件。这里我用字符串模拟卡片数据,用LocalDate模拟日期数据,你可以根据自己的需求替换成其他类型(只要是可序列化的就行)。

import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
import java.time.LocalDate;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.Random;

public class GenerateDataFiles {
    public static void main(String[] args) {
        // 生成cards.dat:HashSet存储随机卡片字符串
        try (ObjectOutputStream oosCards = new ObjectOutputStream(new FileOutputStream("cards.dat"))) {
            HashSet<String> cardSet = new HashSet<>();
            Random random = new Random();
            // 生成20个不重复的卡片(确保至少10个)
            while (cardSet.size() < 20) {
                String card = "Card_" + String.format("%02d", random.nextInt(50) + 1);
                cardSet.add(card);
            }
            oosCards.writeObject(cardSet);
            System.out.println("cards.dat 生成完成,包含" + cardSet.size() + "个元素");
        } catch (Exception e) {
            e.printStackTrace();
        }

        // 生成date.dat:LinkedList存储随机日期
        try (ObjectOutputStream oosDates = new ObjectOutputStream(new FileOutputStream("date.dat"))) {
            LinkedList<LocalDate> dateList = new LinkedList<>();
            Random random = new Random();
            // 生成15个随机日期(确保至少10个)
            for (int i = 0; i < 15; i++) {
                // 生成2020-2025之间的随机日期
                LocalDate date = LocalDate.of(
                        2020 + random.nextInt(6),
                        1 + random.nextInt(12),
                        1 + random.nextInt(28)
                );
                dateList.add(date);
            }
            oosDates.writeObject(dateList);
            System.out.println("date.dat 生成完成,包含" + dateList.size() + "个元素");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

运行这个类,就能在项目根目录下得到cards.dat和date.dat两个二进制文件了。

2. 实现Test类加载集合

接下来就是你需要的Test类,包含main方法,从这两个文件里加载HashSet和LinkedList:

import java.io.FileInputStream;
import java.io.ObjectInputStream;
import java.util.HashSet;
import java.util.LinkedList;
import java.time.LocalDate;

public class Test {
    public static void main(String[] args) {
        HashSet<String> cardSet = null;
        LinkedList<LocalDate> dateList = null;

        // 从cards.dat加载HashSet
        try (ObjectInputStream oisCards = new ObjectInputStream(new FileInputStream("cards.dat"))) {
            // 反序列化时要强制转换为对应的集合类型
            cardSet = (HashSet<String>) oisCards.readObject();
            System.out.println("成功从cards.dat加载HashSet,元素数量:" + cardSet.size());
            System.out.println("HashSet元素示例:" + cardSet.stream().limit(5).toList());
        } catch (Exception e) {
            e.printStackTrace();
        }

        // 从date.dat加载LinkedList
        try (ObjectInputStream oisDates = new ObjectInputStream(new FileInputStream("date.dat"))) {
            dateList = (LinkedList<LocalDate>) oisDates.readObject();
            System.out.println("\n成功从date.dat加载LinkedList,元素数量:" + dateList.size());
            System.out.println("LinkedList元素示例:" + dateList.subList(0, 5));
        } catch (Exception e) {
            e.printStackTrace();
        }

        // 这里可以继续对两个集合进行后续业务操作
    }
}

关键注意事项

  • 可序列化要求:集合里的元素必须实现Serializable接口(String、LocalDate这些JDK自带类都已经实现了,如果是自定义类,一定要手动实现Serializable,否则会抛出序列化异常)。
  • 类型匹配:反序列化时的强制类型转换必须和序列化时的集合类型一致(比如序列化的是HashSet,就不能转成TreeSet)。
  • 文件路径:如果你的dat文件不在项目根目录,要写完整的绝对路径(比如"D:/project/data/cards.dat")。
  • 流的关闭:代码里用了try-with-resources语法,会自动关闭输入输出流,避免资源泄漏。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:40:07