java 练习(简易银行项目)

从开始接触JAVA 到现在应该有一个月了,学习的时候,发现很多人都说JAVA很简单,但经过一段时间的学习,发现JAVA 实际上属于那种易于上手 想精通确实很难,里面涉及的各个方法的封装,基本上完整的包括了操作系统,数据结构等多方面的计算机的基础知识,算是博大精深了。而俺也发现网上很多搞C++的程序员均对JAVA比较鄙视,认为搞JAVA的不算搞技术的。。。而我的问题确是,,,JAVA 表面一看确实很简单,各种封装完美的接口,类,基本已经涉及到计算机功能的全部了,只需要调用这些封装类,根据需要来控制流程就好了,没什么难的。但如果大家深究它的内部实现机制,便会发现各种类的设计与实现都是很精巧的。不要老是说JAVA怎么怎么样,在真正的高手眼里,JAVA绝对是占有一席之地的!。。。吐槽得有点口渴了。。。还是贴一些关键代码吧,如有不足,还望各位大牛给出改进意见,感激不尽!

银行体系代码(链表结构 综合 树结构 实现):

import java.io.File;
import java.io.FileNotFoundException;
import java.math.BigDecimal;
import java.net.Socket;


class BCIC {
 private int money_total;/* 总行的现金余额 */
 private BIC_LIST b_list;/* 总行下属支行列表 */
 
 public int BCIC_calculate() /* 构造BCIC的CLASS并合计出银行余额,所有实例生成结束开始执行 */
 {
  int money = 0;
  int count = 0;
  BIC ptr = b_list.head;
  while (count < INIT_DATA.getBic_num()) {
   File fp = ptr.a_list;
   MemeryMap mm = null;
   try {
    mm = new MemeryMap(fp);
   } catch (FileNotFoundException e) {
    e.printStackTrace();
   }
   for(int i = 1;i<=100;i++)
   {
    if(i!=1)
     mm.theLine(i);
    try {
     mm.setData_cell();
    } catch (FileNotFoundException e) {
     e.printStackTrace();
    }
    String[] data = mm.getData_cell();
    BigDecimal bd = new BigDecimal(data[3]);
    money += bd.intValue();  
   }
   ptr = ptr.brother;
   count++;
  }
  this.money_total = money;
  System.out.println("总行经各个支行核算上报汇总,现金余额为  : " + this.money_total);
  return money;
 }

 public BCIC(Socket socket) {
  setMoney_total(0);
  setB_list(new BIC_LIST(this,socket));
  System.out.println("BCIC初始化成功");
 }

 public int getMoney_total() {
  return money_total;
 }

 public void setMoney_total(int money_total) {
  this.money_total = money_total;
 }

 public BIC_LIST getB_list() {
  return b_list;
 }

 public void setB_list(BIC_LIST b_list) {
  this.b_list = b_list;
 }
 
}

import java.io.IOException;
import java.net.Socket;

public class BIC_LIST {
 /* 总行下属列表 */
 public BIC head;
 
 public Socket socket;
 
 public BIC_LIST(Socket socket) {
  this.socket = socket;
  this.head = null;
 }
 
 public BIC_LIST(BCIC p,Socket socket) {
  BIC ptr = null;
  BIC rear = null;
  int count = 0;
  while (count < INIT_DATA.getBic_num()) {
   if (count == 0) {
    BIC bic = null;
    try {
     bic = new BIC(p,socket);
    } catch (IOException e) {
     e.printStackTrace();
    }
    ptr = bic;
    rear = bic;
    count++;
   } else {
    BIC bic = null;
    try {
     bic = new BIC(p,socket);
    } catch (IOException e) {
     e.printStackTrace();
    }
    bic.brother = ptr;
    ptr = bic;
    count++;
   }
  }
  this.head = ptr;
  rear.brother = this.head;
 }
}

 

import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.math.BigDecimal;
import java.net.Socket;

public class BIC {
 /* 支行类 */
 public Socket socket;
 public BCIC boss;
 public BIC brother;/* 支行链表连接 */
 public File a_list;/* 支行账户信息列表 */
 public ATM atm1;/* ATM一号机初始化 */
 public ATM atm2;/* ATM二号机初始化 */

