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
相关产品推荐
相关产品推荐

