??xml version="1.0" encoding="utf-8" standalone="yes"?>
IO中按照数据流的方向不同可以分入流和输出流Q以E序的角度来考虑Q?/span>
按照数据单位的不同可以分为字节流和字W流?/span>
按照功能的不同可以分Ҏ和处理流?br />
java语言的i/o库提供了四大{l构:InputStream,OutputStream,Reader,Writer四个pd的类。InputStream和OutputStream处理8位字节流数据, Reader和Writer处理16位的字符数据。InputStream和Reader处理输入, OutputStream和Writer处理输出。大家一定要到J2SE文档中看看这四大{l构的类l承体系?/p>
除了q四大系列类,i/o库还提供了少数的辅助c?其中比较重要的是InputStreamReader和OutputStreamWriter。InputStreamReader把InputStream适配为Reader, OutputStreamWriter把OutputStream适配为Writer;q样架起了字节处理类和字W流处理c间的桥梁?/p>
您用I/O库时,只要按以上的规则,到相应的cMpML您需要的cd?br />
下面我就会对I/O q行不定期更斎ͼ
1 FileOutputStream 文g字节?br />
Public class FileInputStream extends InputStream{
/* File Descriptor - handle to the open file */
private FileDescriptor fd;
public FileInputStream(FileDescriptor fdObj)
{
SecurityManager security = System.getSecurityManager();
if (fdObj == null) {
throw new NullPointerException();
}
if (security != null) {
security.checkRead(fdObj);
}
fd = fdObj;
}
//其他代码
}
可见,FileInputStreaml承了InputStream,l合了FileDescriptor,采用的是对象Adapter模式。我们学习i/o库时,主要应该掌握q四个对象Adapter模式的适配? ByteArrayInputStream的适配源是Byte数组, FileInputStream的适配源是File对象, PipedInputStream的适配源是PipedOutputStream对象, StringBufferInputStream的适配源是String对象
U程间通信Q一个线E向数据存储I间d数据Q唐老鸭Q,另一个线E从数据存储I间取出数据Q?/span>c琪Q?/span>
E序有两U以外需要考虑Q?/span>
1?span style="font: 7pt 'Times New Roman'"> 假设唐老鸭U程刚向数据存储I间d了一辆R的名字。还没有加入q辆车的颜色Q?/span>CPU切换到?/span>c琪U程Q?/span>唐老鸭U程把q辆车的名字和上辆R的颜色联pd了一赗?/span>
2 、唐老鸭了若q次的数据?/span>c琪才开始取数据Q或者是Q?/span>c琪取完了一个数据后Q还没等?/span>唐老鸭攑օ新的数据Q又重复取出已取q的数据?/span>
可能出现的问题:
1唐老鸭?/span>c琪快时Q?/span>c琪会漏掉一些数据没有取到?/span>
2?span style="font: 7pt 'Times New Roman'"> c琪?/span>唐老鸭快时Q?/span>c琪取相同的数据?/span>
多个U程׃n同一资源的时候,必须q行同步Q采用同步方法,解决W一个问题?/span>
U程的等待和唤醒机制Q?/span>
wait()Q告诉当前线E放弃监视器q进入睡眠状态,直到其他U程q入同一监视器ƈ调用notify为止?/span>
notify()Q唤醒同一对象监视器中调用wait的第一个线E?/span>
E序中采用线E的{待和唤醒机Ӟ当发?/span>c琪没有取走内容Ӟ唐老鸭应该{待Q当c琪把内容取C后,唐老鸭才可以放。这栯决了W二个问题?br />
代码如下Q?br />
package Killva.IOchaper4.o3;
class Animal{
private String name ="唐老鸭";
private String sex= "?;
private boolean flag=false;
public synchronized void set(String name, String sex){//生?br />
//如果flag的g是true则要{待
if(!flag){
//{待
try{
wait();
}catch(Exception e){}
}
//如果向下l箋执行了,则表C可以设|, flag =true
this.name=name;
this.sex=sex;
//修改讄的标?br />
flag = false;
//唤醒其他U程
notify();
}
//讄一个输出的Ҏ
public synchronized void get(){
//如果flag的gؓtrue的时候,表示要等?br />
if(flag){
try{
wait();
}catch(Exception e){}
}
//如果向下执行了,pC允?br />
System.out.println(this.name+"-->"+this.sex);
//改变标签
flag =true;
notify();
}
}
class Pro implements Runnable{
Animal per =null;
public Pro(Animal p){
this.per=p;
}
public void run() {
int i =0;
while (true){
if(i==0){
per.set("c琪", "?);
i=1;
}else{
per.set("唐老鸭", "?);
i=0;
}
}
}
}
class Cus implements Runnable{
Animal per =null;
public Cus(Animal p){
this.per=p;
}
public void run() {
while(true){
per.get();
}
}
}
public class Demo01 {
//L?br />
public static void main(String[] args){
Animal per =new Animal();
Pro p =new Pro(per);
Cus c =new Cus(per);
new Thread(p).start();
new Thread(c).start();
}
}
2? getInputStreamҎ获得|络q接输入Q同时返回一个InputStream对象实例Q?
3? getOutputStreamҎq接的另一端将得到输入Q同时返回一个OutputStream对象实例?
注意Q其中getInputStream和getOutputStreamҎ均会产生一个IOExceptionQ它必须被捕P因ؓ它们q回的流对象Q通常都会被另一个流对象使用?br />
写代码时一般先写server?
//Server
package Killva.NetWorkchaper1.o3;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class TestTCPServer {
public static void main(String args[])throws IOException{
ServerSocket ss =new ServerSocket(9999);
while(true){
System.out.println("--------服务端已q启?-----------");
Socket s =ss.accept();
DataOutputStream dos =new DataOutputStream(s.getOutputStream());
System.out.println("客户端["+s.getInetAddress().getHostAddress()+
" :"+s.getPort()+
"]已近链接Q?);
dos.writeUTF("服务器端写入客户端的数据Q客L("+
s.getInetAddress().getHostAddress()+
" :"+s.getPort()+
"]已经链接上服务器端["+
s.getLocalAddress().getHostName()+
":"+s.getLocalPort()+
"]Q?);
dos.flush();
dos.close();
s.close();
}
}
}
package Killva.NetWorkchaper1.o3;
import java.io.DataInputStream;
import java.io.IOException;
import java.net.Socket;
public class TestTCPCLient {
public static void main(String[] args) throws IOException{
System.out.println("-------------client?----------");
for(long i=0;i<10;i++){
Socket s =new Socket("192.168.1.*",9999);//IP是用你所在的局域网来测?br />
DataInputStream dis = new DataInputStream(s.getInputStream());
System.out.println(""+dis.readUTF());
dis.close();
s.close();
}
}
}
q行l果真确时服务器端和客户端能q接
感谢阅读Q!Q!
创徏U程有两U方法:l承Threadcd实现Runnable接口?/pre>
Ҏ一Q?span lang="EN-US"> Thread c,覆盖Ҏ run()Q我们在创徏?span lang="EN-US"> Thread cȝ子类中重?span lang="EN-US"> run() ,加入U程所要执行的代码卛_?/pre>a.每个U程都是通过某个特定Thread对象所对应的方?/span>run()l来完成其操作的,Ҏrun()成ؓU程体?/span>
b.如果惌启动多线E,则肯定调?/span>start()ҎQ?/span>startҎ可以调用被子c覆写过?/span>runҎ
c.不过q种q种实现方式会受到单l承的局?/span>
下面是一个例子:public class MyThread extends Thread {
int count= 1, number;
public MyThread(int num) {
number = num;
System.out.println("创徏U程 " + number);}
public void run() {
while(true) {
System.out.println("U程 " + number + ":计数 " + count);if(++count== 6) return;
}
}
public static void main(String args[]) {
for(int i = 0; i < 5; i++) new MyThread(i+1).start();
}
}
Ҏ二:实现 Runnable 接口
Runnable 接口只有一个方?span lang="EN-US"> run()Q我们声明自qcd?span lang="EN-US"> Runnable 接口q提供这一ҎQ将我们的线E代码写入其中,完成了q一部分的Q务?/pre>但是 Runnable 接口q没有Q何对U程的支持,我们q必d?span lang="EN-US"> Thread cȝ实例Q这一炚w过 Thread cȝ构造函?span lang="EN-US">public Thread(Runnable target);来实现?/pre>该实现方式有以下好处Q?/span>
?span style="font: 7pt 'Times New Roman'"> 适合多个相干同程序代码的U程d理同一资源的情c?/span>
?span style="font: 7pt 'Times New Roman'"> 可以避免׃Java单承特性带来的局限?/span>
?span style="font: 7pt 'Times New Roman'"> 有利于程序的健壮性,代码能够被多个线E共享?/span>
下面是一个例子:public class MyThread implements Runnable {
int count= 1, number;
public MyThread(int num) {
number = num;
System.out.println("创徏U程 " + number);}
public void run() {
while(true) {
System.out.println("U程 " + number + ":计数 " + count);if(++count== 6) return;
}
}
public static void main(String args[]) {
for(int i = 0; i < 5; i++) new Thread(new MyThread(i+1)).start();
}
}
两种Ҏ各有千秋Q可以灵z运用?span lang="EN-US">
]]>
String是一个特D的包装cL据。可以用Q?
String str = new String("abc");
String str = "abc";
两种的Ş式来建立Q第一U是用new()来新建对象的Q它会在存放于堆中。每调用一ơ就会徏立一个新的对象?
而第二种是先在栈中徏立一个对Stringcȝ对象引用变量strQ然后查找栈中有没有存放"abc"Q如果没有,则将"abc"存放q栈Qƈ令str指向“abc”Q如果已l有“abc” 则直接ostr指向“abc”?
比较c里面的数D不能相等Ӟ用equals()要领Q当试两个包装cȝ引用能不能指向同一个对象时Q用==Q下面用例子说明上面的理论?
String str1 = "abc";
String str2 = "abc";
System.out.println(str1==str2); //true可以看出str1和str2是指向同一个对象的?
String str1 =new String ("abc");
String str2 =new String ("abc");
System.out.println(str1==str2); // false用new的方式是生成不同的对象。每一ơ生成一个?
因此用第二种方式建立多个“abc”字符?在内存中其实只存在一个对象而已. q种写法有利与节省内存空? 同时它可以在一定程度上提高E序的运行速度Q因为JVM会自动根据栈中数据的实际情况来决定能不能有必要徏立新对象。而对于String str = new String("abc")Q的代码Q则一概在堆中建立新对象,而不其字符串D不能相等Q能不能有必要徏立新对象Q从而加重了E序的负担?
另一斚w, 要留?: 我们在运用诸如String str = "abc"Q的格式定义cLQL惛_然地认ؓQ徏立了Stringcȝ对象str。担心陷阱!对象可能q没有被建立Q而可能只是指向一个先前已l徏立的 对象。只有通过new()要领才能保证每次都徏立一个新的对象?׃Stringcȝimmutable性质Q当String变量要l常变换其值时Q应该考虑q用 StringBufferc,以提高程序效率?
java中内存分配策略及堆和栈的比较
2.1 内存分配{略按照~译原理的观?E序q行时的内存分配有三U策?分别是静态的,栈式?和堆式的.静态存储分配是指在~译时就能确定每个数据目标在q行时刻的存储空间需?因而在~译时就可以l他们分配固定的内存I间.q种分配{略要求E序代码中不?许有可变数据l构(比如可变数组)的存?也不允许有嵌套或者递归的结构出?因ؓ它们都会D~译E序不能计算准确的存储空间需?栈式存储分配也可UCؓ动态存储分?是由一个类g堆栈的运行栈来实现的.和静态存储分配相?在栈式存储方案中,E序Ҏ据区的需求在~译时是完全未知 ?只有到运行的时候才能够知道,但是规定在运行中q入一个程序模块时,必须知道该程序模块所需的数据区大小才能够ؓ其分配内?和我们在数据l构所熟知 的栈一?栈式存储分配按照先进后出的原则执?分配?/p>
静态存储分配要求在~译时能知道所有变量的存储要求,栈式存储分配要求在流E的入口处必ȝ道所有的存储要求,而堆式存储分配则专门负责在编译时或运行时 模块入口处都不能定存储要求的数据结构的内存分配,比如可变长度串和对象实例.堆由大片的可q用 块或I闲块组?堆中的内存可以按照Q意顺序分配和??
2.2 堆和栈的比较
上面的定义从~译原理的教材中ȝ而来,除静态存储分配之?都显得很呆板和难以理?下面撇开静态存储分?集中比较堆和?从堆和栈的功能和作用来通俗的比?堆主要用来存攑֯象的Q栈主要是用来执行程序的.而这U不同又主要是由于堆和栈的特点决定的:在编E中Q例如C/C++中,所有的要领调用都是通过栈来执行 ?所有的局部变?形式参数都是从栈中分配内存空间的。实际上也不是什么分?只是从栈?向上用就?好像工厂中的传送带(conveyor belt)一?Stack Pointer会自动指引你到放东西的位|?你所要做的只是把东西放下来就?退出函数的时候,修改栈指针就可以把栈中的内容销?q样的模式速度最? 当然要用来运行程序了.要留心的是,在分配的时?比如Z个即要调用的程序模块分配数据区?应事先知道这个数据区的大?也就说是虽然分配是在E?序运行时执行 ?但是分配的大多是定?不变?而这?大小多少"是在~译时确定的,不是在运行时.堆是使用E序在运行的时候请求操作系l分配给自己内存Q由于从操作pȝ理的内存分?所以在分配和销毁时都要占用旉Q因此用堆的效率非常?但是堆的 优点在于,~译器不必知道要从堆里分配多存储空_也不必知道存储的数据要在堆里停留多长的时?因此,用堆保存数据时会得到更大的灵zL。事实上,?向对象的多态?堆内存分配是必不可少?因ؓ多态变量所需的存储空间只有在q行时徏立了对象之后才能定.在C++中,要求建立一个对象时Q只需?new命o~制有关的代码即可。执行这些代码时Q会在堆里自动执?数据的保?当然Qؓ辑ֈq种灉|性,必然会付Z定的代h:在堆里分配存储空间时会花 掉更长的旉Q这也正是导致我们刚才所说的效率低的原由 ,看来列宁同志说的?人的优点往往也是人的~点,人的~点往往也是人的优点.
2.3 JVM中的堆和栈JVM是基于堆栈的虚拟?JVM为每个新建立的线E都分配一个堆?也就是说,对于一个JavaE序来说Q它的运行就是通过对堆栈的操作来完成的。堆栈以帧ؓ单位保存U程的状态。JVM对堆栈只执行 两种操作:以为单位的压栈和出栈操作?
我们知道,某个U程正在执行的要领称为此U程的当前要?.我们可能不知?当前要领q用的UCؓ当前帧。当U程ȀzM个Java要领 ,JVM׃在线E的 Java堆栈里新压入一个。这个自然成ؓ了当前.在此要领执行期间,q个帧将用来保存参数,局部变?中间计算程和其他数?q个帧在q里和编?原理中的zdU录的概忉|差不多的.从Java的这U分配机制来?堆栈又可以这L?堆栈(Stack)是操作系l在建立某个q程时或者线E?在支持多U程的操作系l中是线E?个线E徏立的存储区域Q该区域h先进后出的特征?
每一个Java使用都唯一对应一个JVM实例Q每一个实例唯一对应一个堆。用程序在q行中所建立的所有类实例或数l都攑֜q个堆中,q由使用所有的U程 ׃n.跟C/C++不同QJava中分配堆内存是自动原始化的。Java中所有对象的存储I间都是在堆中分配的Q但是这个对象的引用却是在堆栈中分配,?是说在建立一个对象时从两个地炚w分配内存Q在堆中分配的内存实际徏立这个对象,而在堆栈中分配的内存只是一个指向这个堆对象的指?引用)而已?/p>
package VO;
import java.io.Serializable;
@SuppressWarnings("serial")
public class Fruit implements Serializable {
//属?br />
private String name;
private String area;
private float kg;
//构造方?br />
public Fruit(){}
public Fruit(String name,String area,float kg){
this.name =name;
this.area =area;
this.kg =kg;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getArea() {
return area;
}
public void setArea(String area) {
this.area = area;
}
public float getKg() {
return kg;
}
public void setKg(float kg) {
this.kg = kg;
}
public String toString (){
return "水果名:"+this.name +" 源圎ͼ"+this.area+" 现重量:"+this.kg ;
}
}
//L?br />
package Main;
import Menu.Menu;
public class Main {
//L?br />
public static void main(String[] args){
System.out.println("单的水果仓库理pȝ");
//调用MenuҎ
new Menu();
}
}
//Menu
package Menu;
import OP.FruitOperate;
import Util.InputDate;
public class Menu {
InputDate input= null;
public Menu(){
this.input=new InputDate();
//循环出现菜单
while (true){
this.show();
}
}
//需要定义的菜单内容
private void show() {
System.out.println("\t\t\t1、增加水果库?);
System.out.println("\t\t\t2、浏览库存信?);
System.out.println("\t\t\t3、修改库存信?);
System.out.println("\t\t\t4、注销理pȝ");
System.out.print("\n\n请选择您要使用的操作:");
int temp = input.getInt();
switch(temp){
case 1:{ // 增加水果库存
new FruitOperate().add(); //业务处理?nbsp;
break;
}
case 2:{ // 览库存信息
new FruitOperate().show();
break;
}
case 3:{ // 修改库存信息
new FruitOperate().update();
break;
}
case 4:{ //注销理pȝ
System.out.println("注销?*****************");
System.out.println("注销成功Q?);
System.exit(1);
}
default:{ //错误信息提示
System.out.println("请选择正确的操作范围如下:");
break;
}
}
}
}
//对度入数据的相关操作
package Util;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class InputDate {
private BufferedReader buf =null;
public InputDate(){
buf = new BufferedReader(new InputStreamReader(System.in));
};
public String getString(){
String str = null;
try {
str = buf.readLine();
} catch (IOException e) {}
return str;
}
public int getInt(){
int temp = 0;
//如果输入的不是数字,告诉用户输入错了~
//可以使用正则验证
String str = null;
boolean flag = true;
while(flag){
//输入数据
str = this.getString();
if (!(str.matches("\\d+"))){
//如果输入的不是一个数字,则必重新输?nbsp;
System.out.print("输入的内容必L上面操作代号的范_请重新输?");
}else{
//输入的是一个正的数字Q则可以q行转换
temp = Integer.parseInt(str);
//表示退出@?nbsp;
flag = false;
}
}
return temp;
}
public float getFloat() {
float f = 0.0f;
//如果输入的不是数字,提示告诉用户输入错了~
//可以使用正则验证
String str = null;
boolean flag = true;
while(flag){
//输入数据
str = this.getString();
if (!(str.matches("\\d+?.\\d{1,2}"))){
//如果输入的不是一个数字,则必重新输?nbsp;
System.out.print("输入的内容必L数(数点后两位)Q请重新输入:");
}else{
//输入的是一个正的数字Q则可以q行转换
f = Float.parseFloat(str);
//表示退出@?nbsp;
flag = false;
}
}
return f;
}
}
///实现理的方法类
package OP;
import Util.FileOperate;
import Util.InputDate;
import VO.Fruit;
public class FruitOperate {
private InputDate input = null;
public FruitOperate(){
this.input = new InputDate();
}
//完成具体的Fruit对象操作
public void add(){
//要用输入数据的c?nbsp;
String name = null;
String area = null;
float kg = 0.0f;
System.out.print("输入水果名:");
name = this.input.getString();
System.out.print("输入源圎ͼ");
area = this.input.getString();
System.out.print("输入入库量:");
kg = this.input.getFloat();
//生成Fruit对象Q把对象保存在文件中
Fruit f = new Fruit(name,area,kg);
try{
new FileOperate().save(f); //io操作?br />
System.out.println("数据保存成功Q?);
}catch(Exception e){
System.out.println("数据保存p|Q?);
}
}
public void show(){
//从文件中把内容读q来
Fruit f = null;
try{
f = (Fruit) new FileOperate().read();
}catch(Exception e){
System.out.println("内容昄p|Q请定数据是否存在Q?);
}
if(f != null){
System.out.println(f);
}
}
public void update(){
//先将之前的信息查出来
Fruit f = null;
try{
f = (Fruit) new FileOperate().read();
}catch(Exception e){
System.out.println("内容昄p|Q请定数据是否存在Q?);
}
if(f != null){
String name = null;
String area = null;
float kg =0.0f;
System.out.print("误入新的水果名Q原水果名:"+f.getName()+"Q?);
name = this.input.getString();
System.out.print("误入新的源产地Q原源圎ͼ"+f.getArea()+"Q?);
area = this.input.getString();
System.out.print("误入新的库总量Q原库总量Q?+f.getKg()+"Q?);
kg = this.input.getFloat();
//信息重新讄
f.setName(name);
f.setArea(area);
f.setKg(kg);
try{
new FileOperate().save(f);
System.out.println("数据更新成功Q?);
}catch(Exception e){
System.out.println("数据更新p|Q?);
}
}
}
}
//底层操作 文g的读入和d
package Util;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
public class FileOperate {
public static final String FILENAME = "E:\\fruit.txt";
//把对象保存在文g之中
public void save(Object obj){
ObjectOutputStream out = null;
try {
out = new ObjectOutputStream(new FileOutputStream(new File(FILENAME)));
//写入对象
out.writeObject(obj);
}catch(Exception e){
try {
throw e;
} catch (Exception e1) {}
}finally {
try {
out.close();
}catch(Exception e){}
}
}
//把对象从文g之中d?nbsp;
public Object read() throws Exception{
Object obj = null;
ObjectInputStream input =null;
try {
input = new ObjectInputStream(new FileInputStream(new File(FILENAME)));
obj = input.readObject();
} catch (Exception e) {
throw e;
}finally{
try{
input.close();
}catch(Exception e){}
}
return obj;
}
}
q行l果如下Q?br />
q篇文章只是一个原?nbsp; Q感谢阅?nbsp; 希望能够提供宝贵意见QQQQ?37333696
package StockUI;
public class Stock {
private int id; //
private String name; //
private int price; //
private int flag; //
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
public int getFlag() {
return flag;
}
public void setFlag(int flag) {
this.flag = flag;
}
}
package StockUI;
import java.util.Random;
public class StockServer {
public static void main(String[] args){
Stock sk[] = getStock();
for(int i=0;i<sk.length;i++){
if(sk[i] != null){
System.out.println("name = " + sk[i].getPrice());
}
}
}
public static Stock[] getStock(){
Stock stock[] = new Stock[3];
//#####################################################
Stock sk = new Stock();
sk.setId(1);
sk.setName("ibm");
Random rd = new Random();
sk.setPrice(rd.nextInt(100));
sk.setFlag(1);
stock[0] = sk;
//#######################################################
Stock sk1 = new Stock();
sk1.setId(2);
sk1.setName("sun");
sk1.setPrice(rd.nextInt(100));
sk1.setFlag(1);
stock[1] = sk1;
//######################################################
Stock sk2 = new Stock();
sk2.setId(3);
sk2.setName("oracle");
sk2.setPrice(rd.nextInt(100));
sk2.setFlag(1);
stock[2] = sk2;
return stock;
}
}
package StockUI;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.TableEditor;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.MessageBox;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;
public class StockUI {
private TableEditor editor = null;
private Table table = null;
public static void main(String[] args) {
new StockUI();
}
private StockUI() {
Display display = new Display();
Shell shell = new Shell(display);
shell.setLayout(new FillLayout());
shell.setText("大智慧股模拟系l?);
createTable(shell,display);
shell.pack(); //H口变大
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
display.dispose();
}
/**
* 创徏表格
*
* @param shell
*/
private void createTable(final Shell shell,final Display display) {
table = new Table(shell, SWT.MULTI | SWT.FULL_SELECTION);
editor = new TableEditor(table);
editor.horizontalAlignment = SWT.LEFT;
editor.grabHorizontal = true;
table.setHeaderVisible(true);
table.setLinesVisible(true);
TableColumn col1 = new TableColumn(table, SWT.LEFT);
col1.setText("股票代码");
col1.setWidth(100);
TableColumn col2 = new TableColumn(table, SWT.LEFT);
col2.setText("公司?);
col2.setWidth(100);
TableColumn col5 = new TableColumn(table, SWT.LEFT);
col5.setText("Ch");
col5.setWidth(100);
TableColumn col3 = new TableColumn(table, SWT.LEFT);
col3.setText("涨幅");
col3.setWidth(100);
TableColumn col4 = new TableColumn(table, SWT.LEFT);
col4.setText("换手?);
col4.setWidth(100);
/**
* d表格数据
*/
Stock[] sk = StockServer.getStock();
final TableItem[] itemArr = new TableItem[sk.length];
for(int i=0;i<itemArr.length;i++){
itemArr[i] = new TableItem(table, SWT.LEFT);
}
final int time=1000;
Runnable showTime = new Runnable(){
public void run(){
Stock[] sk = StockServer.getStock();
for(int i=0;i<itemArr.length;i++){
itemArr[i].setText(new String[] { String.valueOf(sk[i].getId()), String.valueOf(sk[i].getName()), String.valueOf(sk[i].getPrice())
});
}
display.timerExec(time, this);
}
};
display.timerExec(time,showTime);//你的swtE序的display
// 删除菜单
Menu menu1 = new Menu(shell, SWT.POP_UP);
table.setMenu(menu1);
MenuItem menuitem1 = new MenuItem(menu1, SWT.PUSH);
menuitem1.setText("删除");
menuitem1.addListener(SWT.Selection, new Listener() {
@Override
public void handleEvent(Event event) {
MessageBox mbox = new MessageBox(shell, SWT.DIALOG_TRIM|SWT.ICON_INFORMATION);
mbox.setText("删除成功");
mbox.setMessage("删除? + table.getSelectionCount() + "条记?);
table.remove(table.getSelectionIndices());
mbox.open();
}
});
// 修改table
{}
}
}
我写的这个系l主要是z股工作原?Q真真的股票pȝ我想一定比q个要复杂的多!着个程序只是让我们了解面的咱对象的意义Q!Q?/span>
要求Q?/span>
要求在股服务器中存储一些列不同股票的基本信息,包括股票LQ股类型,上市公司Q股h根{在客户端实时显C信息,q且要求股票h要实时变化?/span>
分析Q?/span>
1?span style="font: 7pt "Times New Roman";"> 创徏一个股类Q里面包括股号码,股票cdQ上市公司,股票P股票的方法(get/setҎ和构造函敎ͼQ属性要U有Q方法要公有?/span>
2?span style="font: 7pt "Times New Roman";"> 创徏一个股服务器c,当客L需要调用股信息时Q用于需要时传递给客户端一l股信息,
3?span style="font: 7pt "Times New Roman";"> 创徏一个股客Lc,q个c需要实时显CQ动信息,因此需要调用服务器端的数据Q通过一个获取方法)Q然后打印出来股数l中每一个数据的基本信息Q这样就实现了股hg断Q动显C的效果?/span>
以下附该E序代码:
//股票c?/p>
package com.dr.stock;
public class Stock implements Comparable<Object> {
private int id;
private int num;
private String name;
private int price;
public String toString(){
return this.getId()+" "+this.getNum()+" "+this.getName()+" "+this.getPrice();
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
@Override
public int compareTo(Object obj) {
Stock s = (Stock)obj;
if(this.price<s.price){
return -1;
}
else if(this.price>s.price){
return 1;
}else{
return 0;
}
}
}
//服务器类
package com.dr.stock;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
public class StockServer {
private static List<Stock> stockList =new ArrayList<Stock>();
static{
Stock stock = new Stock();
stock.setId(01);
stock.setNum(2524);
stock.setName("hhg");
stockList.add(stock);
stock = new Stock();
stock.setId(02);
stock.setNum(2252);
stock.setName("smj");
stockList.add(stock);
}
public static List<Stock> getStockList(){
Random r = new Random();
for(Stock stock : stockList){
stock.setPrice(r.nextInt(100));
}
return stockList;
}
}
//客户?/p>
package com.dr.stock;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;
public class StockClient {
public static void getStockListFromServer(){
List<Stock> stockList =StockServer.getStockList();
for(Stock s:stockList){
System.out.println(s.getId()+" "+s.getNum()+" "+s.getName()+" "+s.getPrice());
}
System.out.println("-------");
Set<Stock> s1 = new TreeSet<Stock>();
//s1.add(stockList);
s1.add(StockServer.getStockList().get(0));
s1.add(StockServer.getStockList().get(1));
for(Iterator<Stock> iter = s1.iterator();
iter.hasNext();
System.out.println(iter.next()));
System.out.println("##################");
}
public static void main(String[] args){
while (true){
getStockListFromServer();
try {
Thread.sleep(1000*3);
} catch (InterruptedException e) {
e.printStackTrace();
break;
}
}
}
}
//q行l果Q?/p>
感谢阅读 !!!!!
希望提供宝贵的意见!Q!
package com.dr.Static;
import java.util.Scanner;
public class Demo06 {
public static void main(String[] args) {
Scanner s0=new Scanner(System.in);
System.out.println("误入用户名Q?);
String name=s0.nextLine();
Scanner s1=new Scanner(System.in);
System.out.println("误入密码:");
String pwd=s1.nextLine();
if("abc".equals(name)&&"123".equals(pwd)){
System.out.println("Ƣ迎讉K哈!Q!");
}
else{
System.out.println("用户名和密码不正!Q!");
}
}
}