 public boolean account_done(DATA data) throws
IOException, InterruptedException
 {
  PrintWriter pw = null;
  try {
   pw = new PrintWriter(socket.getOutputStream(),true);
  } catch (IOException e) {
   e.printStackTrace();
  }
  printer.bic();
  if ((data.want != 0 && data.want != 1 && data.want != 2) || data.money < 0) {
   System.out.println("数据处理过程错误!");
   return false;
  }
  int count = 0;
  BIC p = this;
  while(count < INIT_DATA.getBic_num())
  { 
   MemeryMap mm = new MemeryMap(p.a_list);
   int line = 0;
   System.out.println(data.cardid);
   if ((line = mm.findTheLine(data.cardid)) != 0) {
    System.out.println("已经找到账户,开始账户处理。。。请稍候。。。");
    if(line != 1)
     mm.theLine(line);
    mm.setData_cell();
    System.out.println("用户名为: "+mm.getData_cell()[0]+"银行卡号为:" + mm.getData_cell()[2] + "的账户,账户余额为:"
      + mm.getData_cell()[3]);
    if (dowiththemoney(mm, data)) {
     pw.println("*************************************");
     pw.println("银行卡号为:" + mm.getData_cell()[2]);
     pw.println("账户余额为:"+ mm.getData_cell()[3]);
     pw.println("操作成功!");
     System.out.println("银行卡号为:" + mm.getData_cell()[2] + "的账户,账户余额为:"
       + mm.getData_cell()[3]);
     System.out.println("支行账户处理成功,开始总行处理。。。请稍候。。。");
     return true;
    } else {
     System.out.println("支行账户处理失败。。。");
     return false;
    }
   }
   count++;
   p = p.brother;
  }
 return false;
}

 public boolean dowiththemoney(MemeryMap mm, DATA data) throws IOException
 {
  BigDecimal bd = new BigDecimal(mm.getData_cell()[3]);
  int moneylast = bd.intValue();
  if (data.want == 0) {
   if(data.money < moneylast)
   {
    moneylast -= data.money;
    mm.getData_cell()[3] = moneylast+"";
    mm.putData_line();
    return true;
   }
   else
    return false;
  } else if (data.want == 1) {
   moneylast += data.money;
   mm.getData_cell()[3] = moneylast+"";
   mm.putData_line();
   return true;
  } else if (data.want == 2) {
   mm.putData_line();
   return true;
  }
  else{
   System.out.println("未知错误!");
   return false;
  }
 }

 public ATM[] bic_atm(BCIC bcic) {
  ATM[] p = new ATM[2];
  p[0] = this.atm1;
  p[1] = this.atm2;
  return p;
 }

 public BIC(BCIC p,Socket socket) throws IOException {
  this.boss = p;
  this.brother = null;
  this.socket = socket;
  this.a_list = INIT_DATA.info_list[INIT_DATA.turn_database++];
  atm1 = new ATM(this,socket);/* ATM一号机初始化 */
  atm2 = new ATM(this,socket);/* ATM二号机初始化 */
  System.out.println("BIC初始化成功");
 }
 
}

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.math.BigDecimal;
import java.net.Socket;

public class ATM /* ATM */
{
 public BIC boss;
 public ATM brother;
 public Socket socket;
 public DATA dowiththecard(String cardid) throws IOException/* 处理数据生成 */
 {
  DATA data = new DATA();
  data.cardid = cardid;
  BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
  String m = br.readLine();
  if(!m.matches("[1-4]"))
  {
   System.out.println("对不起,参数输入有误!");
   return null;
  }
  int method = new BigDecimal(m).intValue();
  if (method != 1 && method != 2 && method != 3 && method != 4) {
   System.out.println("对不起,参数输入有误!断开连接!");
   return null;
  } else if (method == 1)   
   data.want = 0;
    else if (method == 2)
   data.want = 1;
    else if (method == 3)
   data.want = 2;
    else if (method == 4)
    return null;
  if(data.want == 2)
  {
   data.money = 0;
   br.readLine();
  }
  else
  {
   String c = br.readLine();
   if(!c.matches("[0-9]*"))
   {
    System.out.println("对不起,参数输入有误!");
    return null;
   }
   int num = new BigDecimal(c).intValue(); 
   if (num < 0) {
    System.out.println("对不起,参数输入有误!");
    
   } else
    data.money = num;
  }
  try {
   this.boss.account_done(data);
  } catch (InterruptedException e) {
   e.printStackTrace();
  }
  return data;
 }

