利用文件保存 Map 健值信息
Map<String,MobileCard> cards = new HashMap<String,MobileCard>();
Map<String,List<ConsumInfo>> consumInfos = new HashMap<String,List<ConsumInfo>>();
一、前景提要
1.1 cards 对象
cards 中,值的类型为 MobileCard 实体类
/**
* 嗖嗖移动卡
* @author ice_debj
*
*/
@SuppressWarnings("serial")
public class MobileCard implements Serializable{ private String cardNumber; // 卡号
private String userName; // 用户名
private String password; // 密码
transient private ServicePackage serpackage; // 所属套餐
private double price;
private double consumAmount; // 当月消费金额
private double money; // 账户余额
private int realTalkTime; // 当月实际通话时长
private int realSMSCount; // 当月实际发送短信条数
private int realFlow; // 当月实际上网流量 // get、set方法集
public String getCardNumber() {
return cardNumber;
}
public void setCardNumber(String cardNumber) {
this.cardNumber = cardNumber;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public ServicePackage getSerpackage() {
return serpackage;
}
public void setSerpackage(ServicePackage serpackage) {
this.serpackage = serpackage;
this.price = serpackage.getPrice();
}
public double getConsumAmount() {
return consumAmount;
}
public void setConsumAmount(double consumAmount) {
this.consumAmount = consumAmount;
}
public double getMoney() {
return money;
}
public void setMoney(double money) {
this.money = money;
}
public int getRealTalkTime() {
return realTalkTime;
}
public void setRealTalkTime(int realTalkTime) {
this.realTalkTime = realTalkTime;
}
public int getRealSMSCount() {
return realSMSCount;
}
public void setRealSMSCount(int realSMSCount) {
this.realSMSCount = realSMSCount;
}
public int getRealFlow() {
return realFlow;
}
public void setRealFlow(int realFlow) {
this.realFlow = realFlow;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
} // 显示信息
public String showMeg() {
return "MobileCard [cardNumber=" + cardNumber + ", consumAmount="
+ consumAmount + ", money=" + money + ", password=" + password
+ ", realFlow=" + realFlow + ", realSMSCount=" + realSMSCount
+ ", realTalkTime=" + realTalkTime + ", userName=" + userName
+ "]";
}
}
MobileCard 代码(非重点)
/**
* 品牌套餐,父类
* @author ice_debj
*
*/
public abstract class ServicePackage { private double price; // 套餐月资费 // get、set方法集
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
} // 显示套餐信息
public abstract String showInfo(); }
MobileCard 父类代码(非重点)
1.2 consumInfos 对象
consumInfos 中,值中所保存的为 ConsumInfo 对象的 List 集合框架
/**
* 消费信息
* @author ice_debj
*
*/
@SuppressWarnings("serial")
public class ConsumInfo implements Serializable{ private String cardNumber; // 卡号
private String type; // 消费类型
private double consumData; // 消费数据 public String getCardNumber() {
return cardNumber;
}
public void setCardNumber(String ardNumber) {
this.cardNumber = ardNumber;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public double getConsumData() {
return consumData;
}
public void setConsumData(double consumData) {
this.consumData = consumData;
} }
ConsumInfo 代码(非重点)
二、存
2.1 cards 对象,存信息核心思想
a.txt 文本文件以行为分隔,保存手机号,即 cards 的键
a?.txt 文本文件以 0、1、2…… 为 a 的后缀,保存对应手机号的基本信息,以序列化对象形式保存于文件夹,即 cards 的值
注:MobileCard 为实体类,需要实现 Serializable 接口
MobileCard 成员变量中 serpackage 为 ServicePackage 类对象,在此不将其序列化
2.2 consumInfos 对象,存信息核心思想
b.txt 文本文件以行为分隔,一行保存手机号,一行保存上条手机号的消费记录条数,即 consumInfo 的键
?b?.txt 文本文件,以 0、1、2…… 为 b 的前缀,以 0、1、2……为 b 的后缀,即 consumInfo 的值
注:一个手机有多条记录信息,因此 b 的前缀为对应手机号的序号,b 的后缀为当前手机号的 n 条消费记录
ConsumInfo 为实体类,需要实现 Serializable 接口
2.3 实现代码
// 存,集合框架至文本文件
public void saveInfoToFile(){
// 获取要保存信息的两个主要文件对象
File file1 = new File("d:/ls/ls/a.txt");
File file2 = new File("d:/ls/ls/b.txt");
if(!file1.exists()){
try {
file1.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
if(!file2.exists()){
try {
file2.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
// cards 获取数据并添加到文本中
FileWriter fw = null;
OutputStream fos = null;
ObjectOutputStream oos = null;
try {
fw = new FileWriter(file1);
int i=0;
for(Map.Entry<String, MobileCard> ent: cards.entrySet()){
fw.write(ent.getKey()+"\n");
MobileCard mc = ent.getValue();
/*
* 为避免代码过于混乱
* MobileCard 实体类中 ServicePackage serpackage 属性未序列化
* 将其成员变量保存至 price 成员变量中
*/
mc.setPrice(mc.getSerpackage().getPrice());
fos = new FileOutputStream("d:/ls/ls/a"+i+".txt");
oos = new ObjectOutputStream(fos);
oos.writeObject(mc);
i++;
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
oos.close();
fos.close();
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
// consumInfos 获取数据并添加到文本中
try {
fw = new FileWriter(file2);
int j=0;
for(Entry<String, List<ConsumInfo>> ent: consumInfos.entrySet()){
fw.write(ent.getKey()+"\n");
// 每条记录
ArrayList<ConsumInfo> list = new ArrayList<ConsumInfo>();
list = (ArrayList<ConsumInfo>) ent.getValue();
int i=0;
for(;i<list.size();i++){
// 每条记录中,list 形式的消费记录
ConsumInfo ci = list.get(i);
fos = new FileOutputStream("d:/ls/ls/"+j+"b"+i+".txt");
oos = new ObjectOutputStream(fos);
oos.writeObject(ci);
}
fw.write(i+"\n");
oos.flush();
j++;
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if(oos!=null){
oos.close();
}
if(fos!=null){
fos.close();
}
if(fw!=null){
fw.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
存
三、取
3.1 cards 对象,取信息核心思想
利用 BufferedReader 中 readLine() 方法读取数据,一行即即为一个手机号
在主循环中设置变量,用来获取保存 cards 对象中值的保存序列化对象的文件名
注:cards 对象中 serpackage 成员变量为 ServicePackage 类的对象,未被序列化,所以在此需要将其初始化
3.2 consumInfos 对象,取信息核心思想
主循环中外设置变量 int size=0,i=0,j=0; 分别对应:某条 map 键对应的,值保存的信息条数、读取行数、对应键的某个文本。
通过循环,奇数循环仅保存 consuminfos 键的值,偶数循环需要获取保存的键所对应值的条数。再通过循环获取序列化信息,保存至 list,循环结束后将其添加至 consumInfos 对象中。
注:在循环中,j:所指代的第几条键,因此需要在某条键的全部消费记录获取完成后,才仅需自增。
3.3 实现代码
// 取,文本文件至集合框架
public void initAddInfo(){
// 1、获取存放“键”文件的对象
File file1 = new File("d:/ls/ls/a.txt");
File file2 = new File("d:/ls/ls/b.txt");
File file = null;
// 1.1、判断文件是否存在
if(!file1.exists()){
try {
file1.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
if(!file2.exists()){
try {
file2.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
// 2、cards 对象,获取数据,添加到集合框架中
FileReader fr = null;
BufferedReader br = null;
try {
fr = new FileReader(file1);
br = new BufferedReader(fr);
String str = new String("");
int i=0;
while((str=br.readLine())!=null){
// 循环得到每行信息,得到的即为一个账户
file = new File("d:/ls/ls/a"+i+".txt");
FileInputStream fis = new FileInputStream(file);
ObjectInputStream ois = new ObjectInputStream(fis);
MobileCard mc = (MobileCard) ois.readObject();
/*
* 存数据时,为避免代码过于混乱
* 实体类 MobileCard 中成员变量 ServicePackage serpackage 没有序列化
* 现根据保存的另一参数进行初始化。
*/
ServicePackage serpackage = null;
switch((int)mc.getPrice()){
case 68:
serpackage = new NetPackage();
break;
case 58:
serpackage = new TalkPackage();
break;
default:
serpackage = new SuperPackage();
break;
}
mc.setSerpackage(serpackage);
System.out.println(mc.showMeg());
cards.put(str, mc);
i++;
ois.close();
fis.close();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} finally {
try {
br.close();
fr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
// consumInfos 获取文本数据并添加到集合框架中
try {
fr = new FileReader(file2);
br = new BufferedReader(fr);
String str = new String();
int size = 0; // 获得某条 map 中list 保存条数
int i=0; //控制读取行数
String str2 = ""; // 保存键
int j=0; // 控制对应键的某个文本
while((str=br.readLine())!=null){
if(i%2==0){
// 读取键
str2 = str;
}else{
List<ConsumInfo> list = new ArrayList<ConsumInfo>();
// 读取值
size = Integer.parseInt(str);
for(;size>0;size--){
file = new File("d:/ls/ls/"+j+"b"+(size-1)+".txt");
FileInputStream fis = new FileInputStream(file);
ObjectInputStream ois = new ObjectInputStream(fis);
list.add((ConsumInfo) ois.readObject());
}
j++;
consumInfos.put(str2, list);
}
i++;
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} finally {
try {
fr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
取
四、总结
操作过于烦锁,此程序仅为帮助更好的理解 文件读入、写出机制。
利用文件保存 Map 健值信息的更多相关文章
- Visual studio之C# 利用Settings保存COM口配置信息
背景 利用C#做一个串口通信项目,客户需求保存串口COM口的配置信息,在此利用Settings来进行保存. 正文 ".Settings"的创建 点击项目 --> 添加新项 - ...
- 获取保存在沙盒中plist文件的用户的字典信息
获取保存在沙盒中plist文件的用户的字典信息
- RABBITMQ/JAVA 客户端测试(再补:利用文件流)
(一)这里可以先复习一下java输入输出流和文件操作--- 1.File类保存文件或目录的各种元数据信息,包括文件名.文件长度.最后修改时间.是否可读.获取当前文件的路径名.判断指定文件是否存在.获取 ...
- Android数据保存之文件保存
前言: 上一篇文章写了在Android中利用SharedPreferences保存数据,SharedPreferences在保存数据的时候主要是保存一些应用程序的设置信息或者少量的用户信息,并且是以k ...
- PHP利用MySQL保存session
实现环境: PHP 5.4.24 MySQL 5.6.19 OS X 10.9.4/Apache 2.2.26 一.代码 CREATE TABLE `session` ( `skey` ) CHARA ...
- 背水一战 Windows 10 (95) - 选取器: 自定义文件保存选取器
[源码下载] 背水一战 Windows 10 (95) - 选取器: 自定义文件保存选取器 作者:webabcd 介绍背水一战 Windows 10 之 选取器 自定义文件保存选取器 示例1.演示如何 ...
- Vue 框架-03-键盘事件、健值修饰符、双向数据绑定
Vue 框架-03-键盘时间及健值修饰符 一.键盘事件,当按键盘时,在控制台输出提示 html 源码: <!DOCTYPE html> <html> <head> ...
- PHP利用MySQL保存session(php5.4之前的处理)
简介 使用MySQL保存session,需要保存三个关键性的数据:session id.session数据.session生命期. 考虑到session的使用方式,没必要使用InnoDB引擎,MyIS ...
- 完整的保存onetab的书签信息
之前在百度上找怎么完整的保存onetab的书签信息,没找到答案,于是乎上了google,在stackoverflow上找到了一个相关的答案 How to restore OneTab list of ...
随机推荐
- Delphi7 - Server Monitor开发并实现指定端口定时刷新、重启和邮件提醒等功能
项目背景 近期,总经办邮件反馈考勤数据频繁丢失,请IT排查其根本原因,并提供整改措施. 措不及防,这个项目当初并不是IT主导的,是设备部采购,然后协同软件供应商直接安装.部署和调试的,IT只是提供几个 ...
- node.js入门安装过程
本次随笔的目的是教大家如何安装 node.js安装 第一步:安装node环境 下载地址:https://nodejs.org/en/download/ 下载好后 对应一下你的node版本 ,傻瓜式安装 ...
- #华为云·寻找黑马程序员#【代码重构之路】使用Pattern的正确姿势
1.问题 在浏览项目时,发现一段使用正则表达式的代码 这段代码,在循环里执行了Pattern.matches()方法进行正则匹配判断. 查看matches方法的源码,可以看到 每调用一次matches ...
- 车标知识学习网页开发,与Flask通过base64展示二进制图片 #华为云·寻找黑马程序员#
万法同源 一直觉得可能自己不太适合搞技术,更适合在天桥底下支个摊子说书.技术的东西从来没人关注,扯东扯西的文章莫名的火.之前的一篇文章MarkDown添加图片的三种方式不管是在技术为主的CSDN还是娱 ...
- 转:logback的使用和logback.xml详解
一.logback的介绍 Logback是由log4j创始人设计的另一个开源日志组件,官方网站: http://logback.qos.ch.它当前分为下面下个模块: logback-core:其它两 ...
- js-编程练习题-输出年月日以及练习字符串分割,检索,转换整数(int)
这是在慕课网上看到的编程题-如有侵权,请联系本人删除. 当然:题是他们的,做题是我的...嘿嘿嘿 某班的成绩出来了,现在老师要把班级的成绩打印出来. 效果图: XXXX年XX月X日 星期X--班级总分 ...
- layer ui 多选下拉取值(全)
https://maplemei.gitee.io/xm-select/#/basic/create layer ui
- HotStuff共识协议详解
1. 前言 HotStuff提出了一个三阶段投票的BFT类共识协议,该协议实现了safety.liveness.responsiveness特性.通过在投票过程中引入门限签名实现了O(n)的消息验证复 ...
- iOS 弹窗alertView使用详解
转自:http://blog.it985.com/4321.html alertView是iOS自带的弹窗通知框,我们来看下默认样式的效果图 下面直接上代码 1 2 3 4 5 - (void)del ...
- Java修炼——内部类详解
内部类详解 定义:将一个类定义在另一个类的内部,该类就称为内部类 类中定义的内部类特点: 内部类作为外部类的成员,可以直接访问外部类的成员 (包括 private 成员),反之则不行. 内部类做为外部 ...