1. 程式人生 > 其它 >Java基礎-22總結登入註冊IO版,資料操作流,記憶體操作流,列印流,標準輸入輸出流,

Java基礎-22總結登入註冊IO版,資料操作流,記憶體操作流,列印流,標準輸入輸出流,

1:登入註冊IO版本案例(掌握)

要求,對著寫一遍。

 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);
 }
}