 public ATM myself() {
  return this;
 }

 public ATM(BIC p,Socket socket) {
  this.boss = p;
  this.brother = null;
  this.socket = socket;
  System.out.println("ATM机初始化成功");
 }
}

单行读取文本文件类(内存映射):

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.RandomAccessFile;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.channels.FileLock;
import java.util.Arrays;

//单行修改文件
class MemeryMap {
 private long byteNumMin;
 private long byteNumMax;
 private byte[] data_line;
 private String[] data_cell;
 private File fp;
 
 public String[] getData_cell() {
  return data_cell;
 }

 private final static int SIZE = 64;

 public MemeryMap(File fp) throws FileNotFoundException {
  this.byteNumMin = 0;
  this.byteNumMax = SIZE;
  this.data_line = new byte[SIZE-1];
  for (int i = 0; i < SIZE-1; i++)
   this.data_line[i] = '#';
  this.data_cell = null;
  this.fp = fp;
 }

 public void theLine(int i) {
  this.byteNumMin = (i-1)*SIZE+i-2;
  this.byteNumMax = this.byteNumMin+SIZE;
 }

 public long getByteNumMin() {
  return byteNumMin;
 }

 public long getByteNumMax() {
  return byteNumMax;
 }

 public byte[] getData_line() {
  return data_line;
 }
 
 public int findTheLine(String name) {
  int LineNum = 1;
  String temp = null;
  BufferedReader br = null;
  try {
   br = new BufferedReader(new InputStreamReader(new FileInputStream(fp)));
  } catch (FileNotFoundException e1) {
   e1.printStackTrace();
  }
  String[] datas = null;
  try {
   datas = br.readLine().replaceAll("#*", "").split("-");
   while((temp = br.readLine()) != null)
    if(datas[2].equals(name) || datas[0].equals(name))
    {
     System.out.println(Arrays.toString(datas));
     return LineNum;
    }
    else
    { 
     System.out.println(Arrays.toString(datas));
     datas = temp.replaceAll("#*", "").split("-");
     LineNum++;
    }
  } catch (Exception e) { 
   return 0;
  }
  return 0;
 }
 
 public void setData_cell() throws FileNotFoundException {

  RandomAccessFile raf = new RandomAccessFile(fp, "rw");
  FileChannel fc = raf.getChannel();
  MappedByteBuffer mbb = null;
  try {
   mbb = fc.map(FileChannel.MapMode.READ_WRITE, byteNumMin, byteNumMax);
  } catch (IOException e) {
   e.printStackTrace();
  }
  mbb.get(this.data_line);
  mbb.clear();
  String str1 = new String(this.data_line);
  String str2 = str1.replaceAll("#*", "");
  this.data_cell = str2.split("-");
 }
 
 public void putData_line() throws IOException {
  String data_line = "";
  for(int i = 0 ; i < this.data_cell.length ; i++)
   if(i==this.data_cell.length-1)
    data_line += this.data_cell[i];
   else
    data_line += this.data_cell[i]+"-";
  
  byte[] data = new byte[SIZE-1];
  for (int i = 0; i < SIZE-1; i++)
    data[i] = '#';
  
  for(int i = 0 ; i < data_line.getBytes().length ; i++)
   data[i] = data_line.getBytes()[i];
  
  RandomAccessFile raf = new RandomAccessFile(fp, "rw");
  FileChannel fc = raf.getChannel();
  FileLock fl = fc.lock(byteNumMin, byteNumMin, false);
  MappedByteBuffer mbb = null;
  
  try {
   mbb = fc.map(FileChannel.MapMode.READ_WRITE, byteNumMin, byteNumMax);
  } catch (IOException e) {
   e.printStackTrace();
  }
  mbb.put(data);
  mbb.clear();
  fl.release();
 }
}

登录界面类:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.math.BigDecimal;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.Socket;

