Java基礎(七)——模擬鬥地主、File、遞歸遍歷目錄、字節流讀存數據

目錄

模擬鬥地主練習

模擬鬥地主升級版

File

遞歸遍歷目錄

字節流

字節流讀數據

字節緩衝流

字節流複製視頻


 

模擬鬥地主練習

需求:通過程序實現鬥地主過程中的洗牌,發牌和看牌
思路:

  • ①創建-個牌盒,也就是定義一個集合對象,用ArrayList集合實現
  • ②往牌盒裏面裝牌
  • ③洗牌,也就是把牌打撒,用Collections的shuffle(方法實現
  • ④發牌,也就是遍歷集合,給三個玩家發牌
  • ⑤看牌,也就是三個玩家分別遍歷自己的牌

 

代碼:

package cn.itcast.day6.demo1;

import java.util.ArrayList;
import java.util.Collections;

public class DouDiZhu {
    public static void main(String[] args) {
        //創建一個牌盒,也就是定義一個集合對象,用Arraylist集合實現
        ArrayList<String> array = new ArrayList<String>();

        //往牌盒裏面裝牌
        /*
            ◆2,◆3,◆4...◆K,◆A
            ♣2,...
            ♠2....
            ♥2....
            小王,大王
        */
        //定義花色數組
        String[] colors = {"♦", "♣", "♠", "♥"};
        //定義點數數組
        String[] numbers = {"A", "2", "3", "4", "5", "6", "7", "8", "9","10", "J", "Q", "K"};
        for (String color : colors) {
            for (String number : numbers) {
                array.add(color + number);
            }
        }
        array.add("小王");
        array.add("大王");

        //洗牌
        Collections.shuffle(array);
//        System.out.println(array);
        //發牌,創建三個玩家集合,和底牌集合
        ArrayList<String> ccArray = new ArrayList<String>();
        ArrayList<String> lbArray = new ArrayList<String>();
        ArrayList<String> sqArray = new ArrayList<String>();
        ArrayList<String> dpArray = new ArrayList<String>();
        for(int i=0;i< array.size();i++){
            String poker = array.get(i);
            if(i>= (array.size()-3)){
                dpArray.add(poker);
            }else if(i%3 == 0){
                ccArray.add(poker);
            }else if(i%3 == 1){
                lbArray.add(poker);
            }else if(i%3 == 2){
                sqArray.add(poker);
            }
        }
        showPoker("曹操",ccArray);
        showPoker("劉備",lbArray);
        showPoker("孫權",sqArray);
        showPoker("底牌",dpArray);
    }
    //看牌方法  參數:人名,牌堆
    public static void showPoker(String name,ArrayList<String> array){
        Collections.sort(array);
        System.out.println(name+"的牌:"+array);
    }
}

結果:

 

模擬鬥地主升級版

需求:通過程序實現鬥地主過程中的洗牌,發牌和看牌。要求:對牌進行排序
思路:

  • ①創建HashMap,鍵是編號,值是牌
  • ②創建ArrayList, 存儲編號
  • ③創建花色數組和點數數組
  • ④從0開始往HashMap裏面存儲編號,並存儲對應的牌。同時往ArrayList裏面存儲編號
  • ⑤洗牌(洗的是編號),用Collections的shuffle0方法實現
  • ⑥發牌(發的也是編號,爲了保證編號是排序的,創建TreeSet集合接收)
  • ⑦定義方法看牌(遍歷TreeSet集合,獲取編號,到HashMap集合找對應的牌)
  • ⑧調用看牌方法

 

代碼:

package cn.itcast.day6.demo1;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.TreeSet;

public class DouDiZhu {
    public static void main(String[] args) {
        //創建HashMap,鍵是編號,值是牌
        HashMap<Integer,String> array = new HashMap<Integer,String>();
        //創建ArrayList, 存儲編號
        ArrayList<Integer> nums = new ArrayList<Integer>();

        //定義花色數組
        String[] colors = {"♦", "♣", "♠", "♥"};
        //定義點數數組
        String[] numbers = {"A", "2", "3", "4", "5", "6", "7", "8", "9", "10","J", "Q", "K"};
        //從0開始往HashMap裏面存儲編號,並存儲對應的牌。同時往ArrayList裏面存儲編號
        int index = 0;
        for (String n : numbers) {
            for (String color : colors) {
                array.put(index,color+n);
                nums.add(index);
                index++;
            }
        }
        array.put(index,"小王");
        nums.add(index);
        index++;
        array.put(index,"大王");
        nums.add(index);
//        System.out.println(array);
        //洗牌(洗的是編號),用Collections的shuffle0方法實現
        Collections.shuffle(nums);
//        System.out.println(array);
        //發牌(發的也是編號,爲了保證編號是排序的,創建TreeSet集合接收),創建三個玩家集合,和底牌集合
        TreeSet<Integer> ccArray = new TreeSet<Integer>();
        TreeSet<Integer> lbArray = new TreeSet<Integer>();
        TreeSet<Integer> sqArray = new TreeSet<Integer>();
        TreeSet<Integer> dpArray = new TreeSet<Integer>();
        for(int i=0;i< nums.size();i++){
            Integer pokerIndex = nums.get(i);
            if(i>= (array.size()-3)){
                dpArray.add(pokerIndex);
            }else if(i%3 == 0){
                ccArray.add(pokerIndex);
            }else if(i%3 == 1){
                lbArray.add(pokerIndex);
            }else if(i%3 == 2){
                sqArray.add(pokerIndex);
            }
        }
//        System.out.println(ccArray);
        showPoker("曹操",ccArray,array);
        showPoker("孫權",sqArray,array);
        showPoker("劉備",lbArray,array);
        showPoker("底牌",dpArray,array);
    }
    //定義方法看牌(遍歷TreeSet集合,獲取編號,到HashMap集合找對應的牌)
    public static void showPoker(String name,TreeSet<Integer> ts,HashMap<Integer,String> array){
        System.out.print(name+"的牌:[");
        for(Integer key:ts){
            String poker = array.get(key);
            System.out.print(poker+" ");
        }
        System.out.println("]");
    }
}

結果:

 

File

  • public class File
    extends Object
    implements Serializable, Comparable<File>

文件和目錄路徑名的抽象表示。

用戶界面和操作系統使用依賴於系統的路徑名字符串命名文件和目錄。 這個類提供了一個抽象的,獨立於系統的層次化路徑名的視圖。 抽象路徑名有兩個組件:

  1. 可選系統有關的前綴字符串,如磁盤驅動器符, "/"爲UNIX根目錄,或"\\\\"的Microsoft Windows UNC路徑,並
  2. 零個或多個字符串名稱的序列。

抽象路徑名中的第一個名稱可能是目錄名稱,或者在Microsoft Windows UNC路徑名的情況下是主機名。 抽象路徑名中的每個後續名稱表示一個目錄; 姓氏可以表示目錄或文件。 空的抽象路徑名沒有前綴和空名稱序列。

File:它是文件和目錄路徑名的抽象表示

  • 文件和目錄是 可以通過File封裝成對象的
  • 對於File而言 ,其封裝的並不是一個真正存在的文件, 僅僅是一個路徑名而已。 它可以是存在的,也可以是不存在的。將來是要通過具體的操作把這個路徑的內容轉換爲具體存在的
方法名 說明
File(String pathname) 通過將給定的路徑名字符串轉換爲抽象路徑名來創建新的File實例
File(String parent, String child) 從父路徑名字符串和子路徑名字符串創建新的File實例
File(File parent, String child) 從父抽象路徑名和子路徑名字符串創建新的File實例


例子:File的簡單描述和構造方法

import java.io.File;

public class FileDemo {
    public static void main(String[] args) {
        //File(String pathname)	通過將給定的路徑名字符串轉換爲抽象路徑名來創建新的File實例
        File f1 = new File("D:\\eclipse\\API文檔\\File.txt");
        System.out.println(f1);

        //File(String parent, String child)	從父路徑名字符串和子路徑名字符串創建新的File實例
        File f2 = new File("D:\\eclipse\\API文檔","File.txt");
        System.out.println(f2);

        //File(File parent, String child)	從父抽象路徑名和子路徑名字符串創建新的File實例
        File f3 = new File("D:\\eclipse\\API文檔");
        File f4 = new File(f3,"File.txt");
        System.out.println(f4);
    }
}

結果:


File類創建功能:

  • public boolean createNewFile(): 當具有該名稱的文件不存在時,創建一個 由該抽象路徑名命名的新空文件
    • 如果文件不存在,就創建文件,並返回true
    • 如果文件存在,就不創建文件,並返回false
  • public boolean mkdir():創建由此抽象路徑名命名的目錄
    • 如果目錄不存在,就創建文件,並返回true
    • 如果目錄存在,就不創建文件,並返回false
  • public boolean mkdirs(): 創建由此抽象路徑名命名的目錄,包括任何必需但不存在的父目錄
public class FileDemo {
    public static void main(String[] args) throws IOException {
        //需求1:我要在E:llitcast目錄下創建一個文件File.txt
        File f1 = new File("D:\\eclipse\\API文檔\\File.txt");
        System.out.println(f1.createNewFile());
        System.out.println("-------");
        //需求2:我要在E:\litcast目錄 下創建一個目錄JavaSE
        File f2 = new File("D:\\eclipse\\API文檔\\JavaSE");
        System.out.println(f2.mkdir());
        System.out.println("-------");
        //需求3:我要在E:llitcast目錄 下創建一個多級目錄JavaWEB\ \HTML
        File f3 = new File("D:\\eclipse\\API文檔\\JavaWEB\\HTML");
        //System.out.println(f3.mkdir());
        System.out.println(f3.mkdirs());

    }
}

File類的判斷和獲取功能:

  • public boolean isDirectory(): 測試此抽象路徑名錶示的File是否爲目錄
  • public boolean isFile(): 測試此抽象路徑名錶示的File是否爲文件
  • public boolean exists(): 測試此抽象路徑名錶示的File是否存在
  • public String getAbsolutePath(): 返回此抽象路徑名的絕對路徑名字符串
  • public String getPath(): 將此抽象路徑名轉換爲路徑名字符串
  • public String getName():返回由此抽象路徑名錶示的文件或目錄的名稱
  • public String[] list(): 返回此抽象路徑名錶示的目錄中的文件和目錄的名稱字符串數組
  • public File[] listFiles(): 返回此抽象路徑名錶示的目錄中的文件和目錄的File對象數組

File類的刪除功能

  • public boolean delete():刪除由此抽象路徑名錶示的文件或目錄

 

遞歸遍歷目錄

需求:給定一個路徑(E:\itcast), 請通過遞歸完成遍歷該目錄下的所有內容,並把所有文件的絕對路徑輸出在控制檯
思路:

  • ①根據給定的路徑創建一 個File對象
  • ②定義一個方法,用於獲取給定目錄下的所有內容,參數爲第1步創建的File對象
  • ③獲取給定的File目錄下所有的文件或者目錄的File數組
  • ④遍歷該File數組,得到每一個File對象
  • ⑤判斷該File對象是否是目錄
    • 是:遞歸調用
    • 不是:獲取絕對路徑輸出在控制檯
  • ⑥調用方法

代碼:

import java.io.File;
import java.io.IOException;

public class FileDemo {
    public static void main(String[] args) throws IOException {
        //根據給定的路徑創建一 個File對象
        File srcFile = new File("D:\\eclipse\\API文檔");
        //調用方法
        getFilePath(srcFile);
    }
    //定義一個方法,用於獲取給定目錄下的所有內容,參數爲第1步創建的File對象
    public static void getFilePath(File srcFile){
        //獲取給定的File目錄下所有的文件或者目錄的File數組
        File[] files = srcFile.listFiles();
        //遍歷該File數組,得到每一個File對象
        if(files != null){
            for(File i:files){
                //判斷該File對象是否是目錄
                if(i.isDirectory()){
                    //是:遞歸調用
                    getFilePath(i);
                }else {
                    //不是:獲取絕對路徑輸出在控制檯
                    System.out.println(i.getAbsolutePath());
                }
            }
        }

    }
}

結果:

字節流

字節流讀數據

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

public class ZiJie {
    public static void main(String[] args) throws IOException {
        //創建字節輸入流對象
        FileInputStream fis = new FileInputStream("D:\\eclipse\\API文檔\\File.txt");
        //調用字節輸入流對象的讀數據方法
        //int read (byte[] b): 從該輸入流讀取最多b. length個字節的數據到一個字節數組
        byte[] bys = new byte[1024];
        //第一次讀取數據
        int len;
        while ((len=fis.read(bys))!=-1){
            System.out.println(len);
            System.out.println(new String(bys,0,len));
        }

        //釋放資源
        fis.close();
    }
}

結果:

 

字節緩衝流

public class BufferedOutputStream
extends FilterOutputStream

該類實現緩衝輸出流。 通過設置這樣的輸出流,應用程序可以向底層輸出流寫入字節,而不必爲寫入的每個字節導致底層系統的調用。

public class BufferedInputStream
extends FilterInputStream

A BufferedInputStream爲另一個輸入流添加了功能,即緩衝輸入和支持markreset方法的功能。 當創建BufferedInputStream時,將創建一個內部緩衝區數組。 當從流中讀取或跳過字節時,內部緩衝區將根據需要從所包含的輸入流中重新填充,一次有多個字節。 mark操作會記住輸入流中的一點,並且reset操作會導致從最近的mark操作之後讀取的所有字節在從包含的輸入流中取出新的字節之前重新讀取。

字節緩衝流:

  • BufferOutputStream: 該類實現緩衝輸出流。通過設置這樣的輸出流,應用程序可以向底層輸出流寫入字節,而不必爲寫入的每個字節導致底層系統的調用
  • BufferedInputStream:創建BufferedInputStream將創建一 個內部緩衝區數組。 當從流中讀取或跳過字節時,內部緩衝區將根據需要從所包含的輸入流中重新填充,- 次很多字節

構造方法:

  • 字節緩衝輸出流: BufferedOutputStream(OutputStream out)
  • 字節緩衝輸入流: BufferedInputStream(InputStreamin) 


爲什麼構造方法需要的是字節流,而不是具體的文件或者路徑呢?

  • 字節緩衝流僅僅提供緩衝區, 而真正的讀寫數據還得依靠基本的字節流對象進行操作

 

例子:

public class ZiJie {
    public static void main(String[] args) throws IOException {
        /*//字節緩衝輸出流: BufferedOutputStream(OutputStream out)
        FileOutputStream fos = new FileOutputStream("D:\\eclipse\\API文檔\\File.txt",true);
        BufferedOutputStream bos = new BufferedOutputStream(fos);
        //寫數據
        bos.write("什麼事情\r\n".getBytes());
        bos.write("hi\r\n".getBytes());
        bos.close();
        fos.close();*/

        //字節緩衝輸入流: BufferedInputStream(InputStreamin) 
//        InputStreamReader reader = new InputStreamReader(new FileInputStream("D:\\eclipse\\API文檔\\File.txt"),"utf-8");
//        BufferedReader bis = new BufferedReader(reader);
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream("D:\\eclipse\\API文檔\\File.txt"));
        //一次讀取一個字節數據
//        int by;
//        while ((by=bis.read())!=-1){
//            System.out.print((char)by);
//        }
        //一次讀取一個字節數組
        byte[] bys = new byte[1024];
        int len;
        while ((len=bis.read(bys))!=-1){
            System.out.print(new String(bys,0,len));
        }
        bis.close();
    }
}

