Java基于IO流實(shí)現(xiàn)登錄和注冊(cè)功能
案例分析:
我們之前做過(guò)的登錄注冊(cè)案例是把用戶信息存進(jìn)集合里,要用IO流實(shí)現(xiàn)的話,就是要把用戶信息存入文件中。登錄注冊(cè)兩個(gè)功能的具體實(shí)現(xiàn)是在用戶操作類(lèi)中,所以我們只需要在用戶操作類(lèi)中把之前用戶信息存進(jìn)集合改為存進(jìn)文件就可以了。
用到的類(lèi)的詳細(xì)分解:
(1)用戶類(lèi)(User):用戶名,密碼,郵箱,電話號(hào)碼等等各種注冊(cè)時(shí)會(huì)用到的東西。我們?cè)趯?shí)現(xiàn)這個(gè)登錄和注冊(cè)案例的時(shí)候只需要用戶名和密碼就夠了。這是一個(gè)標(biāo)準(zhǔn)Java描述類(lèi)。
package com.edu.domain;
public class User {
? ? private String userName;
? ? private String passWord;
? ? public String getUserName() {
? ? ? ? return userName;
? ? }
? ? public void setUserName(String userName) {
? ? ? ? this.userName = userName;
? ? }
? ? public String getPassWord() {
? ? ? ? return passWord;
? ? }
? ? public void setPassWoed(String passWord) {
? ? ? ? this.passWord = passWord;
? ? }
? ? public User(String userName, String passWord) {
? ? ? ? super();
? ? ? ? this.userName = userName;
? ? ? ? this.passWord = passWord;
? ? }
? ? public User() {
? ? ? ? super();
? ? ? ? // TODO Auto-generated constructor stub
? ? }
}(2)我們需要定義一個(gè)接口(UserDao)來(lái)定義注冊(cè)和登錄功能。接口就是對(duì)類(lèi)的功能的一種擴(kuò)展,它的本質(zhì)是用來(lái)定義規(guī)則的。
package com.edu.dao;
import java.io.IOException;
import com.edu.domain.User;
public interface UserDao {
? ? //定義兩個(gè)功能
? ? //注冊(cè)功能
? ? public abstract void regist(User user) throws IOException;
? ? //登錄功能
? ? public abstract boolean isLogin(String userName,String passWord);
}(3)用戶操作類(lèi)(UserDaoImpl),也就是之前定義的接口UserDao的實(shí)現(xiàn)類(lèi)。
package com.edu.dao.impl;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import com.edu.dao.UserDao;
import com.edu.domain.User;
public class UserDaoImpl implements UserDao{
? ? public static File file = new File("user.txt");
? ? //靜態(tài)代碼塊,隨著類(lèi)的加載而加載
? ? static{
? ? ? ? try{
? ? ? ? ? ? file.createNewFile();
? ? ? ? }catch(IOException e){
? ? ? ? ? ? e.printStackTrace();
? ? ? ? }
? ? }
? ? //注冊(cè)功能
? ? @Override
? ? public void regist(User user) throws IOException {
? ? ? ? try{
? ? ? ? ? ? //把用戶信息存進(jìn)文件里
? ? ? ? ? ? String info=user.getUserName()+"="+user.getPassWord();
? ? ? ? ? ? //創(chuàng)建高效字符輸出流來(lái)給文件寫(xiě)入數(shù)據(jù),創(chuàng)建了一個(gè)可以追加寫(xiě)入的FileWriter,避免了文件中之前的用戶信息被覆蓋
? ? ? ? ? ? BufferedWriter bw = new BufferedWriter(new FileWriter("user.txt",true));
? ? ? ? ? ? bw.write(info);
? ? ? ? ? ? bw.newLine();
? ? ? ? ? ? bw.flush();
? ? ? ? ? ? bw.close();
? ? ? ? }catch(IOException e){
? ? ? ? ? ? e.printStackTrace();
? ? ? ? }
? ? }
? ? //登錄功能
? ? @Override
? ? public boolean isLogin(String userName, String passWord) {
? ? ? ? boolean flag=false;
? ? ? ? try{
? ? ? ? ? ? //創(chuàng)建高效字符輸入流來(lái)讀取數(shù)據(jù)
? ? ? ? ? ? BufferedReader br = new BufferedReader(new FileReader("user.txt"));
? ? ? ? ? ? String line;
? ? ? ? ? ? while ((line=br.readLine())!=null) {
? ? ? ? ? ? ? ? String[] s=line.split("=");
? ? ? ? ? ? ? ? if (s[0].equals(userName)&&s[1].equals(passWord)) {
? ? ? ? ? ? ? ? ? ? flag=true;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? }catch(IOException e){
? ? ? ? ? ? e.printStackTrace();
? ? ? ? }
? ? ? ? return flag;
? ? }
}(4)在用戶完成注冊(cè)登錄后,我們可以實(shí)現(xiàn)某種功能了,例如:猜數(shù)字小游戲。再建一個(gè)游戲類(lèi)(GuessNumber)。
package com.edu.game;
import java.util.Scanner;
public class GuessNumber {
? ? public static void playGame(){
? ? ? ? //獲取一個(gè)1到100的隨機(jī)數(shù)
? ? ? ? int random = (int)(Math.random()*100+1);
? ? ? ? //鍵盤(pán)錄入
? ? ? ? Scanner sc = new Scanner(System.in);
? ? ? ? //給出提示
? ? ? ? System.out.println("請(qǐng)輸入所猜的數(shù)字");
? ? ? ? int number = sc.nextInt();
? ? ? ? while(true){
? ? ? ? ? ? if(number==random){
? ? ? ? ? ? ? ? System.out.println("恭喜你猜對(duì)了!");
? ? ? ? ? ? ? ? break;
? ? ? ? ? ? }else if(number>random){
? ? ? ? ? ? ? ? System.out.println("大了,請(qǐng)繼續(xù)輸入:");
? ? ? ? ? ? ? ? number=sc.nextInt();
? ? ? ? ? ? }else if(number<random){
? ? ? ? ? ? ? ? System.out.println("小了,請(qǐng)繼續(xù)輸入:");
? ? ? ? ? ? ? ? number=sc.nextInt();
? ? ? ? ? ? }
? ? ? ? }
? ? }
}(5)測(cè)試類(lèi)(Test)。
package com.edu.test;
import java.io.IOException;
import java.util.Scanner;
import com.edu.dao.impl.UserDaoImpl;
import com.edu.domain.User;
import com.edu.game.GuessNumber;
public class Test {
? ? public static void main(String[] args) throws IOException {
? ? ? ? while (true) {
? ? ? ? ? ? //創(chuàng)建鍵盤(pán)錄入對(duì)象,獲取鍵盤(pán)錄入信息
? ? ? ? ? ? Scanner sc = new Scanner(System.in);
? ? ? ? ? ? System.out.println("歡迎來(lái)到注冊(cè)登錄界面!");
? ? ? ? ? ? System.out.println("1.注冊(cè)");
? ? ? ? ? ? System.out.println("2.登錄");
? ? ? ? ? ? System.out.println("3.退出");
? ? ? ? ? ? String choice = sc.nextLine();
? ? ? ? ? ? //創(chuàng)建一個(gè)用戶操作類(lèi)
? ? ? ? ? ? UserDaoImpl udi = new UserDaoImpl();
? ? ? ? ? ? //利用switch循環(huán)對(duì)選擇進(jìn)行操作
? ? ? ? ? ? switch(choice){
? ? ? ? ? ? case "1":
? ? ? ? ? ? ? ? System.out.println("歡迎來(lái)到注冊(cè)界面!");
? ? ? ? ? ? ? ? System.out.println("請(qǐng)輸入用戶名:");
? ? ? ? ? ? ? ? String userName = sc.nextLine();
? ? ? ? ? ? ? ? System.out.println("請(qǐng)輸入密碼:");
? ? ? ? ? ? ? ? String passWord = sc.nextLine();
? ? ? ? ? ? ? ? User user = new User(userName,passWord);
? ? ? ? ? ? ? ? udi.regist(user);
? ? ? ? ? ? ? ? System.out.println("注冊(cè)成功!");
? ? ? ? ? ? ? ? break;
? ? ? ? ? ? case "2":
? ? ? ? ? ? ? ? System.out.println("歡迎來(lái)到登錄界面!");
? ? ? ? ? ? ? ? System.out.println("請(qǐng)輸入用戶名:");
? ? ? ? ? ? ? ? String inputUserName = sc.nextLine();
? ? ? ? ? ? ? ? System.out.println("請(qǐng)輸入密碼:");
? ? ? ? ? ? ? ? String InputPassWord = sc.nextLine();
? ? ? ? ? ? ? ? if (udi.isLogin(inputUserName,InputPassWord)) {
? ? ? ? ? ? ? ? ? ? System.out.println("登陸成功!可以玩游戲了!");
? ? ? ? ? ? ? ? ? ? GuessNumber.playGame();
? ? ? ? ? ? ? ? }else{
? ? ? ? ? ? ? ? ? ? System.out.println("登錄失敗!");
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? break;
? ? ? ? ? ? case "3":
? ? ? ? ? ? default:
? ? ? ? ? ? ? ? //對(duì)于3或者其他數(shù)字的選擇,都直接退出系統(tǒng)
? ? ? ? ? ? ? ? System.exit(0);
? ? ? ? ? ? ? ? break;
? ? ? ? ? ? }
? ? ? ? }
? ? }
}運(yùn)行結(jié)果:
登錄的注冊(cè)的運(yùn)行結(jié)果:

猜數(shù)字游戲后退出系統(tǒng):

案例實(shí)現(xiàn)過(guò)程中遇到的小問(wèn)題:
如果用下面這個(gè)構(gòu)造來(lái)創(chuàng)建高效字符輸出流對(duì)象,程序每運(yùn)行一次,新輸入的用戶信息會(huì)把之前的用戶信息覆蓋掉,文件中只有最近一次存入的用戶信息。
BufferedWriter bw = new BufferedWriter(new FileWriter("user.txt");如何解決這個(gè)問(wèn)題:
我們用下面這個(gè)構(gòu)造來(lái)創(chuàng)建高效字符輸出流來(lái)給文件寫(xiě)入數(shù)據(jù),創(chuàng)建了一個(gè)可以追加寫(xiě)入的FileWriter,避免了文件中之前的用戶信息被覆蓋。
BufferedWriter bw = new BufferedWriter(new FileWriter("user.txt",true));參考:
FileWriter(String fileName, boolean append) //根據(jù)給定的文件名以及指示是否附加寫(xiě)入數(shù)據(jù)的 boolean 值來(lái)構(gòu)造 FileWriter 對(duì)象
例如:我注冊(cè)了三次,文件中就有了這三次存入的用戶信息。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
redisson 實(shí)現(xiàn)分布式鎖的源碼解析
這篇文章主要介紹了redisson 實(shí)現(xiàn)分布式鎖的源碼解析,通過(guò)模擬一個(gè)商品秒殺的場(chǎng)景結(jié)合示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-05-05
Spring?Boot整合Bootstrap的超詳細(xì)步驟
之前做前端開(kāi)發(fā),在使用bootstrap的時(shí)候都是去官網(wǎng)下載,然后放到項(xiàng)目中,在頁(yè)面引用,下面這篇文章主要給大家介紹了關(guān)于Spring?Boot整合Bootstrap的超詳細(xì)步驟,需要的朋友可以參考下2023-05-05
SpringBoot靜態(tài)視頻實(shí)時(shí)播放的實(shí)現(xiàn)代碼
這篇文章主要介紹了SpringBoot靜態(tài)視頻實(shí)時(shí)播放的實(shí)現(xiàn)代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-01-01
SpringBoot使用Caffeine實(shí)現(xiàn)緩存的示例代碼
本文主要介紹了SpringBoot使用Caffeine實(shí)現(xiàn)緩存的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07
Java運(yùn)算符的常見(jiàn)問(wèn)題與用法小結(jié)
這篇文章主要介紹了Java運(yùn)算符,結(jié)合實(shí)例形式總結(jié)分析了Java各種常見(jiàn)運(yùn)算符,包括算術(shù)運(yùn)算符、比較運(yùn)算符、邏輯運(yùn)算符、位運(yùn)算符等相關(guān)功能、原理與使用技巧,需要的朋友可以參考下2020-04-04
BeanUtils.copyProperties()所有的空值不復(fù)制問(wèn)題
這篇文章主要介紹了BeanUtils.copyProperties()所有的空值不復(fù)制問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06
Java數(shù)據(jù)結(jié)構(gòu)之圖的路徑查找算法詳解
這篇文章主要為大家詳細(xì)介紹了java數(shù)據(jù)結(jié)構(gòu)中圖的路徑查找算法,文中的示例代碼講解詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-11-11
Java Socket編程實(shí)現(xiàn)簡(jiǎn)單的問(wèn)候服務(wù)
這篇文章主要為大家介紹了Java Socket編程實(shí)現(xiàn)簡(jiǎn)單的問(wèn)候服務(wù),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-01-01
Spring創(chuàng)建bean的幾種方式及使用場(chǎng)景
本文主要介紹了Spring創(chuàng)建bean的幾種方式及使用場(chǎng)景,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04
Java線程的生命周期和狀態(tài)控制_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要介紹了Java線程的生命周期和狀態(tài)控制,需要的朋友可以參考下2017-05-05