public class bankClient {
 @SuppressWarnings("static-access")
 public static void main(String[] args) throws IOException, InterruptedException {
  DatagramSocket ds = new DatagramSocket();
  DatagramPacket dp = null;
  while(true)
  {
   if(dp != null)
    break;
   dp = new DatagramPacket("ready".getBytes(), "ready".getBytes().length,InetAddress.getByName("127.0.0.1"),32341);
   Thread.currentThread().sleep(100);
   ds.send(dp);
   ds.receive(dp);
  }
  BigDecimal bd = new BigDecimal(new String(dp.getData())); 
  dp = new DatagramPacket("ok".getBytes(), "ok".getBytes().length,InetAddress.getByName("127.0.0.1"),bd.intValue());
  System.out.println(new String(dp.getData()));
  Thread.currentThread().sleep(100);
  ds.send(dp);
  dp = new DatagramPacket(new byte[4], 4);
  ds.receive(dp);
  String str = new String(dp.getData());
  System.out.println("服务器给您所分配的端口为"+str);
  BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
  BigDecimal str1 = new BigDecimal(str);
  Thread.currentThread().sleep(100);
  Socket socket = new Socket("127.0.0.1",str1.intValue());
  BufferedReader bi = new BufferedReader(new InputStreamReader(socket.getInputStream()));
  PrintWriter pw = new PrintWriter(socket.getOutputStream(),true);
  System.out.println("**************************************************");
  System.out.println("  欢迎使用银联系统终端");
  System.out.println("**************************************************");
  while(true)
  {
   System.out.println("请输入您的用户名:");
   String name = br.readLine();
   pw.println(name);
   System.out.println("请输入您的密码:");
   String code = br.readLine();
   pw.println(code);
   String strew = bi.readLine();
   if(strew.equals("true"))
    break;
   else{
    System.out.println("用户名密码错误! 请重试");
    continue;
   }
  }
  System.out.println("正在登录...请稍候...");
  Thread.currentThread().sleep(1500);
  try{
   while(true)
   {
    System.out.println("***********************************************");
    System.out.println("          银行交易系统     atm界面");
    System.out.println("***********************************************");
    System.out.println("请输入您的操作方式:");
    System.out.println("1 —————— 取款");
    System.out.println("2 —————— 存款");
    System.out.println("3 —————— 查询");
    System.out.println("4 —————— 结束");
    System.out.println("***********************************************");
    String cz = br.readLine();
    pw.println(cz);
    if(cz.equals("4"))
     break;
    else if(!cz.equals("3"))
    {
     System.out.println("***********************************************");
     System.out.println("请输入您的操作金额:"); 
     cz = br.readLine();
     pw.println(cz);
    }
    else
     pw.println("0");
    System.out.println("银行开始处理...请稍候...");
    String info = bi.readLine();
    while(!info.equals("Over"))
    {
     if(info.equals("false"))
      break;
     System.out.println(info);
     info = bi.readLine();
    }
   }
  }catch(Exception e)
  {
   System.out.println("非法操作!连接已被银行强制中断!请重新连接进行操作!");
  }
  pw.close();
  bi.close();
  br.close();
  socket.close(); 
 }
}

服务器端类:

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class bankServer {
 public static int[] portList = new int[1000];//支持同时1千人访问!
 
 public static boolean findPort(int[] ports,int n) {
  for(int i:ports)
   if(i == n)
    return false;
  return true;
 }
 
 @SuppressWarnings("static-access")
 public static void main(String[] args) throws IOException, InterruptedException {
  INIT_DATA.init();
  DatagramSocket ds = new DatagramSocket(32341);
  DatagramPacket dp = new DatagramPacket(new byte[5], 5);
  int count = 0;
  int Select = 0;
  while(true)
  {
   ds.receive(dp);
   String str = new String(dp.getData());
   if(str.equals("ready"))
   Select = (int)(Math.random()*5000+15000);
   if(findPort(portList,Select))
   { 
    portList[count++] = Select;
    str = ""+Select+"";
    DatagramPacket dp1  = new DatagramPacket(str.getBytes(),str.getBytes().length,dp.getAddress(),dp.getPort());
    Thread.currentThread().sleep(100);
    ds.send(dp1);
   }
   else
    continue;
   new Thread(new middlelayer(Select)).start();
  }
 }
}

 