結果:

 

字節流複製視頻

思路:

  • 1:根據數據源創建字節輸入流對象
  • 2:根據目的地創建字節輸出流對象
  • 3:讀寫數據,複製圖片(一次讀取一個字節數組,一次寫入一個字節數組)
  • 4:釋放資源

四種方式實現複製視頻,並記錄每種方式複製視頻的時間

  • 1:基本字節流一次讀寫一個字節   ---  最慢
  • 2:基本字節流一次讀寫一個字節數組
  • 3:字節緩衝流一次讀寫一個字節
  • 4:字節緩衝流一次讀寫一個字節數組    ----  最快

代碼:

public class ZiJie {
    public static void main(String[] args) throws IOException {
        //記錄開始時間
        long startTime = System.currentTimeMillis();
        //複製視頻
        method1();
        method2();
        method3();
        method4();
        
        //記錄結束時間
        long endTime = System.currentTimeMillis();
        System.out.println("共耗時: " + (endTime - startTime) + "毫秒");
    }

    //基本字節流一次讀寫一個字節
    public static void method1() throws IOException {
        FileInputStream fis = new FileInputStream("E:\\itcast\\字節 流複製圖片.avi");
        FileOutputStream fos = new FileOutputStream("myByteStream\\字節 流複製圖片.avi");
        int by;
        while ((by = fis.read()) != -1) {
            fos.write(by);
        }
        fos.close();
        fis.close();
    }
    //基本字節流一次讀寫一個字節數組
    public static void method2() throws IOException {
        FileInputStream fis = new FileInputStream("E:\\itcast\\字節 流複製圖片.avi");
        FileOutputStream fos = new FileOutputStream("myByteStream\\字節 流複製圖片.avi");
        byte[] bys = new byte[1024];
        int len;
        while ((len = fis.read(bys)) != -1) {
            fos.write(bys,0,len);
        }
        fos.close();
        fis.close();
    }
    //字節緩衝流一次讀寫一個字節
    public static void method3() throws IOException {
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream("E:\\itcast\\字節 流複製圖片.avi"));
        BufferedOutputStream bos = new BufferedOutputStream( new FileOutputStream("myByteStream\\字節 流複製圖片.avi"));
        int by;
        while ((by = bis.read()) != -1) {
            bos.write(by);
        }
        bis.close();
        bos.close();
    }
    //字節緩衝流一次讀寫一個字節數組
    public static void method4() throws IOException {
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream("E:\\itcast\\字節 流複製圖片.avi"));
        BufferedOutputStream bos = new BufferedOutputStream( new FileOutputStream("myByteStream\\字節 流複製圖片.avi"));
        byte[] bys = new byte[1024];
        int len;
        while ((len = bis.read(bys)) != -1) {
            bos.write(bys,0,len);
        }
        bos.close();
        bis.close();
    }
}

 

 

 

 

一起學習,一起進步 -.- ,如有錯誤,可以發評論

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章