project
準備牌->洗牌->發牌
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.TreeSet;public class PokerGameplus {static HashMap<Integer,String> hs = new HashMap<>();static ArrayList<Integer> list = new ArrayList<>();static {//準備牌//"3","4","5","6","7","8","9","10","J","Q","K","A","2"//"梅花","方片","紅桃","黑桃"String[] color = {"梅花","方片","紅桃","黑桃"};String[] number = {"3","4","5","6","7","8","9","10","J","Q","K","A","2"};//牌盒int seriaNum = 1;for (String n : number) {//依次表示每個數字for (String c : color) {//依次表示每個花色hs.put(seriaNum,c + n);list.add(seriaNum);seriaNum++;}}hs.put(seriaNum,"小王");list.add(seriaNum);seriaNum++;hs.put(seriaNum,"大王");list.add(seriaNum);}PokerGameplus(){//洗牌Collections.shuffle(list);//發牌TreeSet<Integer> lord = new TreeSet<>();TreeSet<Integer> p1 = new TreeSet<>();TreeSet<Integer> p2 = new TreeSet<>();TreeSet<Integer> p3 = new TreeSet<>();for(int i = 0;i<list.size();i++){if (i<=2){lord.add(list.get(i));continue;} else if (i%3==0) {p1.add(list.get(i));} else if (i%3==1) {p2.add(list.get(i));} else if (i%3==2) {p3.add(list.get(i));}}lookpoker("底牌",lord);lookpoker("玩家1",p1);lookpoker("玩家2",p2);lookpoker("玩家3",p3);}public void lookpoker(String name,TreeSet<Integer> ts){System.out.println(name+"的牌是:");for (int seriaNum : ts) {String poker = hs.get(seriaNum);System.out.print(poker + " ");}System.out.println();}
}
public class APP {public static void main(String[] args) {//準備牌->洗牌->發牌->看牌new PokerGameplus();}
}
stream 流的中間方法
stream 流的終結方法
方法引用
this and super 只能用在非靜態方法當中
異常就是程序代碼出現問題
捕獲異常
拋出處理
文件File的概述和構造方法
創建、刪除
createnewfile此方法創建一個新的空的文件夾
創建成功,返回值為true,表示此文件沒有創建過
重點一定是一個文件,如果創建路徑不含后綴名,則創建一個沒有后綴名的文件名
此代碼的格式輸入
File f1 = new File(文件路徑);
boolean b = f1.mkdir();
System.out.println(b);
false表示創建失敗,windows中路徑是唯一的,如果當前路徑已存在,則創建失敗,返回false
mkdir只能創建單極文件夾,而mkdirs可以創建多級文件夾,mkdirs也可以創建單極文件夾
刪除文件、空文件夾
delete方法(不走回收站)輸出格式
//創建刪除對象
File f1 = new File(文件路徑);
//刪除
boolean b = f1.delete();
//打印結果
System.out.println(b);
//返回true or false
細節1:如果刪除的是文件,則直接刪除,不走回收站
如果刪除的是空文件夾,則直接刪除,不走回收站
如果刪除的是有內容的文件夾、則刪除失敗
File中常見成員方法獲取并遍歷
ListFiles輸出格式
//1.創建File對象
File f = new File(文件路徑);
//2.ListFiles方法
//作用:獲取當前文件路徑下的,所有內容,把所有的內容放到數組中返回
File[] files = f.ListFiles();
for(File file : files){
//file代指當前文件路徑下的每一個文件或者文件夾
System.out.println(file);
}
重點細節:
當調用者File表示的路徑不存在時,返回null
當調用者File表示的路徑是文件時,返回null
當調用者File表示的路徑是一個空文件夾時,返回一個長度為0的數組
當調用者File表示的路徑是一個有內容的文件夾時,將里面所有文件和路徑放在File數組中返回
當調用者File表示的路徑是一個有隱藏文件的文件夾時,將里面所有文件和文件夾放在File數組中返回,包含隱藏文件
當調用者File表示的路徑是需要權限才能訪問的文件夾時,返回null
ListRoots()方法 獲取系統中的所有盤符
輸出格式
File[] arr = File.listRoots();
System.out.println(Arrays.to.String(arr));
偶爾會用ListRoots方法
list()方法 獲取當前路徑下的所有內容(僅僅能獲取名字)
list方法輸出格式
File f1 = new File(文件路徑);
String[] arr2 = f1.list();
for(String s : arr2){
System.out.println(s);
}
list(FilenameFilter fliter) 利用文件名過濾器獲取當前路徑下所有內容
accept方法的形參,依次表示aaa文件夾里面每一個文件或者文件夾的路徑
//參數1:父級路徑
//參數2: 子級路徑
//返回值:如果返回值為false,就表示當前路徑舍棄不要
如果返回值為true,就表示當前路徑保留
list(FilenameFilter fliter)輸出格式
File f1 = new File(文件路徑);
File f2 = new File(過濾文件或存留文件的文件路徑);
String[] arr3 = f2. list(new FilenameFilter){
@Overriade
public boolean accept(File dir,String name){
return false; // 過濾此文件,不保留
//return true;//保留此文件,保留下來
}
}
});
System.out.println(Arrays.toString(arr3));
listfiles方法為主要掌握方法,主要作為文件名過濾器的方法
dir表示父級路徑
name表示子級路徑
IO流
IO流表示存儲和讀取數據的解決方案
存檔,保存到文件當中,加載數據
File表示系統中的文件或文件夾的路徑
input讀
IO流的分類
純文本文件用windows記事本可以自動打開的文件
并且能讀的懂的文件
word非純文本文件
字節輸出流FileOutputStream
實現需求:寫一段文字到本地文件當中(暫時不寫中文)
實現步驟:
創建對象
寫出數據
釋放資源
//1.創建對象
//寫出 輸出流 OutputStream
//本地文件 File
FileOutputStream fos = new FileOutputStream(“name指定文件路徑”);
必須要alt+enter實現throw做拋出處理
//2.寫出數據
fos.write(sth);
//3.釋放資源
fos.close();
必須要alt+enter實現throw做拋出處理
字節輸出流對象
細節1:參數是字符串或者是File對象都是可以的
細節2:如果文件不存在會創建一個新的文件,但是要保證父級路徑是存在的
細節3:如果文件存在,則會創建清空文件
寫數據
write方法的參數是整數,但是實際上寫到本地文件中是整數在ASCII上對應的字符
釋放資源
每次使用完成都必須釋放資源
個人理解為PPT or WORD 使用完之后必須關閉釋放棧內存
FileOutputStream寫數據的3種方式
void write(int b) 一次字節數據
void write(byte[] b)一次寫一個字節數組
//創建對象
FileOutputStream fos = new FileOutputStream(本地文件路徑);
//寫出數據
byte[] bytes = {12,37,32,10,80};
fos.write(bytes);
//釋放資源
fos.close();
void
void write(byte[] b, int off,int len)一次寫一個字節數組的部分數據
此方法有三個參數
參數1:數組
參數2:起始索引
參數3:個數
//創建對象
FileOutputStream fos = new FileOutputStream(本地文件路徑);
//寫出數據
byte[] bytes = {12,37,32,10,80};
fos.write(bytes,off:1,len:2);
//寫入的數據為 37 32
換行寫
//創建對象
//創建對象
FileOutputStream fos = new FileOutputStream(本地文件路徑);
//寫出數據
String str = “abc”;
byte[] bytes1= str.getbytes();
fos.write(bytes1);
String wrap = "/r/n";byte[] bytes2 = wrap.getbytes();fos.write(bytes2);String arr = "666";byte[] bytes3 = arr.getbytes();fos.write(bytes3);//釋放資源fos.close();**ctrl+alt+V自動補充前面的開頭代碼/r/n換行寫****續寫**FileOutputStream fos = new FileOutputStream(本地文件路徑,true);//true表示打開續寫開關
//創建對象
FileInputStream fis = new FileInputStream();
//讀取數據
int b1 = fis.read();
System.out.println(b1);
//釋放資源
fis.close();
強轉可以用char
創建輸入流對象:
細節:如果文件不存在,就直接報錯
寫數據:
細節:一次讀一個字節的數據是在ASCII上所對應的數據
如果讀到文件末尾了,read方法返回-1
釋放資源:每次·1使用完流之后必須把資源釋放掉
FileInputStream的循環讀取
字節輸入流中的循環讀取
//創建對象
FileInputStream fis = new FileInputStream();
//循環讀取
int b;
while( (b = fis.read()) != -1){
System.out.println(char(b))//print可以打印成一行,println打印一個換一行
}
//釋放資源
fis.close();
read方法讀取一次移動一次指針
文件拷貝
FileInputStream fis = new FileInputStream();
FileOutputStream fos = new FileOutputStream(本地文件路徑);
int b;
while( (b = fis.read()) != -1){
fos.write(b);
}
//釋放資源
//規則:先開的流后關閉
fos.close();
fis.close();
FileInputStream的讀取問題
FileInputStream一次只能讀取一個字節
弊端:一次只讀了一個字節public int read(byte[] buffer)
一次讀取多個字節
演示代碼
//創建對象
FileInputStream fis = new FileInputStream(文件路徑name:);
//讀取數據
byte[] bytes = new byte[2];
int len = fis.read(bytes);
String str = new String(bytes);
System.out.println(str);
//釋放資源
fis.close();
把數據c用e覆蓋后,打印ed,接下來無法讀出數據,所以打印ed數據
加上0和len,加上覆蓋范圍
多線程&JUC
線程是操作系統能夠進行運算調度的最小單位,它被包含在進程當中
單線程程序,從上往下運行
多線程程序,提高運行效率
并發和并行
并發:在同一時刻,有多個指令在單個CPU上交替執行
并行:在同一時刻,有多個指令在單個CPU上同時執行
并發和并行可能在同時存在
多線程的實現方式
多線程的第一種啟動方式繼承Thread
My Thread
public void run() {
//書寫線程需要的代碼
…
}
public static void main(String[] args){
//多線程的第一種啟動方式
//1.自己定義一個類繼承Thread
//2.重寫run方法
//3.創建子類對象,并啟動線程
MyThread t1 = new MyTread();
t1.start();
}
start()方法才是用來開啟多線程的正確調用
如果加上t2并書名getName就可以實現交替運行
多線程的第二種實現方式
pubic class MyThread2{
public static void main(String[] args){
/*
多線程的第二種實現方式
1.自己定義一個類實現Runable接口
2.重寫里面的run方法
3.創建自己的類的對象
4.創建一個Thread類,并開啟線程
/
//創建Myrun對象
//表示多線程的執行任務
Myrun mr = new Myrun();
//創建線程對象
MyThread2 T1 = new MyThread(mr);
//開啟線程
T1.start();
//給線程設置Name
T1.setName(“線程1”);
}
}
public class Myrun implements Runable{
@override
public void run() {
//書寫線程所需要的代碼
…
}
}
注意Thread.currentThread()表示當前線程
多線程的第三種實現方式
pubic class MyThread3{
public static void main(String[] args){
/
多線程的第三種實現方式
特點:獲取多線程的運行結Callable接口
2.重寫call(是有返回值的,表示多線程運行的結果)
3.創建MyCallable的對象(表示多線程要執行的任務)
4.創建FutureTask的對象(管理多線程的運行結果)
5.創建Thread類的對象,并啟動(表示線程)
**/
MyCallable mc = new MyCallable();
FutureTask ft = new FutureTask(mc);
Thread t1 = new Thread(ft);
t1.start();
Integer result = ft.get();
System.out.println(result);
}}
public class MyCallable implements Callable{
@override
public Integer call() throws Exception{
//開啟線程
多線程所要執行的代碼
return null
}
}
Thread常見的成員方法