import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.ServerSocket;
import java.net.Socket;


public class middlelayer implements Runnable {
 public static int[] portList = new int[1000];
 public int Select;
 
 public static boolean findEle(int n) {
  for(int i:portList)
  {
   if(i == n)
    return false;
  }
  return true;
 }
 
 public middlelayer(int n) {
  this.Select = n;
 }
 @SuppressWarnings("static-access")
 @Override
 public void run() {
  try {
   int count = 0;
   boolean flag = false;
   DatagramSocket ds = new DatagramSocket(this.Select);
   DatagramPacket pack1 = new DatagramPacket(new byte[2], 2);
   ds.receive(pack1);
   String str = new String(pack1.getData());
   System.out.println(str);
   if(!str.equals("ok"))
    return;
   int Select = 0;
   while(true)
   {
    Select = (int)(Math.random()*5000+5000);
    if(!findEle(Select))
     continue;
    else
    {
     portList[count++] = Select;
     break;
    }
   }
   String s = ""+Select+"";
   DatagramPacket pack2 = new DatagramPacket(s.getBytes(),s.getBytes().length,pack1.getAddress(),pack1.getPort());
   Thread.currentThread().sleep(100);
   ds.send(pack2);
   System.out.println(s);
   ServerSocket server = new ServerSocket(Select);
   Socket socket = server.accept();
   BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
   PrintWriter pw = new PrintWriter(socket.getOutputStream(),true);
   while(true)
   {
    String uname = br.readLine();
    String ucode = br.readLine();
    int count2 = 0;
    while(true)
    {
     if(count2 > 4)
     {
      pw.println("false");
      break;
     }
     MemeryMap mm = new MemeryMap(new File(INIT_DATA.databasename[count2++]));
     int line = mm.findTheLine(uname);
     if(line != 0)
     {
      if(line != 1)
       mm.theLine(line);
      mm.setData_cell();
      String[] datas = mm.getData_cell();
      if(datas[1].equals(ucode))
      {
       System.out.println(mm.getData_cell()[2]);
       pw.println("true");
       new Thread(new bank(socket,mm.getData_cell()[2])).start();    
       flag = true;
       break;
      }
     }
    }
    if(flag == true)
     break;
   }
  } catch (IOException e) {
   e.printStackTrace();
  } catch (InterruptedException e) {
   e.printStackTrace();
  }
 }
}

import java.io.IOException;
import java.io.PrintWriter;
import java.net.Socket;


public class bank implements Runnable {

 private Socket socket;
 private String cardid;
 
 public bank(Socket socket,String cardid) {
  this.socket = socket;
  this.cardid = cardid;
 }
 
 @SuppressWarnings("static-access")
 @Override
 public void run() {
  PrintWriter pw = null;
  try {
   pw = new PrintWriter(this.socket.getOutputStream(),true);
  } catch (IOException e1) {
   e1.printStackTrace();
  }
  try {
   printer.init_welcome();
   INIT_DATA.init();
  } catch (IOException e) {
   printer.init_failed();
  }
  BCIC bcic = new BCIC(this.socket);/* 初始化银行体系 */
  bcic.BCIC_calculate();/* 初始化银行数据 */
  printer.init_completed();
  System.out.println(this.cardid);
  PEOPLE people = new PEOPLE(cardid, bcic);/* 初始化操作人物 */
  Object p = people.chosetheatm();/* 流程控制指针生成 */
  
  DATA data = null;
  while(true)
  {
   if(!socket.isConnected())
    return;
   try { 
    data = ((ATM) p).dowiththecard(people.getCardid());
    if(data == null)
    {
     pw.println("false");
     break;
    }
    else
     pw.println("true");
   } catch (IOException e) {
    System.out.println("****************************************");
    System.out.println("          处理过程未知错误!");
    System.out.println("****************************************");
    break;
   }
   pw.println("Over");
  }
  //bcic.BCIC_calculate();//更新总行余额
  try {
   Thread.currentThread().sleep(1000);
  } catch (InterruptedException e) {
   e.printStackTrace();
  }
  try {
   socket.close();
  } catch (IOException e) {
   e.printStackTrace();
  }
  
 }
}

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值