Java基礎-22總結登入註冊IO版,資料操作流,記憶體操作流,列印流,標準輸入輸出流,
阿新 • • 發佈:2022-05-04
要求,對著寫一遍。
cn.itcast.pojo User cn.itcast.dao UserDao cn.itcast.dao.impl UserDaoImpl(實現我不管) cn.itcast.game GuessNumber cn.itcast.test UserTest package cn.itcast.pojo;(1) /** * 這是使用者基本描述類 * * @author 風清揚 * @version V1.1 * */ public class User { // 使用者名稱 private String username; // 密碼 private String password; public User() { } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } } package cn.itcast.dao;(2) import cn.itcast.pojo.User; /** * 這是針對使用者進行操作的介面 * * @author 風清揚 * @version V1.1 * */ public interface UserDao { /** * 這是使用者登入功能 * * @param username * 使用者名稱 * @param password * 密碼 * @return 返回登入是否成功 */ public abstract boolean isLogin(String username, String password); /** * 這是使用者註冊功能 * * @param user * 要註冊的使用者資訊 */ public abstract void regist(User user); } package cn.itcast.dao.impl;(3) import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import cn.itcast.dao.UserDao; import cn.itcast.pojo.User; /** * 這是使用者操作的具體實現類(IO版) * * @author 風清揚 * @version V1.1 * */ public class UserDaoImpl implements UserDao { // 為了保證檔案一載入就建立 private static File file = new File("user.txt"); static { try { file.createNewFile(); } catch (IOException e) { System.out.println("建立檔案失敗"); // e.printStackTrace(); } } @Override public boolean isLogin(String username, String password) { boolean flag = false; BufferedReader br = null; try { // br = new BufferedReader(new FileReader("user.txt")); br = new BufferedReader(new FileReader(file)); String line = null; while ((line = br.readLine()) != null) { // 使用者名稱=密碼 String[] datas = line.split("="); if (datas[0].equals(username) && datas[1].equals(password)) { flag = true; break; } } } catch (FileNotFoundException e) { System.out.println("使用者登入找不到資訊所在的檔案"); // e.printStackTrace(); } catch (IOException e) { System.out.println("使用者登入失敗"); // e.printStackTrace(); } finally { if (br != null) { try { br.close(); } catch (IOException e) { System.out.println("使用者登入釋放資源失敗"); // e.printStackTrace(); } } } return flag; } @Override public void regist(User user) { /* * 為了讓註冊的資料能夠有一定的規則,我就自己定義了一個規則: 使用者名稱=密碼 */ BufferedWriter bw = null; try { // bw = new BufferedWriter(new FileWriter("user.txt")); // bw = new BufferedWriter(new FileWriter(file)); // 為了保證資料是追加寫入,必須加true bw = new BufferedWriter(new FileWriter(file, true)); bw.write(user.getUsername() + "=" + user.getPassword()); bw.newLine(); bw.flush(); } catch (IOException e) { System.out.println("使用者註冊失敗"); // e.printStackTrace(); } finally { if (bw != null) { try { bw.close(); } catch (IOException e) { System.out.println("使用者註冊釋放資源失敗"); // e.printStackTrace(); } } } } } package cn.itcast.game;(4) import java.util.Scanner; /** * 這是猜數字小遊戲 * * @author 風清揚 * @version V1.1 * */ public class GuessNumber { private GuessNumber() { } public static void start() { // 產生一個隨機數 int number = (int) (Math.random() * 100) + 1; // 定義一個統計變數 int count = 0; while (true) { // 鍵盤錄入一個數據 Scanner sc = new Scanner(System.in); System.out.println("請輸入資料(1-100):"); int guessNumber = sc.nextInt(); count++; // 判斷 if (guessNumber > number) { System.out.println("你猜的資料" + guessNumber + "大了"); } else if (guessNumber < number) { System.out.println("你猜的資料" + guessNumber + "小了"); } else { System.out.println("恭喜你," + count + "次就猜中了"); break; } } } } package cn.itcast.test;(5) import java.util.Scanner; import cn.itcast.dao.UserDao; import cn.itcast.dao.impl.UserDaoImpl; import cn.itcast.game.GuessNumber; import cn.itcast.pojo.User; /** * 使用者測試類 * * @author 風清揚 * @version V1.1 * */ public class UserTest { public static void main(String[] args) { // 為了能夠回來 while (true) { // 歡迎介面,給出選擇項 System.out.println("--------------歡迎光臨--------------"); System.out.println("1 登入"); System.out.println("2 註冊"); System.out.println("3 退出"); System.out.println("請輸入你的選擇:"); // 鍵盤錄入選擇,根據選擇做不同的操作 Scanner sc = new Scanner(System.in); // 為了後面的錄入資訊的方便,我所有的資料錄入全部用字元接收 String choiceString = sc.nextLine(); // switch語句的多個地方要使用,我就定義到外面 UserDao ud = new UserDaoImpl(); // 經過簡單的思考,我選擇了switch switch (choiceString) { case "1": // 登入介面,請輸入使用者名稱和密碼 System.out.println("--------------登入介面--------------"); System.out.println("請輸入使用者名稱:"); String username = sc.nextLine(); System.out.println("請輸入密碼:"); String password = sc.nextLine(); // 呼叫登入功能 // UserDao ud = new UserDaomImpl(); boolean flag = ud.isLogin(username, password); if (flag) { System.out.println("登入成功,可以開始玩遊戲了"); System.out.println("你玩嗎?y/n"); while (true) { String resultString = sc.nextLine(); if (resultString.equalsIgnoreCase("y")) { // 玩遊戲 GuessNumber.start(); System.out.println("你還玩嗎?y/n"); } else { break; } } System.out.println("謝謝使用,歡迎下次再來"); System.exit(0); // break; //這裡寫break,結束的是switch } else { System.out.println("使用者名稱或者密碼有誤,登入失敗"); } break; case "2": // 歡迎介面,請輸入使用者名稱和密碼 System.out.println("--------------註冊介面--------------"); System.out.println("請輸入使用者名稱:"); String newUsername = sc.nextLine(); System.out.println("請輸入密碼:"); String newPassword = sc.nextLine(); // 把使用者名稱和密碼封裝到一個物件中 User user = new User(); user.setUsername(newUsername); user.setPassword(newPassword); // 呼叫註冊功能 // 多型 // UserDao ud = new UserDaoImpl(); // 具體類使用 // UserDaoImpl udi = new UserDaoImpl(); ud.regist(user); System.out.println("註冊成功"); break; case "3": default: System.out.println("謝謝使用,歡迎下次再來"); System.exit(0); break; } } } }
2:資料操作流(操作基本型別資料的流)(理解)
(1)可以操作基本型別的資料
(2)流物件名稱
DataInputStream
DataOutputStream
package cn.itcast_01; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; /* * 可以讀寫基本資料型別的資料 * 資料輸入流:DataInputStream * DataInputStream(InputStream in) * 資料輸出流:DataOutputStream * DataOutputStream(OutputStream out) */ public class DataStreamDemo { public static void main(String[] args) throws IOException { // 寫 // write(); // 讀 read(); } private static void read() throws IOException { // DataInputStream(InputStream in) // 建立資料輸入流物件 DataInputStream dis = new DataInputStream( new FileInputStream("dos.txt")); // 讀資料 byte b = dis.readByte(); short s = dis.readShort(); int i = dis.readInt(); long l = dis.readLong(); float f = dis.readFloat(); double d = dis.readDouble(); char c = dis.readChar(); boolean bb = dis.readBoolean(); // 釋放資源 dis.close(); System.out.println(b); System.out.println(s); System.out.println(i); System.out.println(l); System.out.println(f); System.out.println(d); System.out.println(c); System.out.println(bb); } private static void write() throws IOException { // DataOutputStream(OutputStream out) // 建立資料輸出流物件 DataOutputStream dos = new DataOutputStream(new FileOutputStream( "dos.txt")); // 寫資料了 dos.writeByte(10); dos.writeShort(100); dos.writeInt(1000); dos.writeLong(10000); dos.writeFloat(12.34F); dos.writeDouble(12.56); dos.writeChar('a'); dos.writeBoolean(true); // 釋放資源 dos.close(); } }
3:記憶體操作流(理解)
(1)有些時候我們操作完畢後,未必需要產生一個檔案,就可以使用記憶體操作流。
(2)三種
A:ByteArrayInputStream,ByteArrayOutputStream
B:CharArrayReader,CharArrayWriter
C:StringReader,StringWriter
package cn.itcast_02; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; /* * 記憶體操作流:用於處理臨時儲存資訊的,程式結束,資料就從記憶體中消失。 * 位元組陣列: * ByteArrayInputStream * ByteArrayOutputStream * 字元陣列: * CharArrayReader * CharArrayWriter * 字串: * StringReader * StringWriter */ public class ByteArrayStreamDemo { public static void main(String[] args) throws IOException { // 寫資料 // ByteArrayOutputStream() ByteArrayOutputStream baos = new ByteArrayOutputStream(); // 寫資料 for (int x = 0; x < 10; x++) { baos.write(("hello" + x).getBytes()); } // 釋放資源 // 通過檢視原始碼我們知道這裡什麼都沒做,所以根本需要close() // baos.close(); // public byte[] toByteArray() byte[] bys = baos.toByteArray(); // 讀資料 // ByteArrayInputStream(byte[] buf) ByteArrayInputStream bais = new ByteArrayInputStream(bys); int by = 0; while ((by = bais.read()) != -1) { System.out.print((char) by); } // bais.close(); } }
4:列印流(掌握)
(1)位元組列印流,字元列印流
(2)特點:
A:只操作目的地,不操作資料來源
B:可以操作任意型別的資料
C:如果啟用了自動重新整理,在呼叫println()方法的時候,能夠換行並重新整理
D:可以直接操作檔案
問題:哪些流可以直接操作檔案呢?
看API,如果其構造方法能夠同時接收File和String型別的引數,一般都是可以直接操作檔案的
package cn.itcast_03;
import java.io.IOException;
import java.io.PrintWriter;
/*
* 列印流
* 位元組流列印流 PrintStream
* 字元列印流 PrintWriter
*
* 列印流的特點:
* A:只有寫資料的,沒有讀取資料。只能操作目的地,不能操作資料來源。
* B:可以操作任意型別的資料。
* C:如果啟動了自動重新整理,能夠自動重新整理。
* D:該流是可以直接操作文字檔案的。
* 哪些流物件是可以直接操作文字檔案的呢?
* FileInputStream
* FileOutputStream
* FileReader
* FileWriter
* PrintStream
* PrintWriter
* 看API,查流物件的構造方法,如果同時有File型別和String型別的引數,一般來說就是可以直接操作檔案的。
*
* 流:
* 基本流:就是能夠直接讀寫檔案的
* 高階流:在基本流基礎上提供了一些其他的功能
*/
public class PrintWriterDemo {
public static void main(String[] args) throws IOException {
// 作為Writer的子類使用
PrintWriter pw = new PrintWriter("pw.txt");
pw.write("hello");
pw.write("world");
pw.write("java");
pw.close();
}
}
package cn.itcast_03;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
/*
* 1:可以操作任意型別的資料。
* print()
* println()
* 2:啟動自動重新整理
* PrintWriter pw = new PrintWriter(new FileWriter("pw2.txt"), true);
* 還是應該呼叫println()的方法才可以
* 這個時候不僅僅自動重新整理了,還實現了資料的換行。
*
* println()
* 其實等價于于:
* bw.write();
* bw.newLine();
* bw.flush();
*/
public class PrintWriterDemo2 {
public static void main(String[] args) throws IOException {
// 建立列印流物件
// PrintWriter pw = new PrintWriter("pw2.txt");
PrintWriter pw = new PrintWriter(new FileWriter("pw2.txt"), true);
// write()是搞不定的,怎麼辦呢?
// 我們就應該看看它的新方法
// pw.print(true);
// pw.print(100);
// pw.print("hello");
pw.println("hello");
pw.println(true);
pw.println(100);
pw.close();
}
}
(3)列印流複製文字檔案
BufferedReader br = new BufferedReader(new FileReader("a.txt"));
PrintWriter pw = new PrintWriter(new FileWriter("b.txt"),true);
String line = null;
while((line=br.readLine())!=null) {
pw.println(line);
}
pw.close();
br.close();
package cn.itcast_03;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
/*
* 需求:DataStreamDemo.java複製到Copy.java中
* 資料來源:
* DataStreamDemo.java -- 讀取資料 -- FileReader -- BufferedReader
* 目的地:
* Copy.java -- 寫出資料 -- FileWriter -- BufferedWriter -- PrintWriter
*/
public class CopyFileDemo {
public static void main(String[] args) throws IOException {
// 以前的版本
// 封裝資料來源
// BufferedReader br = new BufferedReader(new FileReader(
// "DataStreamDemo.java"));
// // 封裝目的地
// BufferedWriter bw = new BufferedWriter(new FileWriter("Copy.java"));
//
// String line = null;
// while ((line = br.readLine()) != null) {
// bw.write(line);
// bw.newLine();
// bw.flush();
// }
//
// bw.close();
// br.close();
// 列印流的改進版
// 封裝資料來源
BufferedReader br = new BufferedReader(new FileReader(
"DataStreamDemo.java"));
// 封裝目的地
PrintWriter pw = new PrintWriter(new FileWriter("Copy.java"), true);
String line = null;
while((line=br.readLine())!=null){
pw.println(line);
}
pw.close();
br.close();
}
}
5:標準輸入輸出流(理解)
(1)System類下面有這樣的兩個欄位
in 標準輸入流
out 標準輸出流
package cn.itcast_04;
import java.io.PrintStream;
/*
* 標準輸入輸出流
* System類中的兩個成員變數:
* public static final InputStream in “標準”輸入流。
* public static final PrintStream out “標準”輸出流。
*
* InputStream is = System.in;
* PrintStream ps = System.out;
*/
public class SystemOutDemo {
public static void main(String[] args) {
// 有這裡的講解我們就知道了,這個輸出語句其本質是IO流操作,把資料輸出到控制檯。
System.out.println("helloworld");
// 獲取標準輸出流物件
PrintStream ps = System.out;
ps.println("helloworld");
ps.println();
// ps.print();//這個方法不存在
// System.out.println();
// System.out.print();
}
}
(2)三種鍵盤錄入方式
A:main方法的args接收引數
B:System.in通過BufferedReader進行包裝
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
C:Scanner
Scanner sc = new Scanner(System.in);
package cn.itcast_04;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
/*
* System.in 標準輸入流。是從鍵盤獲取資料的
*
* 鍵盤錄入資料:
* A:main方法的args接收引數。
* java HelloWorld hello world java
* B:Scanner(JDK5以後的)
* Scanner sc = new Scanner(System.in);
* String s = sc.nextLine();
* int x = sc.nextInt()
* C:通過字元緩衝流包裝標準輸入流實現
* BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
*/
public class SystemInDemo {
public static void main(String[] args) throws IOException {
// //獲取標準輸入流
// InputStream is = System.in;
// //我要一次獲取一行行不行呢?
// //行。
// //怎麼實現呢?
// //要想實現,首先你得知道一次讀取一行資料的方法是哪個呢?
// //readLine()
// //而這個方法在哪個類中呢?
// //BufferedReader
// //所以,你這次應該建立BufferedReader的物件,但是底層還是的使用標準輸入流
// // BufferedReader br = new BufferedReader(is);
// //按照我們的推想,現在應該可以了,但是卻報錯了
// //原因是:字元緩衝流只能針對字元流操作,而你現在是位元組流,所以不能是用?
// //那麼,我還就想使用了,請大家給我一個解決方案?
// //把位元組流轉換為字元流,然後在通過字元緩衝流操作
// InputStreamReader isr = new InputStreamReader(is);
// BufferedReader br= new BufferedReader(isr);
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
System.out.println("請輸入一個字串:");
String line = br.readLine();
System.out.println("你輸入的字串是:" + line);
System.out.println("請輸入一個整數:");
// int i = Integer.parseInt(br.readLine());
line = br.readLine();
int i = Integer.parseInt(line);
System.out.println("你輸入的整數是:" + i);
}
}