从开始接触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();
}
}
}