实验简介
前面的预备知识我们花了很大篇幅给大家介绍Java中如何实现对数据的持久化管理,而不是停留在内存层面。总结下来基本上就是文件型持久化,或者数据库型持久化。所以本次实验,我们将利用文本文件的持久化操作来完成对WoniuATM的重构,使之更好地应用起来。
实验目的
1.掌握文本文件持久化的具体应用,解决实际问题。
2.加深对文本文件处理的理解,并在后续学习中继续应用。
实验流程
1.创建一个文本文件内容
在文本文件中,用每一行作为一条用户信息,主要保存用户名,密码和余额即可。同时用逗号来分隔每一个字段值(即CSV逗号分隔符文件),便于后续解析和处理该文件时以逗号作为标志。在当前项目根目录下新建一个目录“data”,并在该目录中新建一个文件文件“userdata.txt”,内容如下:
woniuxy,123456,1000.0 admin,654321,2000.0 qiang,666666,3000.0 zhangsan,111111,4000.0 |
2.设计一个公共类处理文本文件
首先,我们可以定义一个公共处理类:“FileHandler”,该类主要用于处理文本文件的读写操作,可规划如下功能:
(1)按行读取该文本文件内容,将每一行保存在一个List对象中并返回,用于简化读取文件的操作。因为一条用户信息就是一行,所以无论是用于后续读取详细的用户,密码,余额等信息还是写入这些信息,都能够比较方便地进行操作和重用。
(2)按用户名查询到某一行的用户信息,并将该用户信息保存到一个字符串数组中并返回,用于快速对用户信息进行查询。
(3)将文本内容写入到文本文件中,并通过参数传递来决定是覆盖写入还是将内容附加到后面。
(4)由于在转账或存取款过程中牵涉到余额的修改,所以此处牵涉到内容的更新,但是由于我们无法针对一个文件文件直接更新某一条用户信息的某一个字段,所以最好的处理方式是整体更新。
最终,根据上述功能要求,我们设计如下四个方法来完成功能处理:
package com.woniuxy.atm.three; import java.util.List; public class FileHandler { // 从userdata.txt文件中读取内容,并将每一行内容添加到一个List对象中 public List<String> readDataFromFile() { } // 从一个List对象中,根据用户名解析出来一条用户信息,保存在数组中并返回 public String[] getUserInfo(String username) { } // 往userdata.txt文件写入内容,并返回写入的成功状态 public boolean writeDataToFile(String content, boolean isAppend) { } // 当进行转账时,产生对整个文本文件的更新内容,用以修改双方账户的余额 public String generateUpdateData(String username, double money) { } } |
3.实现按行读取的方法“readDataFromFile”
public List<String> readDataFromFile() { // 定义一个List对象,用于代替数组的使用 List<String> contentList = new ArrayList<String>(); // 获取文件的路径 String userDir = System.getProperty("user.dir"); File file = new File(userDir + "\\data\\userdata.txt"); try { InputStream in = new FileInputStream(file); InputStreamReader reader = new InputStreamReader(in, "UTF-8"); BufferedReader br = new BufferedReader(reader); String line = ""; while ((line = br.readLine()) != null) { contentList.add(line); } } catch(Exception e) { e.printStackTrace(); } return contentList; } |
4.实现按用户名获取信息的方法“getUserInfo”
将用户名作为参数传递,并根据逗号分隔该用户名对应的某行内容的三列信息,最后将这三列信息保存到一个字符串数组中返回即可:
public String[] getUserInfo(String username) { List<String> contentList = this.readDataFromFile(); String[] userArray = new String[3]; for (int i=0; i<contentList.size(); i++) { // 利用字符串的split方法,可以将一行内容按分隔符分隔为一个数组 if (contentList.get(i).split(",")[0].equals(username)) { // 数组的第1个元素为用户名,第2个为密码,第3个为余额 userArray[0] = contentList.get(i).split(",")[0]; userArray[1] = contentList.get(i).split(",")[1]; userArray[2] = contentList.get(i).split(",")[2]; } } return userArray; } |
5.实现写入文件内容的方法“writeDataToFile”
该操作没有什么特别之处,只是将从参数传递进来的内容如实写入到文件中而已。
public boolean writeDataToFile(String content, boolean isAppend) { boolean isWriteOk = false; // 写入文件是否成功的标志 String userDir = System.getProperty("user.dir"); String fileName = userDir + "\\data\\userdata.txt"; File file = new File(fileName); try { OutputStream in = new FileOutputStream(file, isAppend); OutputStreamWriter writer = new OutputStreamWriter(in, "UTF-8"); BufferedWriter bw = new BufferedWriter(writer); bw.write(content, 0, content.length()); bw.flush(); bw.close(); writer.close(); in.close(); isWriteOk = true; } catch (Exception e) { isWriteOk = false; System.out.println("写入注册信息到文件时,出错." + e.getMessage()); } return isWriteOk; } |
6.实现产生更新内容的方法“generateUpdateData”
由于我们无法利用Java代码直接修改一个文件中的特定某一行内容,因为Java的文件处理方法只提供了读取和写入两在类型的接口。所以要实现对一个文本文件的更新操作,只能是将其文本内容全部读取出来,再对相应的行的内容进行修改,修改后再整体写入到文件。具体的实现代码如下:
public String generateUpdateData(String username, double money) { // 先获取到当前的用户信息,及 List<String> contentList = this.readDataFromFile(); String[] userInfo = this.getUserInfo(username); // 如果是转账给别人或取款,则money为负数,如果是存款或收款,money为正数 double balance = Double.parseDouble(userInfo[2]) + money; 版权所有,转载本站文章请注明出处:蜗牛学院在线课堂, http://quangtruong.net/note/194
提示:登录后添加有效评论可享受积分哦!
最新文章
|