用java做,采用什么形式都可以,只有一个条件就是把数据存到内存,不能用数据库

解决方案 »

  1.   

    搞个类存单条信息,再用个Vector,List什么的存所有信息
      

  2.   

    pubilc class User{
      private String userName;
      private String passWord;
      private int age;
      public String getUserName(){return userName;}
      public String getPassWord(){return passWord;}
      public int getAge(){return age;}
      public void setUserName(String user){userName=user;}
      public void setPassWord(String pwd){passWord=pwd;}
      public void setAge(int age){this.age=age;}
      public boolean equals(Object o){
        User u=(User)o;
        return u.userName.equals(userName)&&u.passWord.equals(passWord);
      }
       //用户名,密码等
    }
    pubilc final class MemoryUser{
        private static Map userList=new HashMap();
        public static boolean register(User user){
          if(user==null) throw new NullPointerException();
          //用户名已经被用
          if(userList.containsKey(user.getUserName())) return false;
          userList.put(user.getUserName(),user);
          return true;
        }
        public static boolean login(User user){
           if(user==null) return false;
           User u=(User)userList.get(user.getUserName());
           return (u!=null)&&(u.equals(user));
        }
    }
      

  3.   

    回复人: j2nix(爱生活爱星辉) 
    我的Email:[email protected]
      

  4.   

    回复人: treeroot(根根) 我需要把数据持久下来!就是关机,开机后注册的资料还在!!!
      

  5.   

    回复人: jiangnanyuzi(江南愚子) 对了!所以要用IO流!!!
      

  6.   

    搂主要做登陆显然是个b/s的东东.
    要持久的数据当然是在服务器上,所以客户端关机数据依然存在.
    就是说数据持久不能依靠在客户端的内存持久.可以在服务器端开一个数据缓冲器,随时和业务逻辑服务通信,用来保存数据.
    写一个通讯接口.或者socket,或者rmi等.
    缓冲器为了避免服务器异常数据丢失,所以最好每一个时间段后把内存的数据提交到数据库.
      

  7.   

    SORRY了!可能我题目意思理解错误!!!我在去求证一下,在和大家一起商量!!!
    回复人: anotherleeo(听风看雨) :应该没有这么复杂!!!
    可能和关机和开机没关系,把资料存在类里就可以!!
    不过在这里谢谢大家!给了我很多方法
      

  8.   

    通常我们采用各种数据库产品来实现对数据的存储、检索等功能,例如,Oracle,SQL Server,MySQL等等。这些产品除提供基本的查询,删除,添加等功能外,也提供了很多高级特性,如触发器,存储过程,数据备份恢复,全文检索功能等。但实际上,很多的应用,仅仅利用到了这些数据库产品的基本特性而已。而且在一些小型应用上,或者某些特殊场合的应用,比如桌面程序,这些数据库产品就明显有一些臃肿。在这些情况下,嵌入式数据库的优势就特别明显了。 嵌入式数据库无须独立运行的数据库引擎,它是由程序直接调用相应的API去实现对数据的存取操作。更直白的讲,嵌入式数据库是一种具备了基本数据库特性的数据文件。嵌入式数据库与其它数据库产品的区别是,前者是程序驱动式, 而后者是引擎响应式。嵌入式数据库的一个很重要的特点是它们的体积非常小,编译后的产品也不过几十K。这不但对桌面程序的数据存储方案是一个很好的选择,也使得它们可以应用到一些移动设备上。同时,很多嵌入式数据库在性能上也优于其它数据库,所以在高性能的应用上也常见嵌入式数据库的身影。 下面介绍的是两个开放源代码的嵌入式数据库,Berkeley DB和SQLite。同时侧重介绍如何应用Java连接这两种嵌入式数据库
      

  9.   

    一. Berkeley DB1. 简介Berkeley DB是一款健壮的,高速的工业级嵌入式数据库产品,你可以在它的官方主页(见参考链接一)上发现很多知名的公司都采用了这款嵌入式数据库。Berkeley DB的一个很重要的特点是就是高速存储。在高流量,高并发的情况下,Berkeley DB要比非嵌入式的数据库表现得更加出色。所以在一些技术实现上,Berkeley DB被作为大型关系数据库的中间数据缓冲层,用来快速的保存数据,可能会在适当的时刻再导入到大型数据库中,进而应用大型数据库所提供的更为高级的特性。 Berkeley DB虽然是开源的产品,但对某些条件下的商业性应用,却不是免费的,而且价格颇为昂贵。这些商业条件排除了开源的情况,不发放分布版本的情况,等等。比如,如果你的程序是开放源代码的或者仅仅应用到单一的网站上,在这种情况下,Berkeley DB是免费的。 2. 获得Java与Berkeley DB的接口Berkeley DB目前的版本是4.1.25,自带了Java接口。下载的压缩包中包含C和Java语言的源代码和编译配置文件。在Windows平台,可以用MS Visual C++ 6.0或MS VC.Net编译。用VC6编译的操作如下介绍:在源代码的build_win32路径下打开VC的工程文件,之后在Build菜单中的Set Active Configuration选择db_java win32 release编译选项。在VC的Tools菜单Options选项中指定JNI.H等Java本地化接口编译时所需要头文件的位置。你会在JDK的include路径下找到这些头文件, 例如加入的路径可能会是这样的:C:\jdk1.4\include和C:\jdk1.4\include\win32。最后在Tools菜单中Options选项还要设置Javac.exe和Jar.exe的执行路径,这个设置会使VC开发环境也能调用Java编译器,从而在VC环境下直接完成对Java接口类的编译和打包。在编译后,在release路径下的文件中找到db.jar, libdb41.dll, libdb_java41.dll,这三个文件组成了Berkeley DB的Java接口程序包。 3. 应用Java与Berkeley DB的接口 Berkeley DB并不是一个关系型的数据库。不能应用标准的SQL语句对数据库操作,对它的操作要调用专用的API实现。这些API提供了查询、插入、删除等功能。比如com.sleepycat.db.Db类代表数据库对象。Db类的put()方法完成的是插入功能,get()方法完成的是读出数据的功能。com.sleepycat.db.Dbc是Berkeley DB的游标类,提供了遍历数据库记录的功能。 Berkeley DB每一个记录都有一个键值和对应的数据值,而键值和数据必须是类com.sleepycat.db.Dbt的对象或其子类的对象。Dbt提供了一些方法可以将byte数组或Object对象保存到Dbt的对象中去。比如,Dbt类中的set_data(byte[])或set_object(Object)方法。注意到目前Berkeley DB中的Java API命名方法并不符合Java的命名规范,比如set_data()方法应该命名为setData()方法。Berkeley DB许诺在下一个版本中会提供符合命名规范的Java API。 Berkeley DB对任何存入的数据都是直接原样存储到数据文件中去,无论其是二进制数据还是ASCII或Unicode等编码的文本。通常可以利用这一特性和Java串行化的概念方便的进行数据的存取。例如声明一个类 
    public class AccountInfo implements Serializable{
    //帐户信息
    public String loginName;
    public String password;
    public boolean auotLogin;

    在这个AccountInfo类中仅仅包含了数据项的定义。我们完全可以将这个类看作数据库的表中字段定义。可以用Berkeley DB保存AccountInfo对象的串行化二进制数据,以此来保存这个对象中的变量值。在操作中,先对Dbt的对象调用set_object(AccountInfo)方法,而后把这个Dbt对象作为一条纪录保存到表中。当然,我们也可以应用继承Dbt类的方法来完成对数据的保存。 下面这段简单代码演示如何将数据存入到数据库中,然后再用游标对象浏览全部数据。 
    //注意,下面的程序的忽略了对异常处理,写入数据初始化等等一些代码,请在适当修改后再编
    //译运行它
    Db dbFile = null;
    //生成Db对象
    dbFile = new Db(null, 0);
    //用BTree方式打开数据库,库文件是在c:/temp下的mydata.db文件,表名是employee
    //如果数据库不存在,则自动生成一个新的数据库。
    dbFile.open(null,"c:\\temp\\mydata.db","employee",Db.DB_BTREE,
    Db.DB_CREATE,0);
    Dbt key = new Dbt();
    Dbt data = new Dbt();
    //向库文件中插入一条数据,如果已经存在,打印出错信息
    if (dbFile.put(null,key, data, Db.DB_APPEND) == Db.DB_KEYEXIST) {
        System.out.println("Key already exists.");
    }
    //关闭数据文件
    dbFile.close(0);
    //重新打开数据文件
    dbFile = new Db(null, 0);
    dbFile.open(null, "c:\\temp\\mydata.db", "employee", Db.DB_UNKNOWN, 
    0, 0644);
    // 声明一个数据库游标Dbc对象iterator
    Dbc iterator = dbFile.cursor(null, 0);
    // 遍历整个表
    Dbt key = new Dbt();
    while (iterator.get(key, data, Db.DB_NEXT) == 0)
    {
    System.out.println("reading");
    }
    //关闭游标和数据文件
    iterator.close();
    dbFile.close(0); 
    在运行Berkeley DB的程序时勿必在系统环境变量PATH中设置libdb41.dll和 libdb_java41.dll所在的路径。
      

  10.   

    二. SQLite1. 简介相信PHP的开发人员一定不会对SQLite感到陌生,因为在PHP5中已经集成了这个轻巧的内嵌式数据库产品。SQLite与Berkeley DB相比,在操作语句上更类似关系型数据库的产品。绝大多数标准的SQL92语句SQLite都能支持。 SQLite的版权允许无任何限制的应用,包括商业性的产品。在参考链接二上提供的SQLite官方主站上可以下载到编译后的SQLite程序。但推荐应用CVS工具下载最新版本的SQLite源代码。如果在*nux平台下,可直接用make编译。如果在Windows平台,常用的有两种方法,一是应用在Windows平台下的Linux仿真程序,如MingW或Cygwin提供的make来编译。二是应用MS VC平台编译。后者设置略有麻烦,但可仿照参考链接五上提供的MS VC6工程文件的样例。应用到这个样例的时候,要注意的是由于SQLite源代码在不断更新,如果直接应用样例所提供的VC6工程文件编译会出现一些问题,读者要根据具体的情况稍微调整一下编译的设置。 2. 编译第三方Java接口SQLite源代码是C,而且官方网站上只提供了C和Tcl语言的接口。为了应用Java接口,要采用第三方的接口驱程,可在参考链接三中找到这个Java接口程序。这个接口提供了两种连接SQLite的方式:一是直接用JNI技术调用SQLite的C语言接口,这种方式要求开发人员要对SQLite本身的API也有一定的了解。在第二种方式中,接口程序实现了Java标准规范的JDBC接口,这样开发人员只要对JDBC有了解就可以了。 下面介绍在Windows系统MS VC6环境中编译SQLite Java接口(同时包括JNI和JDBC两个接口)的过程。如果你对C语言编译的设置很熟悉,可以跳这这段介绍。 第一步先把SQLite源代码编译成Lib静态库文件。具体的步骤可以直接应用下面参考链接中提供的MS VC6工作区文件,其中有一个编译SQLite到静态库的设置。编译成功后得到SQLite.lib文件。第二步要建立一个新的VC DLL项目,然后和上面介绍的Berkeley DB在编译Java本地化接口的设置一样,在VC的Tools菜单Options选项中指定JNI.H等JNI编译所要的头文件位置。同时还要指定sqlite.h头文件位置,这个文件是在生成SQLite静态库的时候自动生成的,可以在SQLite.lib文件所在的工作区目录下面找到它,例如加入的路径为C:\sqlite\msvc6。然后在Project菜单的setting选项设置Link到SQLite.lib库文件,并再次在Tools菜单中Options指定SQLite.lib的查找路径。注意有些情况下可能要设置予编译选项HAVE_SQLITE_COMPILE以便使用SQLite中VM的一些功能。编译成功后可得到Sqlite_jni.dll文件。 第三方接口库中的Java代码包含JNI接口和多个版本的JDBC接口程序,可根据你的JRE的版本选择相应的JDBC程序。编译这些Java代码的过程这里就不做叙述了。 编译后的Java类包加上前面得到的Sqlite_jni.dll文件,组成了SQLite的Java接口库,在应用Java语言调用JDBC或JNI接口时,都是通过应用Java的本地化技术调用Sqlite_jni.dll文件,完成对SQLite数据库的操作。 3. 应用JNI直接调用SQLite功能下面这段代码演示如何应用JNI接口操作SQLite。可以看到Database类的exec()方法是执行SQL语句的关键: 
    Database db = new Database();
    try {
    //打开数据库
    db.open("c:\\temp\\mydata.slt", 0666);
    db.interrupt();
    db.busy_timeout(1000);
    db.busy_handler(null);
    db.exec("create table account (name varchar(10),gale boolean)"
    ,result);
    db.exec("insert into account values('steve','m')", result);
    db.exec("select * from account",result);
    //关闭数据库
    db.close();
    } catch (Exception e) {
    e.printStackTrace();