Java学习汇总篇

1 篇文章 0 订阅

文章目录

1.结果转换为byte类型

//1.将aa+dd的输出结果转换为byte类型
byte dd = (byte) (aa+dd);

2.三元表达式

//2.三元表达式
int max = (a>=b)?a:b;

3.Scanner控制台输入

//3.Scanner控制台输入
//创建键盘录入对象
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个整数:");
//接收数据
int i = sc.nextInt();
//把数据输出
System.out.println("i:"+i);
 /**
 4.hasNextXXX是返回一个布尔值,是否还有下一个输入项,XXX是可以任意类型的
 nextXXX 获取下一个输入项,可以是任意XXX类型
 String nextLine() 换行符分隔
 String next() 空格,tab,回车等作为分隔符,后面的内容不显示了,只显示前面的内容
 nextInt接受整数,nextLine接受字符串 这两个用的最多
 */
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个整数:");
if(sc.hasNextInt()){ //判断下一个输入的是否是整数
    int num = sc.nextInt();
    System.out.println(num);
}

3.1连着Scanner输入5个学生的姓名,语文成绩,数学成绩,英语成绩

//5.连着输入5个学生的姓名,语文成绩,数学成绩,英语成绩
public void test8(){
for (int i = 0; i < 5; i++) {
	Scanner sc = new Scanner(System.in);
	System.out.println("请输入第" + (i + 1) + "个学生信息:");
	System.out.println("姓名:");
	String name = sc.nextLine();
	System.out.println("语文成绩:");
	int chinese = sc.nextInt();
	System.out.println("数学成绩:");
	int math = sc.nextInt();
	System.out.println("英语成绩:");
	int english = sc.nextInt();
}

4.JDBC数据库操作

4.1JDBC导入驱动包

//jdbc
//1.导入驱动包
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

//1.update account set balance = 500 where id = 1
@Test
public void test() throws Exception {
/**
 * 1.DriverManager:驱动管理对象
 * 2.Connection:数据库连接对象
 * 3.Statement:执行sql对象
 * 4.ResultSet:结果集对象
 * 5.PreparedStatement:执行sql对象
 */
//1.导包
//2.注册驱动(mysql5以后,可以省略这一步)
Class.forName("com.mysql.jdbc.Driver");
//3.获取数据库连接对象
//url:  jdbc:mysql://ip地址:端口号/数据库名称  user:数据库用户名 password:数据库密码
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "12");
//4.定义Sql语句
String sql = "update account set balance = 500 where id = 1";
//5.获取执行Sql对象Statement
Statement stmt = conn.createStatement();
//6.执行sql语句,executeUpdate():执行增删改 executeQuery():执行select语句  execute:可以执行任意Sql语句
int count = stmt.executeUpdate(sql);
//7.处理结果
System.out.println(count);
//8.释放资源
stmt.close();
conn.close();
}
//2.insert into account values(5 ,'刘德华',15000)
@Test
public void test1() throws Exception {
/**
* 1.DriverManager:驱动管理对象
* 2.Connection:数据库连接对象
* 3.Statement:执行sql对象
* 4.ResultSet:结果集对象
* 5.PreparedStatement:执行sql对象
*/
Statement stmt = null;
Connection conn = null;
try {
//1.导包
//2.注册驱动(mysql5以后,可以省略这一步)
Class.forName("com.mysql.jdbc.Driver");
//3.获取数据库连接对象
//url:  jdbc:mysql://ip地址:端口号/数据库名称  user:数据库用户名 password:数据库密码
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "12");
//4.定义Sql语句
String sql = "insert into account values(5 ,'刘德华',15000)";
//5.获取执行Sql对象Statement
stmt = conn.createStatement();
//6.执行sql语句,executeUpdate():执行增删改 executeQuery():执行select语句  execute:可以执行任意Sql语句
int count = stmt.executeUpdate(sql);
//7.处理结果
if (count > 0) {
   System.out.println("成功执行" + count + "行");
} else {
   System.out.println("执行失败");
}
} catch (Exception e) {
e.printStackTrace();
} finally {
//释放资源,避免空指针异常
if (stmt != null) {
   try {
       //8.释放资源
       stmt.close();
   } catch (SQLException e) {
       e.printStackTrace();
   }
}
if (conn != null) {
   try {
       //8.释放资源
       conn.close();
   } catch (SQLException e) {
       e.printStackTrace();
   }
}
}
}
//3.select * from account
@Test
public void test2(){
Statement stmt = null;
Connection conn = null;
ResultSet rs = null;
try {
//1.导包
//2.注册驱动(mysql5以后,可以省略这一步)
Class.forName("com.mysql.jdbc.Driver");
//3.获取数据库连接对象
//url:  jdbc:mysql://ip地址:端口号/数据库名称  user:数据库用户名 password:数据库密码
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "12");
//4.定义Sql语句
String sql = "select * from account";
//5.获取执行Sql对象Statement
stmt = conn.createStatement();
//6.执行sql语句,executeUpdate():执行增删改 executeQuery():执行select语句  execute:可以执行任意Sql语句
 rs = stmt.executeQuery(sql);
//7.处理结果
//7.1让游标向下移动一行
//rs.next();
//7.2获取数据
while(rs.next()) {
    int id = rs.getInt(1); //获取第一列数据
    String name = rs.getString("name"); //获取标签名为name的数据
    double balance = rs.getDouble(3); //获取第三列数据
    System.out.println(id + "--------------" + name + "--------------" + balance);
}
}catch (ClassNotFoundException e){
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally {
//8.释放资源,避免空指针异常
if (rs != null) {
    try {
        //8.释放资源
        rs.close();
    } catch (SQLException e) {
        e.printStackTrace();
    }
}
if (stmt != null) {
    try {
        //8.释放资源
        stmt.close();
    } catch (SQLException e) {
        e.printStackTrace();
    }
}
if (conn != null) {
    try {
        //8.释放资源
        conn.close();
    } catch (SQLException e) {
        e.printStackTrace();
    }
}
}
}

在这里插入图片描述

//1.1 select * from emp,查询一个表的所有数据的方法封装,返回一个list集合
@Test
public List<Emp> findAll(){
Statement stmt = null;
Connection conn = null;
ResultSet rs = null;
List<Emp> list = null; //创建加载数据表字段对象的集合
try {
	//1.导包
	//2.注册驱动(mysql5以后,可以省略这一步)
	Class.forName("com.mysql.jdbc.Driver");
	//3.获取数据库连接对象
	//url:  jdbc:mysql://ip地址:端口号/数据库名称  user:数据库用户名 password:数据库密码
	conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "12");
	//4.定义Sql语句
	String sql = "select * from emp";
	//5.获取执行Sql对象Statement
	stmt = conn.createStatement();
	//6.执行sql语句,executeUpdate():执行增删改 executeQuery():执行select语句  execute:可以执行任意Sql语句
	rs = stmt.executeQuery(sql);
	//7.处理结果
	//7.1获取数据
	Emp emp = null;
	list = new ArrayList<Emp>();
	while(rs.next()) {
	int id = rs.getInt("id");
	String ename = rs.getString("ename");
	int job_id = rs.getInt("job_id");
	int mgr = rs.getInt("mgr");
	Date joindate = rs.getDate("joindate");
	Double salary = rs.getDouble("salary");
	Double bonus = rs.getDouble("bonus");
	int dept_id = rs.getInt("dept_id");
	 emp = new Emp();
	emp.setId(id);
	emp.setEname(ename);
	emp.setJob_id(job_id);
	emp.setMgr(mgr);
	emp.setJoindate(joindate);
	emp.setSalary(salary);
	emp.setBonus(bonus);
	emp.setDept_id(dept_id);
	//装载集合
	list.add(emp);
}
}catch (ClassNotFoundException e){
	e.printStackTrace();
} catch (SQLException e) {
	e.printStackTrace();
} finally {
//8.释放资源,避免空指针异常
if (rs != null) {
try {
    //8.释放资源
    rs.close();
} catch (SQLException e) {
    e.printStackTrace();
}
}
if (stmt != null) {
try {
    //8.释放资源
    stmt.close();
} catch (SQLException e) {
    e.printStackTrace();
}
}
if (conn != null) {
try {
    //8.释放资源
    conn.close();
} catch (SQLException e) {
    e.printStackTrace();
}
}
}
return list;
}


//1.2定义一个Emp类:
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Emp {
    private int id;
    private String ename;
    private int job_id;
    private int mgr;
    private Date joindate;
    private double salary;
    private double bonus;
    private int dept_id;
}


//1.3main方法调用查询方法:
public static void main(String[] args) {
List<Emp> list = new JdbcDemo().findAll();
System.out.println(list);
/**
* 输出结果:[Emp(id=1, ename=李三, job_id=1001, mgr=1001, joindate=2021-04-12, salary=5000.0, bonus=4000.0, dept_id=1001), 
* Emp(id=2, ename=王五, job_id=1002, mgr=1002, joindate=2021-04-04, salary=6000.0, bonus=5000.0, dept_id=1002)]
* 
*/
}

5.if语句结构

//if语句结构
int time = 25;
if(time >=0 && time <=12){
	System.out.println("上午好");
}else if(13<=time && time<=18){
	System.out.println("下午好");
}else if(19<=time && time<=24){
	System.out.println("晚上好");
}else{
	System.out.println("输入错误");
}

6.switch语句结构

//switch语句结构
@Test
public void test(){
doWhat(8);
}
public void doWhat(int day) {
if (day>7 || day<1){
System.out.println("您输入错误,请重新输入");
return;
}
switch (day) {
case 1:
   System.out.println("星期一");
   break;
case 2:
   System.out.println("星期二");
   break;
case 3:
   System.out.println("星期三");
   break;
case 4:
   System.out.println("星期四");
   break;
case 5:
   System.out.println("星期五");
   break;
case 6:
   System.out.println("星期六");
   break;
case 7:
   System.out.println("星期天");
   break;
}

7.星期枚举类

//星期枚举类:
public enum Week {
    星期一,星期二,星期三,星期四,星期五,星期六,星期天
}
public class Student {
//枚举类型week
public Week day;
public void doWhat(Week day){
switch (day) {
case 星期一:
	System.out.println("星期一");
	break;
case 星期二:
	System.out.println("星期二");
	break;
case 星期三:
	System.out.println("星期三");
	break;
case 星期四:
	System.out.println("星期四");
	break;
case 星期五:
	System.out.println("星期五");
	break;
case 星期六:
	System.out.println("星期六");
	break;
case 星期天:
	System.out.println("星期天");
	break;
}
}
@Test
public void test(){
	doWhat(Week.星期一); //输出结果:星期一
}
}

//上面可以写成如下方式:
public class Student {
//枚举类型week
public enum Week {
   星期一,星期二,星期三,星期四,星期五,星期六,星期天
}
public void doWhat(Week day){
switch (day) {
   case 星期一:
       System.out.println("星期一");
       break;
   case 星期二:
       System.out.println("星期二");
       break;
   case 星期三:
       System.out.println("星期三");
       break;
   case 星期四:
       System.out.println("星期四");
       break;
   case 星期五:
       System.out.println("星期五");
       break;
   case 星期六:
       System.out.println("星期六");
       break;
   case 星期天:
       System.out.println("星期天");
       break;
   }
}
@Test
public void test(){
   doWhat(Week.星期一); //输出结果:星期一
}

8.循环

8.1for 循环计算100以内的偶数和

//1.for 循环计算100以内的偶数和
int sum = 0;
for (int i = 1; i <=100 ; i++) {
	if (i%2 ==0){
	sum+=i;
}
System.out.println("sum:"+sum);

8.2while循环计算1+2+…+100的和

//2.while循环计算1+2+....+100的和
int i = 0;
int sum = 0;
while (i <= 100) {
	sum += i;
	i++;
}
System.out.println("sum:" + sum);

8.3do while 循环

//3.do while 循环
int count = 1;
boolean isOK = false;
do{
	System.out.println("正在进行第"+count+"次练习");
if(count>=3){
	isOK=true;
}
	count++;
}while(!isOK);

8.4死循环

//4.死循环
//4.1 for死循环
for(;;){
//循环体
}
//4.2 while死循环
while (true){
//循环体
}

8.5在3个班按班级查找程序员同学为止

/**
5.按班级查找程序员同学,有3个班级,每班10个同学,假如第2个班级的第5
 名同学叫程序员,找到该同学后则停止查找
 */
//1.通过for循环,获取到每一个班级
label_class:for (int i = 1; i < 4; i++) {
//2.在班级循环中,再次通过for循环获取到每个学生的信息
	for (int j = 1; j < 11; j++) {
//3.打印当前学生的信息
		System.out.println("正在查找第"+i+"班的第"+j+"个学生");
//4.判断当前学生是不是程序员
if (i==2 && j==5){
	System.out.println("找到程序员同学了");
//5.如果是程序员,则结束指定循环
	break label_class;
}

9. Random随机类

9.1获取1个随机数

//1.创建Random对象,获取1个随机数
Random r = new Random();
//2.获取(0,10)随机数,包含0,但是不包含10
int i = r.nextInt(10);
System.out.println(i);

9.2获取10个随机数

//2.获取10个随机数
Random r = new Random();
for (int i = 0; i < 10; i++) {
//2.获取随机数
	int m = r.nextInt(10);
	System.out.println(m);
}

9.3每次生成不同的随机数

//3.创建每次生成不同的随机数,不会重复的
 //获取日期对象
Date date1 = new Date();
//获取当前时间的毫秒值
long time = date1.getTime();
//把毫秒值做放入Random里做参数,作为种子,种子每次不同,每次产生的随机数也就不同了
Random random = new Random(time);
//产生0到100的随机数
int i = random.nextInt(100);
System.out.println(i);

10.数组

10.1定义一个长度为3的整型数组

//定义一个长度为3的整型数组
int[] arr = new int[3];

10.2定义值为1,2,3的数组

//定义值为1,2,3的数组
int[] arr1 = {1,2,3};

10.3定义长度为5,值是1,2,3,4,5的数组

//定义长度为5,值是1,2,3,4,5的数组
int[] arr2 = new int[]{1,2,3,4,5};

10.4给数组赋值

/给arr1数组的第二个元素赋值
arr1[1]=4;

10.5遍历数组的所有元素

//遍历arr1数组的所有元素
for (int i = 0; i < arr1.length; i++) {
	System.out.println(arr1[i]);
}

10.6比较两个数组里面的元素是否相同

//比较两个数组里面的元素是否相同
@Test
public void test6(){
int[] arr1 = {11,22,99,63};
int[] arr2 = {11,22,100,63};
boolean result = compare(arr1, arr2);
System.out.println(result);  //输出结果:false
}

//定义一个比较两个数组元素是否相同的函数
public static boolean compare(int[] arr1,int[] arr2){
if(arr1.length!=arr2.length){
    return false;
}
for (int i = 0; i < arr1.length; i++) {
    if(arr1[i]!=arr2[i]){
        return false;
    }
}
return true;
}

11.抽象类

#1.有父类Employee,有成员经理manager和程序员coder
#因为父类中有共同的name,salary,id,work(),但是各不相同,所以方法可以定义为抽象方法
#其中Manager继承Employee, 有bonus和work()
#coder继承Employee,work()

11.1父类Employee

#父类Employee
public abstract class Employee {
	//抽象类的成员变量
	private String name;
	private double salary;
	private String id;

	//无参构造方法
	public Employee() {
	}
	
	//getter和setter
	public String getName() {
	return name;
	}
	
	public void setName(String name) {
	this.name = name;
	}
	
	public double getSalary() {
	return salary;
	}
	
	public void setSalary(double salary) {
	this.salary = salary;
	}
	
	public String getId() {
	return id;
	}
	
	public void setId(String id) {
	this.id = id;
	}
	
	//有参构造方法
	public Employee(String name, double salary, String id) {
	this.name = name;
	this.salary = salary;
	this.id = id;
	}
	
	//成员方法
	public abstract void work();
	}
}

11.2子类Manager类

#子类Managerpublic class Manager extends Employee {
	//成员变量
	private int bonus;
	//getter和setter方法
	public int getBonus() {
	return bonus;
}

public void setBonus(int bonus) {
	this.bonus = bonus;
}
//无参构造器
public Manager() {
}
//有参构造器
public Manager(String name, double salary, String id, int bonus) {
	super(name, salary, id);
	this.bonus = bonus;
}

//重写父类的成员方法
@Override
public void work() {
	System.out.println("经理在工作");
}
}

11.3子类coder类

#子类coder类
public class Coder extends Employee {

	@Override
	public void work() {
	System.out.println("程序员要敲代码");
	}
}

11.4测试运行

#测试运行
public class TestDemo1 {
	public static void main(String[] args) {
		//创建多态程序员对象em
		Employee em = new Coder();
		em.work();
		
		//创建多态经理对象em2
		Employee em2 = new Manager("王五",60000,"研发部02",50000);
		em2.work();
	
		//下面是coder以面对对象的方式
		Coder c = new Coder();
		c.setName("张三");
		c.setSalary(30000);
		c.setId("研发部");
		System.out.println("姓名:"+c.getName());
		System.out.println("薪水:"+c.getSalary());
		System.out.println("部门:"+c.getId());
	
		//Manger对象测试
		Manager m = new Manager("李四",40000,"研发部01",10000);
		System.out.println("姓名:"+m.getName());
		System.out.println("薪水:"+m.getSalary());
		System.out.println("部门:"+m.getId());
		System.out.println("奖金:"+m.getBonus());
	}
}

12.接口

12.1创建接口

//1.创建接口
public interface USB {
   //接口中没有构造方法,写了就报错
    //成员常量
    public static final int NUM = 10;

    //成员方法
    //JDK7及以前的写法
    public abstract void open();
    public abstract void close();

    //JDK8多了两种写法
    public static void method1(){

    }
    public default void method2(){

    }
    //JDK9多了一种写法
    private void method3(){

    }
}
//测试接口
public class TestDemo2 {
    public static void main(String[] args) {
        System.out.println(USB.NUM);
    }
}

13.字符集进行编码,解码

@Test
public void test2() throws UnsupportedEncodingException {
//将字符串进行平台默认的字符集进行编码,UTF-8编码3个字节一个汉字,GBK编码2个字节一个汉字
String s ="中国";
byte[] bys = s.getBytes();                    //使用平台默认的字符集编码
System.out.println(Arrays.toString(bys));                      //输出编码:[-28, -72, -83, -27, -101, -67]
byte[] bys1 = s.getBytes("UTF-8"); //使用UTF-8进行编码
System.out.println(Arrays.toString(bys1));                     //输出编码:[-28, -72, -83, -27, -101, -67]
byte[] bys2 = s.getBytes("GBK");   //使用GBK进行编码
System.out.println(Arrays.toString(bys2));                     //输出编码:[-42, -48, -71, -6]
//下面进行解码,编码和解码方式必须要一致,什么方法编码的就要用什么方式解码
String s1 = new String(bys); //传入平台默认的字符集编码
System.out.println(s1);    //平台默认字符集解码输出:中国
String s2 = new String(bys1,"UTF-8"); //按UTF-8进行解码
System.out.println(s2);  //输出:中国
String s3 = new String(bys2,"GBK");  //按GBK方式解码
System.out.println(s3);  //输出:中国
}

14.创建object类

//创建object类
Object obj = new Object();
Object obj1 = new Object();
//返回对象的哈希码值,每个对象的哈希码值不一样
int i = obj.hashCode();
System.out.println(i);  //输出  381259350

14.1获取调用该对象的字节码文件对象

//获取调用该对象的字节码文件对象,一个类只有一个字节码文件对象
Class<?> Class1 = obj.getClass();
System.out.println(Class1);  //输出 class java.lang.Object

14.2获取对象地址值

//获取对象地址值,是无符号十六进制的
String s = obj.toString();
System.out.println(s);  //输出 java.lang.Object@16b98e56

14.3比较两个对象obj和obj1的地址值是否相等

//比较两个对象obj和obj1的地址值是否相等,一般都需要重写
boolean eq = obj.equals(obj1);
System.out.println(eq); //输出 false

14.4javabean重写Object类,重写euqals(),toString,hashCode()方法

//javabean重写Object类,重写euqals(),toString,hashCode()方法
public class TestDemo4 {
//成员变量
private int id;
private String name;
private int score;

//无参构造方法
public TestDemo4() {
}
//有参构造方法
public TestDemo4(int id, String name, int score) {
	this.id = id;
	this.name = name;
	this.score = score;
}
//getter和setter
public int getId() {
	return id;
}

public void setId(int id) {
	this.id = id;
}

public String getName() {
	return name;
}

public void setName(String name) {
	this.name = name;
}

public int getScore() {
	return score;
}

public void setScore(int score) {
	this.score = score;
}

//重写toString方法
@Override
public String toString() {
	return "TestDemo4{" +
	"id=" + id +
	", name='" + name + '\'' +
	", score=" + score +
	'}';
}
//重写equals()方法和hashcode()方法
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
TestDemo4 testDemo4 = (TestDemo4) o;
	return id == testDemo4.id && score == testDemo4.score && name.equals(testDemo4.name);
}
@Override
public int hashCode() {
	return Objects.hash(id, name, score);
}
}

14.5测试上面的类

//测试上面的类
//测试toString()方法
TestDemo4 s1 = new TestDemo4(1,"欧阳修",66);
System.out.println(s1);  //输出  TestDemo4{id=1, name='欧阳修', score=66}

//测试equals()方法
TestDemo4 s2 = new TestDemo4(1, "欧阳修", 63);
boolean eq = s1.equals(s2);
System.out.println(eq);  //输出 false   
/**
在前面的类方法中可以选择id,name,score其中几项相等就算两个对象相等的选择,我选定是三项
全部相等才算相等
*/

15.String类

15.1字节数组里面的整数转换成字母

//1.将字节数组里面的整数转换成字母
byte[] bys = {97,98,99};
String s = new String(bys);
System.out.println(s);   //输出 abc

15.2将单个字母拼接成单词

//2.将单个字母拼接成单词
char[] cha = {'H','e','l','l','o'};
String s1 = new String(cha);
System.out.println(s1);    //输出 Hello
//3.实际开发中可以String类可以免new
String s2 = "abc";

15.3比较两个字符串是否相等,区分大小写

//4.比较两个字符串是否相等,区分大小写
String s2 = "abc";
String s3 = "ABC";
boolean eq = s2.equals(s3);
System.out.println(eq);  //输出 false

15.4不区分大小写比较两个字符串是否相等

//5.不区分大小写比较两个字符串是否相等
boolean eq1 = s2.equalsIgnoreCase(s3);
System.out.println(eq1);  // 输出 true

15.5判断字符串是不是从字符a开头的

//6.判断字符串是不是从字符a开头的
boolean b = s2.startsWith("a");
System.out.println(b);  //输出 true

15.6判断字符串是不是以字符c结尾的

//7.判断字符串是不是以字符c结尾的
boolean b1 = s2.endsWith("c");
System.out.println(b1);  //输出 true

15.7判断字符串对象s2是不是空字符串

//8.判断字符串对象s2是不是空字符串
boolean em = s2.isEmpty();
System.out.println(em); //输出 false

15.8判断字符串对象s2的长度

//9.判断字符串对象s2的长度
int length = s2.length();
System.out.println(length);  //输出3

15.9获取字符串对象s2索引1位置的字符

//10.获取字符串对象s2索引1位置的字符
char c = s2.charAt(1);
System.out.println(c);  //输出b

15.9获取字符串对象s2字符c所在位子的索引

//11.获取字符串对象s2字符c所在位子的索引
int c1 = s2.indexOf("c");
System.out.println(c1);  //输出 2

15.10获取字符串对象s4字符b最后出现所在位子的索引

//12.获取字符串对象s4字符b最后出现所在位子的索引
String s4 = "abcabc";
int m1 = s4.lastIndexOf("b");
System.out.println(m1);  //输出 4

15.11截取字符串对象s4字符从索引2开始以后的所有字符

//13.截取字符串对象s4字符从索引2开始以后的所有字符
String sub1 = s4.substring(2);
System.out.println(sub1);  //输出cabc

15.12截取字符串对象s4字符从索引2开始4结束,不包含4的所有字符

//14.截取字符串对象s4字符从索引2开始4结束,不包含4的所有字符
String sub2 = s4.substring(2, 4);
System.out.println(sub2); //输出 ca

15.13将字符串对象s2(“abc”)转换成字节数组

//15.将字符串对象s2(“abc”)转换成字节数组
byte[] by = s2.getBytes();
for (int i = 0; i < by.length; i++) {
	System.out.println(by[i]);  //输出 97  98   99  中间是换行符
}

15.14将字符串对象s2(“abc”)转换成字符数组

//16.将字符串对象s2(“abc”)转换成字符数组
char[] chars = s2.toCharArray();
for (int i = 0; i < chars.length; i++) {
	System.out.println(chars[i]);  //输出 a,b,c  中间是换行符
}

15.15将指定类型的数据转换成字符串类型数据

//17.将指定类型的数据转换成字符串类型数据
int a = 123;
String s5 = String.valueOf(a);
System.out.println(s5);  //输出字符串类型的 “123”

15.16将字符串对象s2(“abc”)的字符b替换为d

//18.将字符串对象s2("abc")的字符b替换为d
String re = s2.replace("b", "d");
System.out.println(re);  //输出 adc

15.17将字符串对象s2(“abc”)以空格进行切割,返回切割后的字符串数据,原字符串不受影响

//19.将字符串对象s2("abc")以空格进行切割,返回切割后的字符串数据,原字符串不受影响
String[] m2 = s2.split(" ");
for (int i = 0; i < m2.length; i++) {
	System.out.println(m2[i]);  //输出 abc
}

15.17去除字符串sb对象两边的空格

//20.去除字符串sb对象两边的空格
String sb = "  a b c ";
String tri = sb.trim();
System.out.println(tri);  //输出 a b c

16.容器

16.1创建StringBuilder对象容器

//1.创建StringBuilder对象容器
StringBuilder sb = new StringBuilder();
//往容器里面添加数据
sb.append("abc");
System.out.println(sb); //输出 abc

16.2将String字符串类型cdf转换成了StringBuilder类型

//2.将String字符串类型cdf转换成了StringBuilder类型
StringBuilder m = new StringBuilder("cdf");
System.out.println(m); //输出StringBuilder类型: cdf

16.3字符串拼接功能,将加入进去的字符串变成一句话输出

@Test
public void test7(){
//3.字符串拼接功能,将加入进去的字符串变成一句话输出
StringBuilder sb1 = new StringBuilder();
sb1.append("胡启行,");
sb1.append("爱编程,");
sb1.append("学习了java和python。");
System.out.println(sb1);  //输出 胡启行,爱编程,学习了java和python。
//将输出结果进行反方向输出
StringBuilder sb2 = sb1.reverse();
System.out.println(sb2);  //输出结果:。nohtyp和avaj了习学,程编爱,行启胡
//将sb1的StringBuilder类型转换成字符串String类型
String s2 = sb1.toString();
System.out.println(s2);  //输出String类型结果:。nohtyp和avaj了习学,程编爱,行启胡
//还可以如下写链式编程:
sb1.append(",好好学习").append(",天天向上。");
System.out.println(sb1);  //输出:。nohtyp和avaj了习学,程编爱,行启胡,好好学习,天天向上。
}

17.日期类

17.1创建Date对象

//1.创建Date对象
Date date1 = new Date();
System.out.println(date1); //输出 Fri Mar 26 19:15:09 CST 2021

17.2获取当前系统时间的毫秒值

//2.获取当前系统时间的毫秒值
long time = date1.getTime();
System.out.println(time); // 输出 1616757399810

17.3创建一个指定的时间

//3.创建一个指定的时间
Date date2 = new Date(1616757399810L);
System.out.println(date2); //输出 Fri Mar 26 19:16:39 CST 2021

17.4创建Calendar对象

//4.创建Calendar对象
Calendar ins = Calendar.getInstance();
System.out.println(ins);
/**
* 输出:java.util.GregorianCalendar[time=1616757696866,areFieldsSet=true,areAllFieldsSet=true,lenient=true,
* zone=sun.util.calendar.ZoneInfo[id="Asia/Shanghai",offset=28800000,dstSavings=0,useDaylight=false,
* transitions=31,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2021,MONTH=2,
* WEEK_OF_YEAR=13,WEEK_OF_MONTH=4,DAY_OF_MONTH=26,DAY_OF_YEAR=85,DAY_OF_WEEK=6,DAY_OF_WEEK_IN_MONTH=4,
* AM_PM=1,HOUR=7,HOUR_OF_DAY=19,MINUTE=21,SECOND=36,MILLISECOND=866,ZONE_OFFSET=28800000,DST_OFFSET=0]
*/
//由于在java里面月份是0到11的,所以上面的月份是MONTH=2,表示现在是3月份

17.5获取Calendar对象的年月日时分秒

//5.获取Calendar对象的年月日时分秒
int year = ins.get(Calendar.YEAR);
int month = ins.get(Calendar.MONTH);
int day = ins.get(Calendar.DATE);
int hour = ins.get(Calendar.HOUR);
int minute = ins.get(Calendar.MINUTE);
int second = ins.get(Calendar.SECOND);
System.out.println(year+"年"+(month+1)+"月"+day+"日"+hour+"时"+minute+"分"+second+"秒");
/*输出:2021年3月26日7时32分57秒*/

17.6将时间设置成2022年2月2日

//6.将时间设置成2022年2月2日
ins.set(Calendar.YEAR,2022);
int year1 = ins.get(Calendar.YEAR);
ins.set(Calendar.MINUTE,2);
int month1 = ins.get(Calendar.MONTH);
ins.set(Calendar.DATE,2);
int day1 = ins.get(Calendar.DATE);
System.out.println(year1+"年"+month1+"月"+day1+"日"); // 输出 2022年2月2日

17.6将时间设置成2023年3月1日

//7.将时间设置成2023年3月1日
ins.set(2023, 3, 1);
int year2 = ins.get(Calendar.YEAR);
System.out.println(year2);  //输出 2023

17.7创建 SimpleDateFormat 对象

 /**
-创建 SimpleDateFormat 对象时必须指定转换格式。
-转换格式区分大小写,yyyy 代表年份,MM 代表月份,dd 代表日期,HH 代表 24 进制的小时,hh 代表 12 进制的小时,mm 代表分钟,ss 代表秒。
 创建显示日期格式为:yyyy-MM-dd HH:mm:ss的对象
 */
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try {
   //1、日期转字符串
   //创建Calendar对象
   Calendar calendar = Calendar.getInstance();
   //获取当前系统时间
   Date date = calendar.getTime();
   //将当前系统时间进行按yyyy-MM-dd HH:mm:ss进行格式化输出
   String dateStringParse = sdf.format(date);
   System.out.println(dateStringParse);   //输出当前系统时间:2021-04-03 02:06:16
   //2、字符串转日期
   //字符串格式的日期时间
   String dateString = "2017-12-20 14:02:08";
   //转换成日期格式
   Date dateParse = sdf.parse(dateString);
   System.out.println(dateParse);    // Wed Dec 20 14:02:08 CST 2017
} catch (ParseException e) {
   e.printStackTrace();
}
/**
中文的日期还可以这样的格式输出:yyyy年MM月dd日 HH时mm分ss秒
按yyyy-MM-dd HH:mm:ss格式输出当前系统时间
*/
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String current = sdf.format(System.currentTimeMillis());
System.out.println(current);  //输出当前系统时间: 2021-04-03 02:16:33
Date date = new Date();
DateFormat df1 = DateFormat.getDateInstance();
System.out.println(df1.format(date));  //输出:2021年4月3日
DateFormat df2 = DateFormat.getDateTimeInstance();
System.out.println(df2.format(date)); //输出:2021年4月3日 上午2:29:33
DateFormat df3 = DateFormat.getTimeInstance();
System.out.println("只显示出时分秒:"+df3.format(date)); //输出只显示出时分秒:上午2:29:33
DateFormat df4 = DateFormat.getDateTimeInstance(DateFormat.FULL,DateFormat.FULL); 
System.out.println("显示日期,周,上下午,时间(精确到秒):"+df4.format(date));  //输出显示日期,周,上下午,时间(精确到秒): 2021年4月3日星期六 中国标准时间 上午2:29:33
DateFormat df5 = DateFormat.getDateTimeInstance(DateFormat.LONG,DateFormat.LONG); 
System.out.println("显示日期,上下午,时间(精确到秒):"+df5.format(date));  //输出显示日期,上下午,时间(精确到秒): 2021年4月3日 CST 上午2:29:33
DateFormat df6 = DateFormat.getDateTimeInstance(DateFormat.SHORT,DateFormat.SHORT); 
System.out.println("显示日期,上下午,时间(精确到分):"+df6.format(date));  //输出显示日期,上下午,时间(精确到分): 2021/4/3 上午2:29
DateFormat df7 = DateFormat.getDateTimeInstance(DateFormat.MEDIUM,DateFormat.MEDIUM); 
System.out.println("显示日期,时间(精确到分):"+df7.format(date)); //输出显示日期,时间(精确到分):2021年4月3日 上午2:29:33

17.8计算2021-03-03 11:11:11至今间隔多少天

//计算2021-03-03 11:11:11至今间隔多少天
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateString = "2021-03-03 11:11:11";
Calendar calendar = Calendar.getInstance();
long nowDate = calendar.getTime().getTime(); //Date.getTime() 获得毫秒型日期
try {
	long specialDate = sdf.parse(dateString).getTime();
	long betweenDate = abs((specialDate - nowDate) / (1000 * 60 * 60 * 24)); //计算间隔多少天,则除以毫秒到天的转换公式
	System.out.print(betweenDate);
} catch (ParseException e) {
e.printStackTrace();
}

17.9求出两个日期相差多少小时,分钟,毫秒

//求出两个日期相差多少小时,分钟,毫秒
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date d1 = df.parse("2017-12-20 12:19:19");
Date d2 = df.parse("2017-12-20 11:40:34");
long nd = 1000 * 24 * 60 * 60;
long nh = 1000 * 60 * 60;
long nm = 1000 * 60;
long ns = 1000;
// 获得两个时间的毫秒时间差异
long diff = d1.getTime() - d2.getTime();
// 计算差多少天
long day = diff / nd;
// 计算差多少小时
long hour = diff % nd / nh;
// 计算差多少分钟
long min = diff % nd % nh / nm;
// 计算差多少秒//输出结果
long sec = diff % nd % nh % nm / ns;
System.out.println(day + "天" + hour + "小时" + min + "分钟"+ sec + "秒");  //输出:0天0小时38分钟45秒

18.Math类

//Math类:自然对数的底数是E,是一个常量,圆周率:PI
@Test
public void test4(){
System.out.println(Math.abs(-88)); //输出绝对值:88
System.out.println(Math.ceil(12.34)); //向上输出:13.0
System.out.println(Math.ceil(12.56)); //向上输出:13.0
System.out.println(Math.round(12.34));  //输出:12  四舍五入
System.out.println(Math.round(12.56));  //输出:13
System.out.println(Math.max(23, 77)); //取最大值:77
System.out.println(Math.min(23, 77));  //取最小值:23
System.out.println(Math.pow(2.0, 3.0)); //求出2的3次方=8
System.out.println(Math.random()); //输出0-1之间的随机数:0.7961397464788406
System.out.println(Math.random()*100); //输出0-100之间的随机数:83.77992943321254
}

18.1终止当前的虚拟机运行,计算运行时间用的方法,获取当前系统时间的毫秒值

System.exit(0);//终止当前的虚拟机运行

@Test
public void test5() {
System.out.println(System.currentTimeMillis()); //获取当前系统时间的毫秒值:1618147230411
System.out.println(System.currentTimeMillis() * 1.0 / 1000 / 60 / 60 / 24 / 365 + "年"); //输出当前时间经过了多少年:51.3111166609589年

//常用来计算运行时间用的方法,从这里开始计时
long start = System.currentTimeMillis();
for (int i = 0; i < 100000; i++) {
   System.out.println(i);
}
//从这里结束计时
long end = System.currentTimeMillis();
System.out.println("程序一共运行了:"+(end-start)+"毫秒"); //输出:程序一共运行了:1945毫秒
}

19.类型转换

/**
#由于基本的int,char,byte等基本数据类型不是对象,不可以通过.的方式调用方法,所以才有了包装类
包装类有:
             基本类型    包装类
         *   byte       Byte
         *   short      Short
         *   int        Integer
         *   long       Long
         *   char       Character
         *   float      Float
         *   double     Double
         *   boolean    Boolean 
*/

19.1Integer类型转成int类型

/1.Integer类型转成int类型
//1.装箱  包装类i2
Integer i2 = 30;
//拆箱
int c = i2;

19.2将字符串类型的“10”转成成int类型的10

//2.将字符串类型的“10”转成成int类型的10
String s = "10";
int i = Integer.parseInt(s);  
/**
XXX.parseXXX(a), 是将a转换成XXX类型,Character没有这个方法,其他类型都有,如:Float.parseFloat()
*/

19.3存取包装类

@Test
public void test(){
//集合中只能存取包装类,不能存取基本数据类型
//包装类型转成基本类型:XXXValue()方法
Integer i = 10;
int iNum = i.intValue();
System.out.println(iNum); //输出int类型:10
//基本数据类型转换成字符串类型
String s = 100 + ""; //将int 100转成了字符串
String s2 = true + ""; //将boolean类型转成了字符串
//基本数据类型转成字符串
int num = 100;
String snum = Integer.toString(num); //将int 100转成了字符串
//基本类型转成包装类
int j = 90;
Integer j1 = Integer.valueOf(j); //将int类型转换成Interger类型
}

19.4多个字符串转换成list集合

//1.多个字符串转换成list集合,这个集合大小是固定的,所以不可以添加或删除元素改变集合大小,但可以改变已经有的元素
@Test
public void test2(){
    List<String> list = Arrays.asList("java","ni","hao");
    System.out.println(list);  //输出:[java, ni, hao]
}
//2.产生不可变的list集合,这个list不可以做增加删除更改操作
@Test
public void test2(){
   List<String> list = List.of("java","ni","hao");
   System.out.println(list);  //输出:[java, ni, hao]
}
//3.不可变不重复集合,重复元素就会报错
@Test
public void test2(){
	Set<String> set = Set.of("java","ni","hao");
	System.out.println(set);  //输出:[hao, java, ni]
}

20.集合

public class Student {
	public String name;
	public int age;

public Student() {
}

public Student(String name, int age) {
	  this.name = name;
	  this.age = age;
}

@Override
public String toString() {
	  return "Student{" +
       	"name='" + name + '\'' +
        ", age=" + age +
	          		'}';
	}
}

20.1创建list集合

public class TestDemo4  {
public static void main(String[] args) {
	  //1.创建list集合对象
	  List list1 = new ArrayList();
	  //2.创建Student对象
	  Student stu1 = new Student("乔峰",41);
	  Student stu2 = new Student("乔峰",41);
	  Student stu3 = new Student("段誉",46);
	  Student stu4 = new Student("虚竹",35);
	  //3.将对象添加到集合中
	  list1.add(stu1);
	  list1.add(stu2);
	  list1.add(stu3);
	  list1.add(stu4);
	  System.out.println(list1);  
  /**
  输出结果  [Student{name='乔峰', age=41}, Student{name='乔峰', age=41}, Student{name='段誉', age=46}, Student{name='虚竹', age=35}]
  */

20.2输出索引为2的元素对象

//4.输出索引为2的元素对象
Object m = list1.get(2);
System.out.println(m);  //输出 Student{name='段誉', age=46}

20.3普通的for遍历list集合

//5.普通的for遍历list集合
for (int i = 0; i < list1.size(); i++) {
	Object m1 = list1.get(i);
	System.out.println(m1);
/**
* 输出结果:
* Student{name='乔峰', age=41}
* Student{name='乔峰', age=41}
* Student{name='段誉', age=46}
* Student{name='虚竹', age=35}
*/
}

20.4增强for遍历list集合

//6.增强for遍历list集合,快捷键 iter
for (Object m1 : list1) {
	System.out.println(m1);
}
/**
* 输出结果:
* Student{name='乔峰', age=41}
* Student{name='乔峰', age=41}
* Student{name='段誉', age=46}
* Student{name='虚竹', age=35}
*/

20.5迭代器是遍历Collections集合的通用方式

//7.迭代器是遍历Collections集合的通用方式,不但可以遍历还可以同时进行增加或删除操作,对于list集合遍历的同时也可以增加删除操作,独有的
//创建迭代器对象
Iterator it = list1.iterator();
while (it.hasNext()){ //如果迭代器中有元素,就一直迭代
	Object s = it.next();  //获取元素
	//String s = (String)it.next(); 有需要的要强制转换成字符串格式,在这里不能转换,会报错
	System.out.println(s);
}
/** 输出结果:
* Student{name='乔峰', age=41}
* Student{name='乔峰', age=41}
* Student{name='段誉', age=46}
* Student{name='虚竹', age=35}
*/

20.6迭代器遍历的同时增加元素

//7.1迭代器遍历的同时增加元素java
List list = new ArrayList();
	list.add("a");
	list.add("b");
	list.add("c");
	Iterator lit = list.iterator();
while (lit.hasNext()) { //如果迭代器中有元素,就一直迭代
	String s = (String) lit.next(); //有需要的要强制转换成字符串格式
if ("b".equals(s)) {
	lit.add("b");
}
	System.out.println(s);  //输出  a,b,java,c
}
}
}

20.7创建了只能存储String类型数据的List集合

//8.创建了只能存储String类型数据的List集合,不可以进行数据类型转换,起到了数据保护的作用
//泛型一般只和集合结合使用
List<String> lit = new ArrayList<>();

20.8Collections工具类是专门用来对集合进行操作用

20.8.1添加元素
//9.Collections工具类是专门用来对集合进行操作用的
//创建了只能存储String类型数据的List集合,不可以进行数据类型转换,起到了数据保护的作用
List<Integer> lit = new ArrayList<>();
lit.add(1);
lit.add(2);
lit.add(3);
lit.add(4);
lit.add(5);
lit.add(6);
lit.add(7);
System.out.println(lit);  //输出  [1, 2, 3, 4, 5, 6, 7]
20.8.2集合最大值,最小值
Integer max = Collections.max(lit);
System.out.println(max);  //输出 7
Integer min = Collections.min(lit);
System.out.println(min);   //输出 1
20.8.3集合排序
//list集合进行升序排列
Collections.sort(lit);
System.out.println(lit);  //输出 [1, 2, 3, 4, 5, 6, 7]
//对集合进行逆序排列
Collections.reverse(lit);
System.out.println(lit);  //输出 [7, 6, 5, 4, 3, 2, 1]
//对集合进行随机排序
Collections.shuffle(lit);
System.out.println(lit);  //输出 [3, 7, 1, 5, 4, 6, 2]

20.9Set集合

//10.Set集合 无序,不能重复
//1.创建set集合对象,这里面的参数需要放入的是Student类里的对象
Set<Student> set = new HashSet<>();
//2.创建Student对象(这个对象里面有重复的乔峰),对于set集合不能有重复的对象
//所以在Student类中,需要重写equals()和hashcode()方法进行去重操作
Student stu1 = new Student("乔峰",41);
Student stu2 = new Student("乔峰",41);
Student stu3 = new Student("段誉",46);
Student stu4 = new Student("虚竹",35);
20.9.1Set集合添加元素对象
//3.set集合添加元素对象
set.add(stu1);
set.add(stu2);
set.add(stu3);
set.add(stu4);
System.out.println(set);
/**
* 输出:  在Student类中,没有重写的时候,重复的元素在里面
* [Student{name='虚竹', age=35}, Student{name='乔峰', age=41}, Student{name='乔峰', age=41},
* Student{name='段誉', age=46}]
* 输出:  在Student类中,重写equals()和hashcode()方法后:
* [Student{name='虚竹', age=35}, Student{name='段誉', age=46}, Student{name='乔峰', age=41}]
*/

20.10Map集合

//11.Map集合:有key和value,key不可以重复,value可以重复
//1.创建Map对象,对象是Student类,值是Integer类型
Map<Integer,Student> map = new HashMap<>();
//2.创建Student对象
Student stu1 = new Student("乔峰",41);
Student stu2 = new Student("杨过",41);
Student stu3 = new Student("段誉",46);
Student stu4 = new Student("虚竹",35);
20.10.1Map集合加入元素
//3.Map集合加入元素对象
map.put(1,stu1);
map.put(2,stu2);
map.put(3,stu3);
map.put(4, stu4);
20.10.2Map集合根据Key获取键值
//4.根据Key获取键值
Student ss = map.get(2);
System.out.println(ss);   //输出 Student{name='杨过', age=41}
  
20.10.3迭代器遍历Map集合
/5.迭代器遍历Map集合
//1.获取所有键key的List集合
Set<Integer> keys = map.keySet();
//2.创建key的list集合迭代器对象
Iterator<Integer> it = keys.iterator();
while (it.hasNext()) { //如果迭代器中有元素,就一直迭代
	Integer key = it.next();  //获取元素,key的数据类型Integer要和Map的键数据类型一致
	//String key = (String)it.next(); 有需要的要强制转换成字符串格式,在这里不能转换,会报错
	Student values = map.get(key);
	System.out.println("Key" + key + "......vaules:" + values);
/**
* 输出:
* Key1......vaules:Student{name='乔峰', age=41}
* Key2......vaules:Student{name='杨过', age=41}
* Key3......vaules:Student{name='段誉', age=46}
* Key4......vaules:Student{name='虚竹', age=35}
*/
}
20.10.4通过增强for遍历Map集合
//通过增强for遍历Map集合
//1.获取所有键key的List集合
Set<Integer> keyss = map.keySet();
for (Object m1 : keyss) {
	Student values = map.get(m1);
	System.out.println(values);
}
/**
* 输出:
* Student{name='乔峰', age=41}
* Student{name='杨过', age=41}
* Student{name='段誉', age=46}
* Student{name='虚竹', age=35}
*/

20.11案例:模拟斗地主

//综合案例:模拟斗地主
int num = 0; //定义牌的编号
//1.定义一个双列集合 key:Integer 对应的值是牌
Map<Integer,String> pokers = new HashMap<>();
//2.定义一个List存放所有的牌的编号,牌编号是Integer类型
List<Integer> list =new ArrayList<>();
//3.用数组合成一副牌
String[] colours = {"红桃","黑桃","梅花","方片"};
String[] numbers = {"2","3","4","5","6","7","8","9","10","J","Q","K","A"};
//将花色和牌数字一起组合形成牌
for (String colour : colours) { //获取所有的花色
	for (String number : numbers) {  //获取所有的点数
		String poker = colour + number;  //花色和点数组合成牌
		//将牌的编号和具体的牌放到双列集合Map集合中
		pokers.put(num,poker);
		//将牌的编号放到单列集合List集合中
		list.add(num);
		num++;
	}
}
	//Map集合中添加大王
	pokers.put(num, "大王");
	//List集合增加大王的序号
	list.add(num++);
	pokers.put(num, "小王");
	list.add(num++);

  //打印所有的牌
  System.out.println(pokers);
  /**
   * 输出:
   * {0=红桃2, 1=红桃3, 2=红桃4, 3=红桃5, 4=红桃6, 5=红桃7, 6=红桃8, 7=红桃9, 8=红桃10, 9=红桃J, 10=红桃Q,
   * 11=红桃K, 12=红桃A, 13=黑桃2, 14=黑桃3, 15=黑桃4, 16=黑桃5, 17=黑桃6, 18=黑桃7, 19=黑桃8, 20=黑桃9, 
   * 21=黑桃10, 22=黑桃J, 23=黑桃Q, 24=黑桃K, 25=黑桃A, 26=梅花2, 27=梅花3, 28=梅花4, 29=梅花5, 30=梅花6,
   * 31=梅花7, 32=梅花8, 33=梅花9, 34=梅花10, 35=梅花J, 36=梅花Q, 37=梅花K, 38=梅花A, 39=方片2, 40=方片3, 
   * 41=方片4, 42=方片5, 43=方片6, 44=方片7, 45=方片8, 46=方片9, 47=方片10, 48=方片J, 49=方片Q, 50=方片K, 
   * 51=方片A, 52=大王, 53=小王}
   */

//洗牌,把存放牌编号的list进行随机打乱
Collections.shuffle(list);

//发牌,三个人,定义4个集合,三个集合存放人获得牌,第四个集合存放底牌
List<Integer> liuyifei = new ArrayList<>();
List<Integer> zhaoliying = new ArrayList<>();
List<Integer> xiaohei = new ArrayList<>();
List<Integer> dipai = new ArrayList<>();
//将索引除3取模决定发牌给谁
for (int i = 0; i < list.size(); i++) {
	//获取牌的编号
	Integer pokerNum = list.get(i);
	if (i >= list.size() - 3) {
	//底牌
	dipai.add(pokerNum);
} else if (i % 3 == 0) {
	liuyifei.add(pokerNum);
} else if (i % 3 == 1) {
	zhaoliying.add(pokerNum);
} else if (i % 3 == 2) {
	xiaohei.add(pokerNum);
}
}
//查看玩家和底牌 这里获取的是每个人牌的编号
System.out.println("刘亦菲:"+liuyifei);
System.out.println("赵丽引:"+zhaoliying);
System.out.println("小黑:"+xiaohei);
System.out.println("底牌:"+dipai);
/**
   * 输出: 
   * 刘亦菲:[51, 46, 6, 52, 28, 2, 53, 25, 23, 18, 49, 48, 43, 15, 21, 27, 20]
   * 赵丽引:[4, 26, 41, 11, 10, 45, 36, 30, 34, 40, 50, 42, 16, 47, 31, 33, 0]
   * 小黑:[1, 8, 17, 39, 12, 22, 5, 29, 35, 7, 37, 3, 14, 38, 44, 24, 19]
   * 底牌:[32, 9, 13]
   */
//获取每个人的具体的牌,另外创建了一个现实具体牌的类sendpoker类,里面有静态方法printpoker方法
//调用静态的方法可以是  sendpokerTest.printpoker() 也可以是下面的调用方法不用写类名,
//可以在这上面的函数继承sendpokerTest即可:extends sendPokerTest 
	String str1 = printPoker(liuyifei, pokers);
	System.out.println("刘亦菲:"+str1);
	String str2 = printPoker(zhaoliying, pokers);
	System.out.println("赵丽引:"+str2);
	String str3 = printPoker(xiaohei, pokers);
	System.out.println("小黑:"+str3);
	String str4 = printPoker(dipai, pokers);
	System.out.println("底牌:"+str4);

/**
* 输出:
* 刘亦菲:红桃2 红桃9 黑桃2 黑桃5 黑桃6 黑桃7 黑桃8 黑桃10 梅花4 梅花6 梅花A 方片2 方片3 方片6 方片7 方片9 方片10
* 赵丽引:红桃3 红桃5 红桃10 红桃J 红桃K 黑桃4 黑桃9 黑桃J 黑桃Q 梅花5 梅花9 梅花J 梅花K 方片5 方片Q 方片K 大王
* 小黑:红桃4 红桃6 红桃7 红桃8 红桃Q 红桃A 黑桃A 梅花2 梅花3 梅花8 梅花10 梅花Q 方片4 方片8 方片J 方片A 小王
* 底牌:黑桃3 黑桃K 梅花7
*/

//看牌,根据牌的编号获取牌,这个需要另外定义一个类来完成操作:
public class sendPokerTest {
	public static String printPoker(List<Integer> nums, Map<Integer,String> pokers){  //传入一个List放牌			的编号,一个Map放牌的集合
//1.对牌的编号就行升级排序
Collections.sort(nums);
//2.遍历牌的集合获取每一个牌的编号
//创建StringBuilder容器存放牌
StringBuilder sb = new StringBuilder();
for (Integer num : nums) {
	//根据编号去Map集合中去获取编号对应的具体的牌
	String poker = pokers.get(num);
	//将获取到的牌用空格进行拼接
	sb.append(poker+" ");
}
//3.将最后拼到的结果进行返回
String str = sb.toString();
//去除字符串两边的空格
return str.trim();
	}
}

20.12Hashset哈希表

/**1. Hashset底层数据结构是哈希表,存入的数据和取出的数据元素位置不一致
* 没有索引,不可以通过for遍历,不包含重复元素
*/
//创建集合对象
HashSet<String> hs = new HashSet<String>();
//添加元素
hs.add("hello");
hs.add("world");
hs.add("java");
//遍历
for (String h : hs) {
	System.out.println(h);  //输出:world java hello
}

//2.创建一个Student类,里面有private name和age属性,getter,setter方法,tostring()方法
//创建集合对象
HashSet<Student> hs = new HashSet<Student>();
Student stu= new Student("林青霞","30");
Student stu1 = new Student("张曼玉","26");
Student stu2 = new Student("王祖贤","63");
//添加元素
hs.add(stu);
hs.add(stu1);
hs.add(stu2);
//遍历
for (Student h : hs) {
    System.out.println(h.getName()+" "+h.getAge()); //输出:林青霞 30 张曼玉 26 王祖贤 63
}

20.13linkedHashSet集合

/** linkedHashSet集合具有可预测的迭代次序
* 存储和取出顺序是一致的,由哈希表保证元素的唯一性,没有重复元素
*/
//创建集合对象
LinkedHashSet<String> hs = new LinkedHashSet<String>();
//添加元素
hs.add("java");
hs.add("world");
hs.add("hello");
//遍历
for (String h : hs) {
	System.out.println(h);  //输出:java world hello
}

20.14TreeSet集合

/** 1.TreeSet():根据元素的自然排序进行排序
* TreeSet(Comparator comparator):根据指定的比较器进行排序
* 不能使用普通的for遍历,没有索引,不包含重复元素
*/
//创建集合对象
TreeSet<Integer> hs = new TreeSet<Integer>();
//添加元素
hs.add(10);
hs.add(40);
hs.add(30);
hs.add(90);
hs.add(70);
//遍历
for (Integer h : hs) {
	System.out.println(h);  //输出:10 30 40 70 90   按自然排序就是从小到大排序
}



/** 1.TreeSet():根据元素的自然排序进行排序
* TreeSet(Comparator comparator):根据指定的比较器进行排序
* 不能使用普通的for遍历,没有索引,不包含重复元素
*/
//创建集合对象
TreeSet<Student> hs = new TreeSet<Student>();
Student stu = new Student("西施","23");
Student stu1 = new Student("大桥","56");
Student stu2 = new Student("小乔","12");
Student stu3 = new Student("王昭君","78");
Student stu4 = new Student("貂蝉","26");
//添加元素
hs.add(stu);
hs.add(stu1);
hs.add(stu2);
hs.add(stu3);
hs.add(stu4);
//遍历
for (Student h : hs) {
	System.out.println(h.getName()+","+h.getAge());  
	//输出:当下面的Student类的return值设置为0的时候,输出结果:西施,23    (0输出第一个元素)
	/**输出:当下面的Student类的return值设置为1的时候,输出结果:         (1输出按顺序输出)          
						西施,23
						大桥,56
						小乔,12
						王昭君,78
						貂蝉,26
	*/
/**输出:当下面的Student类的return值设置为-1的时候,输出结果:			(-1输出按倒序输出)
						貂蝉,26
						王昭君,78
						小乔,12
						大桥,56
						西施,23
							*/
/**输出:当下面的Student类的return值设置为i的时候,
输出结果:return this.age-s.age 按年龄从小到大排列	,如果return s.age-this.age,那就是年龄从大到小排列了	
						小乔,12
						西施,23
						貂蝉,26
						大桥,56
						王昭君,78
							*/					
}

/**2.创建一个Student类,里面有private name和age属性,getter,setter方法,tostring()方法,
并且这个类 继承:
public class Student implements Comparable<Student>{
//2.1最后有一个重写方法:
 @Override
    public int compareTo(Student S) {
        return 0;  //这个return值可以设置为0或1或-1,对应的上面的输出结果不同
    }

//2.2重写方法还可以如下写:(因为的age是private String类型,所以要做一个转换)
@Override
public int compareTo(Student s) {
int i = Integer.parseInt(this.age)-Integer.parseInt(s.age);
return i;
} 
//2.2当age定义的是int类型的时候写法如下:
@Override
public int compareTo(Student s) {
int i = this.age - s.age;
return i;
} 
//年龄从小到大排列,年龄相同的时候,名字按拼音排列
public int compareTo(Student s) {
		//按照年龄的顺序排列从小到大
	int i = Integer.parseInt(this.age) - Integer.parseInt(s.age);
	//年龄相同的话,按照名字字母顺序排列
	int i1 = i == 0 ? this.name.compareTo(s.name) : i;
	return i1;
}

20.15Collection集合

@Test
public void Test() {
//创建Collection集合
Collection col = new ArrayList();
//集合中添加元素
col.add("java");
col.add("hello");
col.add("world");
//迭代器遍历集合
Iterator it = col.iterator();
while (it.hasNext()) { //如果迭代器中有元素,就一直迭代
	String next = (String)it.next();
	System.out.println(next);    //输出:java hello world
}

20.16Properties集合

//Properties集合
@Test
public void test2(){
//创建Properties集合对象(和map集合很类似)
Properties pro = new Properties();
//添加对象
pro.put("0001", "李刚");
pro.put("0002", "王五");
//遍历集合
Set<Object> keyss = pro.keySet();
for (Object key : keyss) {
	   Object values = pro.get(key);
	   System.out.println(key+","+values);
}
/**
* 输出结果:
* 0002,王五
* 0001,李刚
*/
}

@Test
public void test2() throws IOException {
//1.创建Properties集合对象(和map集合很类似)
Properties pro = new Properties();
//2.添加对象可以使用特有的方法setProperty
pro.setProperty("0001", "李刚");
pro.setProperty("0002", "王五");
//3.获取结果
System.out.println(pro.getProperty("0001"));  			//输出:李刚
System.out.println(pro.getProperty("00012")); 			 //对于不存在的key值:输出:null
System.out.println(pro); 						 				//输出:{0002=王五, 0001=李刚}
//4.只获取key值,返回一个不可修改的键集
Set<String> names = pro.stringPropertyNames();
for (String key : names) {
	System.out.println(key); 						//输出结果:0002   0001
	//获取所有键值
	String value = pro.getProperty(key);
	System.out.println(key+","+value);    //输出结果: 0002,王五    0001,李刚
	}
//5.把集合中的数据保存到文件1.txt,创建对象
FileWriter fw = new FileWriter("D:\\project\\src\\test\\java\\com\\qy\\spring5\\testdemo\\1.txt");
//写入保存文件
pro.store(fw, null);
//关闭资源
fw.close();
/**
* 1.txt里面的内容结果:
* #Sun Apr 11 20:35:53 CST 2021
* 0002=王五
* 0001=李刚
*
*/
}

20.17ArrayList集合

//ArrayList集合
@Test
public void test8(){
/**
*ArrayList<E>:
* 是可调整大小的数组实现
* <E>:是一种特殊的数据类型,表示泛型
*/
//创建ArrayList对象
ArrayList<String> array = new ArrayList<>();
//添加元素
array.add("hello");
array.add("java");
System.out.println("array:"+array); //输出:array:[hello, java]
array.add(1,"胡启行");
System.out.println("array:"+array); //输出:array:[hello, 胡启行, java]
//删除hello元素
array.remove("hello");
System.out.println("array:"+array);   //输出:array:[胡启行, java]
//删除索引为1的元素
array.remove(1);
System.out.println("array:"+array);   //输出:array:[胡启行]
//更改元素
array.set(0, "胡启航");
System.out.println(array);   //输出:[胡启航]
//获取指定处索引元素值
System.out.println(array.get(0)); //输出:胡启航
//获取集合中元素个数
System.out.println(array.size()); //输出:1
//遍历集合
for (int i = 0; i < array.size(); i++) {
     System.out.println(array.get(i));  //输出:胡启航
 }
}

21.try catch

//1.选中要执行的代码片段,try catch快捷键是 Ctrl+alt+t
try {
	//尝试要执行的代码
	int a = 10 /0 ;
} catch (Exception e) {
	//出现问题后的解决方案
	System.out.println("被除数不能为0");
} finally {
	//不管如何要执行的代码
	System.out.println("看看我执行了么");
}
/**
* 输出:
* 被除数不能为0
* 看看我执行了么
*/

22.IO流

22.1创建IO流对象

//2.IO流能在本地磁盘和网络上操作数据
//将D:/abc/1.txt这个文件封装成File对象
//方式一
File file1 = new File("D:/abc/1.txt");
//方式二
File file2 = new File("D:/abc/","1.txt");
//方式三
File file3 = new File("D:/abc/");
File file4 = new File(file3,"1.txt");

22.2创建1.txt文件

//3.创建1.txt文件
String wenJian = "D:/1.txt";
File file5 = new File(wenJian);
boolean newFile = file5.createNewFile();
if (newFile) {
System.out.println("创建:" + wenJian + "成功");
}else {
System.out.println("创建失败");
}

22.3创建单级文件夹

//4.创建单级文件夹a
File file6 = new File("D:/a");
boolean newFile1 = file6.mkdir();  //只能创建单级目录

22.4创建多级文件夹

//5.创建多级文件夹
File file7 = new File("D:/a/b/c");
file7.mkdirs();
boolean fi = file7.isFile();  //是否是文件  false
boolean ex = file7.exists();  //是否存在  true
boolean dir = file7.isDirectory();  //是否是目录  true

22.5获取绝对路劲

//6.获取绝对路劲
File file = new File("lib/2.txt");
File absoluteFile = file.getAbsoluteFile(); //获取 lib/2.txt的绝对路径
System.out.println(absoluteFile); 
//输出:C:\Users\Administrator\IdeaProjects\maven01\src\test\lib\2.txt

22.6获取相对路劲

//6.获取相对路劲
String path = file.getPath();  //获取相对路劲
System.out.println(path);  //输出 lib\2.txt

22.6获取文件名

//7.获取文件名
String name = file.getName(); //获取文件名
System.out.println(name);   //输出 2.txt

22.7获取所有文件夹名称

//8.这个lib文件夹Directory必须是在项目文件夹下面建立的文件夹根目录下,才能找到
//我创建的lib 里面有 abc文件夹,里面有1.txt, /a/b文件夹里面有2.txt
File file2 = new File("lib");
String[] names = file2.list(); //获取lib文件夹里面的所有文件夹名称,String[]数组类型
for (String name : names) {
System.out.println(name); //输出 a ,abc
}

22.8获取所有文件夹和文件的名称

File[] file3 = file2.listFiles(); //获取lib文件夹里面的所有文件夹和文件的名称,File[]数组类型,如果lib根目录下有文件,也会显示出来
for (File fi : file3) {
	System.out.println(fi);  //输出  lib\a,lib\abc
}

22.9文件复制拷贝

//一.将D:\\itcast目录文件夹里面的所有文件复制拷贝一份到Java项目文件下的myCharStream\\itcast目录中(注意D:\\itcast目录里面没有文件夹,只有文件才可以,单级文件夹):
public static void main(String[] args) throws IOException {
//1.创建数据源目录File对象,D:\\itcast文件夹
File srcFolder = new File("D:\\itcast");
//2.获取文件名itcast
String srcFolderName = srcFolder.getName();
//3.创建目的地目录File对象,路劲是:myCharStream\\itcast
File destFolder = new File("myCharStream",srcFolderName);
//4.判断目的地的目录File对象是否存在,如果不存在就创建
if(!destFolder.exists()){
	destFolder.mkdirs();
}
//5.获取数据源目录下所有文件的File数组
File[] listfiles = srcFolder.listFiles();
//6.遍历,得到每一个File对象爱,该File对象就是数据源文件
for (File srcFile : listfiles) {
	//获取对象名称
	String srcFileName = srcFile.getName();
	//创建目的地文件File对象
	File destFile = new File(destFolder, srcFileName);
	//复制文件
	TestDemo2.copyFile(srcFile,destFile);
}
}
//批量复制目录文件的方法
private static void copyFile(File srcFile,File destFile) throws IOException {
	BufferedInputStream bis = new BufferedInputStream(new FileInputStream(srcFile));
	BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(destFile));
	byte[] bys = new byte[1024];
	int len;
	while ((len = bis.read(bys)) != -1) {
	bos.write(bys,0,len);
}
	bis.close();
	bos.close();
}

22.10所有目录和文件(包括多级目录),复制

//二.将D:\\itcast文件夹里面所有目录和文件(包括多级目录),复制到D:\\a文件夹中
public static void main(String[] args) throws IOException {
//1.创建数据源目录File对象,D:\\itcast文件夹
File srcFile = new File("D:\\itcast");
//2.创建目的地File对象,路劲是F:\\
File destFile = new File(("D:\\a"));
//3.复制文件
TestDemo2.copyFolder(srcFile,destFile);
}
private static void copyFolder(File srcFile,File destFile) throws IOException {
//判断数据源File是不是目录
if(srcFile.isDirectory()) {
		//在目的地下创建和数据源File名称一样的目录
		String srcFileName = srcFile.getName();
		File newFolder = new File(destFile, srcFileName);
		if (!newFolder.exists())
		newFolder.mkdirs();
		//获取数据源File下所有文件或者目录的File数组
		File[] fileArray = srcFile.listFiles();
		//遍历该File数组,得到每一个File对象
		for (File file : fileArray) {
		//把该File作为数据源File对象,递归调用复制文件夹的方法
		copyFolder(file, newFolder);
		}
} else{
	//说明是文件,直接复制,用字节流
	File newFile = new File(destFile, srcFile.getName());
	copyFile(srcFile,newFile);
}
}

private static void copyFile(File srcFile,File destFile) throws IOException {
	BufferedInputStream bis = new BufferedInputStream(new FileInputStream(srcFile));
	BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(destFile));
	byte[] bys = new byte[1024];
	int len;
	while ((len = bis.read(bys)) != -1) {
	bos.write(bys, 0, len);
}
	bis.close();
	bos.close();
}

22.11遍历目录并将所有文件的绝对路劲输出到控制台,多层级文件夹里面的文件路径也可以输出

//三.遍历目录并将所有文件的绝对路劲输出到控制台,多层级文件夹里面的文件路径也可以输出
@Test
public void test3(){
//给定的路劲创建一个File对象
File srcFile = new File("D:\\itcast");
//调用方法,获取所有文件路劲
getAllFilepath(srcFile);
}
public static void getAllFilepath(File srcFile){
//获取给定的File目录下所有的文件或目录的File数组
File[] fileArry = srcFile.listFiles();
//遍历该数组,得到每一个File对象
if(fileArry != null){
	for (File file : fileArry) {
		//判断该对象是不是目录
		if(file.isDirectory()){
			//是的话递归调用
			getAllFilepath(file);
		}else {
			//不是的话,获取绝对路径输出在控制台上
			System.out.println(file.getAbsolutePath());
		}
	}
}
}

22.12读取一个字符

//9.IO流
//字符流是针对纯文本内容的
//读取一个字符   1.txt的内容是  abc
//9.1创建字符输入流对象
FileReader reader = new FileReader("lib/1.txt");
//读取数据
int read = reader.read();
System.out.println(read); //输出  97
//释放资源
reader.close();

22.13连续读取所有字符

//9.2 连续读取所有字符
//创建字符输入流对象
FileReader reader = new FileReader("lib/1.txt");
int ch;
while ((ch=reader.read())!=-1){
	System.out.println(ch);  // 输出 97 98 99
}
//释放资源
reader.close();
//9.3连续读取所有字符,创建字符输入流对象
FileReader reader = new FileReader("lib/1.txt");
//定义一个字符数组
char[] chs = new char[100];  //这个100表示每一行显示的最多字符个数是100
//记录读到的有效字符数
int len;
while ((len=reader.read(chs))!=-1){
	String s = new String(chs, 0, len);  
	//要操作的数组:chs 起始索引:0,要操作的字符个数:len 将读到的内容转换成字符串
	System.out.println(s);  //输出1.txt的所有文本内容: abc
}
//释放资源
reader.close();

22.14创建字符输出流对象,一次写一个字

//10.创建字符输出流对象
FileWriter writer = new FileWriter("lib/1.txt");
writer.write("好人呀");   // 一次写一个字,一共写了3个字: 好人呀
//关闭资源
writer.close();

22.15创建字符输出流对象,一次写入一个指定的字符数组

//10.1创建字符输出流对象
FileWriter writer = new FileWriter("lib/1.txt");
//一次写入一个指定的字符数组
char[] chs = {'黑','马','程','序','员'};
writer.write(chs);  //覆盖以前的内容写入:黑马程序员
writer.write(chs,0,2);  //覆盖以前的内容写入指定长度的字符,从0开始写入2个字符:黑马
//关闭资源
writer.close();

22.16文件复制1.txt的内容写符到2.txt文件里面(字节流拷贝)

//10.3文件复制1.txt的内容写符到2.txt文件里面(字节流拷贝)
FileReader fr= new FileReader("lib/1.txt");
FileWriter fw = new FileWriter("lib/2.txt");
int len;
while ((len=fr.read())!=-1){
	fw.write(len);
}
//关闭资源
fr.close();
fw.close();

22.17文件复制1.txt的内容写符到2.txt文件里面,按字符数组拷贝

//10.4文件复制1.txt的内容写符到2.txt文件里面,按字符数组拷贝
FileReader fr= new FileReader("lib/1.txt");
FileWriter fw = new FileWriter("lib/2.txt");
char[] chs =new char[1024];         
int len;
while ((len=fr.read(chs))!=-1){
	fw.write(chs,0,len);
}
//关闭资源
fr.close();
fw.close();

22.18字符缓冲流,文件复制1.txt的内容写符到2.txt文件里面

//11.字符缓冲流,文件复制1.txt的内容写符到2.txt文件里面
FileReader fr = new FileReader("lib/1.txt");
BufferedReader br = new BufferedReader(fr);
FileWriter fw = new FileWriter("lib/2.txt");
BufferedWriter bw = new BufferedWriter(fw);
//可以缩写如下:
BufferedReader br = new BufferedReader(new FileReader("lib/1.txt"));
BufferedWriter bw = new BufferedWriter(new FileWriter("lib/2.txt"));
int len;
while ((len = br.read()) != -1) {
	bw.write(len);
}
//释放资源
br.close();
bw.close();

22.19字符缓冲流,文件复制1.txt的内容写符到2.txt文件里面,一行一行读取

//12.字符缓冲流,文件复制1.txt的内容写符到2.txt文件里面,一行一行读取
FileReader fr = new FileReader("lib/1.txt");
BufferedReader br = new BufferedReader(fr);
FileWriter fw = new FileWriter("lib/2.txt");
BufferedWriter bw = new BufferedWriter(fw);
//可以缩写如下:
BufferedReader br = new BufferedReader(new FileReader("lib/1.txt"));
BufferedWriter bw = new BufferedWriter(new FileWriter("lib/2.txt"));
String str;
while ((str = br.readLine()) != null) {
	bw.write(str);
	bw.write("\r\n");  //windows情况下用这个
	//bw.newLine();          //Linux系统情况下用这个
}
//释放资源
br.close();
bw.close();

22.20字节流是针对图片等其他文件类型的

//13.以下是字节流是针对图片等其他文件类型的
//字节缓冲流,图片1.jpg复制一张2.jpg
//创建字节输入流
FileInputStream fis = new FileInputStream("lib/1.jpg");
//创建字节输出流
FileOutputStream fos = new FileOutputStream("lib/2.jpg");
int len;
while ((len = fis.read()) != -1) {
	fos.write(len);
}
//释放资源
fis.close();
fos.close();
//以下是字节流是针对图片等其他文件类型的FileInputStream,FileOutputStream
//字节缓冲流,图片1.jpg复制一张2.jpg,按字节数组读取
FileInputStream fis = new FileInputStream("lib/1.jpg");
FileOutputStream fos = new FileOutputStream("lib/2.jpg");
byte[] bys = new byte[1024];
int len;
while ((len = fis.read(bys)) != -1) {
	fos.write(bys,0,len);
}
//释放资源
fis.close();
fos.close();
//字节缓冲流拷贝文件BufferedInputStream,BufferedOutputStream
FileInputStream fis = new FileInputStream("lib/1.jpg");
BufferedInputStream bis = new BufferedInputStream(fis);
FileOutputStream fos = new FileOutputStream("lib/2.jpg");
BufferedOutputStream bos = new BufferedOutputStream(fos);
/**
以后可以用下面的简写方式
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("lib/1.jpg"));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("lib/2.jpg"));
*/
int len;
while ((len = bis.read()) != -1) {
	bos.write(len);
}
bis.close();
bos.close();

22.21 编码方式IO流

//编码方式IO流
@Test
    public void test3(){
    //以GBK编码方式往文件1.txt写入字符串
    OutputStreamWriter fos = new OutputStreamWriter(new FileOutputStream("D:\\project\\src\\test\\java\\com\\qy\\spring5\\testdemo\\1.txt"),"GBK");
    fos.write("中国");
     //释放资源
    fos.close();
    
//以GBK编码方式读取1.txt文件的编码内容
InputStreamReader fis = new InputStreamReader(new FileInputStream("D:\\project\\src\\test\\java\\com\\qy\\spring5\\testdemo\\1.txt"), "GBK");
int ch;
while ((ch=fis.read())!=-1){
   	System.out.println((char)ch);  // 输出:中  国
}
//释放资源
fis.close();
    }

22.22 将ArrayList集合里面的内容IO流写入文件

//1.将ArrayList集合里面的内容IO流写入文件
@Test
public void test3() throws IOException {
//1.创建Arrylist集合对象
ArrayList<String> arry = new ArrayList<String>();
//2.将字符串添加到集合中
arry.add("java");
arry.add("ni");
arry.add("hao");
//创建字符输出流对象
BufferedWriter bw = new BufferedWriter(new FileWriter("D:\\project\\src\\test\\java\\com\\qy\\spring5\\testdemo\\1.txt"));
//3.遍历集合
for (String s : arry) {
	//4.将集合写入文件
	bw.write(s);
	//5.换行
	bw.newLine();
	//6.刷新
	bw.flush();
}
//释放资源
bw.close();
}

//2.将ArrayList集合里面的内容按特定格式IO流写入文件
@DATA
public class Student {
	private String id;
	private String name;
	private String age;
	private String di;
}

@Test
public void test6() throws IOException {
/**
* 输出结果格式如下:
* 0001,刘德华,56,香港
* 0002,古天乐,48,澳门
* 0003,刘亦菲,36,新疆
* 0004,ligang,56,香港
*/
//1.创建Arrylist集合对象
ArrayList<Student> arry = new ArrayList<Student>();
Student stu1 = new Student("0001","刘德华","56","香港");
Student stu2 = new Student("0002","古天乐","48","澳门");
Student stu3 = new Student("0003","刘亦菲","36","新疆");
Student stu4 = new Student("0004","ligang","56","香港");
//2.将字符串添加到集合中
arry.add(stu1);
arry.add(stu2);
arry.add(stu3);
arry.add(stu4);
BufferedWriter bw = new BufferedWriter(new FileWriter("D:\\project\\src\\test\\java\\com\\qy\\spring5\\testdemo\\1.txt"));
//3.字符串拼接功能,将加入进去的字符串按要求输出
for (Student s : arry) {
	StringBuilder sb = new StringBuilder();
sb.append(s.getId()+",").append(s.getName()+",").append(s.getAge()+",").append(s.getDi());
	bw.write(sb.toString() ); //将sb1的StringBuilder类型转换成字符串String类型
	bw.newLine(); //下一行
	bw.flush(); //刷新
}
//关闭资源
bw.close();
}


//3.将文件中的内容IO流写入集合
@Test
public void test5() throws IOException {
//创建字节缓冲输入流对象
BufferedReader br = new BufferedReader(new FileReader("D:\\project\\src\\test\\java\\com\\qy\\spring5\\testdemo\\1.txt"));
//创建集合对象
ArrayList<String> arry = new ArrayList<>();
//读取数据,写入集合
String str;
while ((str = br.readLine()) != null) {
arry.add(str);
}
//释放资源
br.close();
//遍历集合
for (String s : arry) {
System.out.println(s);  //输出:java ni  hao
}
}
//1.定义一个Student类
@Data
public class Student {
	private String name;
	private int chinese;
	private int math;
	private int english;
	public int getSum() {
	return this.chinese+this.math+this.english;
	}
}

//2.根据输入的5个学生信息,根据总分从高到低排序,然后根据语文,数学,姓名排序
/**
* 输出结果:
* 胡启行,100,100,100=300
* 光绪,96,84,88=268
* 戚继光,89,96,69=254
* 乾隆,77,86,86=249
* 李刚,55,66,100=221
*/
public static void main(String[] args) throws IOException {
//1.创建TreeSet集合,通过比较器进行排序
TreeSet<Student> ts = new TreeSet<Student>(new Comparator<Student>() {
	@Override
	public int compare(Student s1, Student s2) {
	 //主要条件成绩总分从高到低
	 int num = s2.getSum() - s1.getSum();
	 //次要条件,根据语文成绩,数学成绩,姓名排序
	 int num2 = num == 0 ? s1.getChinese() - s2.getChinese() : num;
	 int num3 = num2 == 0 ? s1.getMath() - s2.getMath() : num2;
	 int num4 = num3 == 0 ? s1.getName().compareTo(s2.getName()): num3;
	 return num4;
}
});
//2.输入5个学生的信息
for (int i = 0; i < 5; i++) {
	Scanner sc = new Scanner(System.in);
	System.out.println("请输入第" + (i + 1) + "个学生信息:");
	System.out.println("姓名:");
	String name = sc.nextLine();
	System.out.println("语文成绩:");
	int chinese = sc.nextInt();
	System.out.println("数学成绩:");
	int math = sc.nextInt();
	System.out.println("英语成绩:");
	int english = sc.nextInt();
	//3.创建Student类对象
	Student stu = new Student();
	//4.将键盘录入的值设置成学生信息值
	stu.setName(name);
	stu.setChinese(chinese);
	stu.setEnglish(english);
	stu.setMath(math);
	//5.将Student对象信息添加到TreeSet集合里面
	ts.add(stu);
}
//6.创建字符输出流对象
BufferedWriter bw = new BufferedWriter(new FileWriter("D:\\project\\src\\test\\java\\com\\qy\\spring5\\testdemo\\1.txt"));
//7.遍历集合
for (Student s : ts) {
	StringBuilder sb = new StringBuilder();
	sb.append(s.getName() + ",").append(s.getMath() + ",").append(s.getEnglish() + ",").append(s.getChinese()+ "=").append(s.getMath()+s.getEnglish()+s.getChinese());
		bw.write(sb.toString()); //将sb1的StringBuilder类型转换成字符串String类型
		bw.newLine(); //下一行
		bw.flush(); //刷新
}
//8.关闭资源
bw.close();
}

22.23 字节打印流:往文件里my.txt里面写入

//1.字节打印流:往文件里my.txt里面写入
@Test
public void test9() throws FileNotFoundException {
//使用打印流,打印流只管写入数据不读取数据,创建打印流对象
PrintStream ps = new PrintStream("D:\\project\\src\\test\\resources\\my.txt");
//写入数据97
ps.write(97);  //my.txt文件里写入了一个字符:a
//换行
ps.println();
ps.print(97);  //my.txt文件里写入了一个字符:97    中间如果不换行的话就输出:a97
/**
ps.println(97);
ps.println(98);
可以输出和上面同样的效果
*/
//关闭资源
ps.close();
}

//2.字符打印流:往文件里my.txt里面写入
@Test
public void test9() throws FileNotFoundException {
//使用字符打印流,打印流只管写入数据不读取数据,创建打印流对象
PrintWriter pw = new PrintWriter("D:\\project\\src\\test\\resources\\my.txt");
//写入数据
pw.write("中国");
//更新
pw.flush();
pw.write("\r\n");  //换行   最后输出结果  中国      你好
pw.write("你好");
//更新
pw.flush();
/**
这个可以达到上面同样的效果,换行输出   你好 中国
pw.println("你好");
pw.flush();
pw.println("中国");
pw.flush();
*/
//关闭资源
pw.close();
}

//常用的写入方法,下面不用写更新语句了,设置为true后,会自动更新
@Test
public void test9() throws IOException {
//使用字符打印流,打印流只管写入数据不读取数据,创建打印流对象
PrintWriter pw = new PrintWriter(new FileWriter("D:\\project\\src\\test\\resources\\my.txt"),true);
pw.println("你好");
pw.println("中国");
pw.println("haha");
//关闭资源
pw.close();
}

//复制TestDemo2.java文件内容到my.java文件内容
@Test
public void test9() throws IOException {
//根据数据源创建字符输入流对象
BufferedReader br = new BufferedReader(new FileReader("D:\\project\\src\\test\\java\\com\\qy\\spring5\\testdemo\\TestDemo2.java"));
//根据目的地创建字符输出流对象
PrintWriter pw = new PrintWriter(new FileWriter("D:\\project\\src\\test\\resources\\my.java"),true);
String str;
while ((str = br.readLine()) != null) {
	pw.println(str);
}
//释放资源
br.close();
pw.close();
}

23.反射

23.1获取Class对象

//获取Class对象
//方式一:
Student stu = new Student();
Class<? extends Student> clazz1 = stu.getClass();
System.out.println(clazz1);   //输出  class Student

//方式二:
Class<Student> clazz2 = Student.class;
System.out.println(clazz2);   //输出  class Student

//方式三:
Class<?> clazz3 = Class.forName("cn.itcast.demo1.Student");
System.out.println(clazz3); //输出  class Student

23.2Student类

//Student类:
public class Student {
	//成员变量
	public String name;
	private int age;
//公共的无参构造方法
	public Student() {
}
//公共的带参构造方法
public Student(String name) {
	System.out.println("您录入的name值:"+name);
}
//私有的带参构造方法
public Student(int age) {
	System.out.println("您录入的age值是:"+age);
}
//公共的空参方法
public void show1() {
	System.out.println("我是公共的空参方法");
}

//公共的带参构造方法
public void show2(int a) {
	System.out.println("我是公共的带参方法,您传入的 a值是:" + a);
}

//私有的带参构造方法
private int show3(int a, int b) {
System.out.println("我是私有的带参方法");
	return a + b;
}
}

23.3反射类

//反射类
import java.lang.reflect.Constructor;
public class reflection {
public static void main(String[] args) throws Exception {
//1.获取Class对象
Class clazz = Class.forName("cn.itcast.demo2.Student");
//根据上面获取的字节码文件对象,获取指定的构造器对象

//2.获取公共的无参构造
Constructor con1= clazz.getConstructor();
System.out.println(con1);  //输出  public cn.itcast.demo2.Student()

//3.获取公共的有参构造getConstructor
Constructor con2 = clazz.getConstructor(String.class);
System.out.println(con2);  //输出 public cn.itcast.demo2.Student(java.lang.String)

//4.获取私有的有参构造,getDeclaredConstructor
Constructor con3 = clazz.getDeclaredConstructor(int.class);
System.out.println(con3);  //输出 public cn.itcast.demo2.Student(int)

//5.获取Student类所有的公共的构造函数getConstructors
Constructor[] cons = clazz.getConstructors();
for (Constructor con : cons) {
System.out.println(con);
}
/**
*
* 输出:
* public cn.itcast.demo2.Student()
* public cn.itcast.demo2.Student(java.lang.String)
*/

//6.获取构造器的名字,看他是哪个类的构造
String name = con2.getName();
System.out.println(name);   //输出 cn.itcast.demo2.Student
//7.根据构造器对象和参数,创建对应的Student对象
Student stu = (Student)con2.newInstance("张三");  //将object类强制转换成Student类
System.out.println(stu);
/**
* 输出:
* 您录入的name值:张三
* cn.itcast.demo2.Student@2f4d3709
*/

23.4获取空参方法,构造器对象和参数

//获取空参方法show1
//1.获取Class对象
Class clazz = Class.forName("cn.itcast.demo2.Student");
//2.获取公共的无参构造
Constructor con1= clazz.getConstructor();
//3.根据构造器对象和参数,创建对应的Student对象
Student stu1 = (Student)con1.newInstance();
System.out.println(stu1);  //输出 cn.itcast.demo2.Student@7ef20235
//4.调用公共的空参方法
Method method1 = clazz.getMethod("show1");
//5.打印方法对象
System.out.println(method1);  //输出 public void cn.itcast.demo2.Student.show1()
//5.1打印方法名
System.out.println(method1.getName());  //输出  show1
//5.2调用此方法
method1.invoke(stu1);   //输出   我是公共的空参方法

23.5获取带参方法

//获取带参方法show2
//1.获取Class对象
Class clazz = Class.forName("cn.itcast.demo2.Student");
//2.获取公共的无参构造
Constructor con1= clazz.getConstructor();
//3.根据构造器对象和参数,创建对应的Student对象
Student stu1 = (Student)con1.newInstance();
System.out.println(stu1);  //输出 cn.itcast.demo2.Student@7ef20235
//4.调用公共的有参方法
Method method1 = clazz.getMethod("show2",int.class);
//5.打印方法对象
System.out.println(method1);  //输出 public void cn.itcast.demo2.Student.show2(int)
//5.1打印方法名
System.out.println(method1.getName());  //输出  show2
//5.2调用此方法
method1.invoke(stu1,100);   //输出   我是公共的带参方法,您传入的 a值是:100

23.6获取私有的带参的方法

//获取私有的带参的方法show3
//获取带参方法show3
//1.获取Class对象
Class clazz = Class.forName("cn.itcast.demo2.Student");
//2.获取私有的有参构造
Constructor con1= clazz.getDeclaredConstructor();
//3.根据构造器对象和参数,创建对应的Student对象
Student stu1 = (Student)con1.newInstance();
System.out.println(stu1);  //输出 cn.itcast.demo2.Student@7ef20235
//4.调用私有的有参方法
Method method3 =clazz.getDeclaredMethod("show3",int.class,int.class);
//4.1开启暴力反射,不管是不是私有的都拿过来
method3.setAccessible(true);
//5.打印方法对象
System.out.println(method3);  //输出 private int cn.itcast.demo2.Student.show3(int,int)
//5.1打印方法名
System.out.println(method3.getName());  //输出  show3
//5.2调用此方法
int sum = (int) method3.invoke(stu1, 100, 200);//输出   我是私有的带参方法
System.out.println("您录入的两个数和是:"+sum);  //输出 您录入的两个数和是:300
}
}

23.7反射方式获取Student类getter,setter成员方法

//反射方式获取Student类getter,setter成员方法
	public class Student {
	//成员变量
	private String name;

//空参构造
public Student() {
}

//带参构造
public Student(String name) {

	this.name = name;
}

//getter和setter
public String getName() {
	return name;
}

public void setName(String name) {
	this.name = name;
}

//toString方法,用来打印对象的各属性值
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
'}';
}
}

23.8反射获取

//反射获取
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
//1.获取Class对象
Class clazz = Class.forName("cn.itcast.demo2.Student");
//2.获取公共的无参构造
Constructor con1= clazz.getConstructor();
//3.根据构造器对象和参数,创建对应的Student对象
Student stu1 = (Student)con1.newInstance();
//4.获取指定的setName()方法,给Student对象设置值
Method method1 = clazz.getMethod("setName", String.class);
//4.1调用此方法
method1.invoke(stu1,"张无忌");
//5.打印学生对象
System.out.println(stu1);  //输出 Student{name='张无忌'}

23.8反射获取成员变量

//反射方式获取成员变量
public class Student {
//公有属性
public String name;
//私有属性
private int age;

//toString方法,用来打印对象的各属性值
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
public class reflection {
public static void main(String[] args) throws Exception {
//1.获取Class对象
Class clazz = Class.forName("cn.itcast.demo2.Student");
//2.获取公共的无参构造
Constructor con1= clazz.getConstructor();
//3.根据构造器对象和参数,创建对应的Student对象
Student stu1 = (Student)con1.newInstance();
//4.设置学生对象的各个属性值
//4.1设置姓名
Field field1 = clazz.getField("name");
field1.set(stu1, "张无忌");
//4.2设置私有年龄
Field field2 = clazz.getDeclaredField("age");
//需要开启暴力反射
field2.setAccessible(true);
field2.set(stu1, 36);
//5.打印学生对象
System.out.println(stu1);  //输出 Student{name='张无忌', age=36}
}
}

24.创建泛型类,泛型接口

//1.创建泛型类Generic
public class Generic<T> {
private T t;
public T getT() {
   return t;
}
public void setT(T t) {
   this.t = t;
}

@Test
public void Test() {
//创建保存String类型数据的实例对象
Generic<String> str = new Generic<>();
str.setT("李刚");
System.out.println(str.getT()); //输出:李刚
//创建保存Integer类型数据的实例对象
Generic<Integer> in = new Generic<>();
in.setT(20);
System.out.println(in.getT());  //输出:20
}

//2.泛型类
public class Show<T> {
//创建泛型参数的方法
public void showname(T t){
	System.out.println(t);
}
}

@Test
public void test(){
//存入String对象
Show<String> str = new Show<String>();
str.showname("林青霞");  //输出:林青霞
//存入object对象爱
Show<Object> obj = new Show<Object>();
obj.showname("zhangsan");  //输出:zhangsan
}
//3.创建泛型接口
public interface Genetic<T> {
    void show(T t);
}


//创建泛型实现类继承泛型接口
public class GeniticImpl<T> implements Genetic<T>{
@Override
public void show(T t) {
	System.out.println(t);
}
}


@Test
public void test(){
//创建泛型实现类的对象
GeniticImpl<String> str = new GeniticImpl<String>();
str.show("林青霞");  //输出:林青霞
}

25.类型通配符

//类型通配符<?>
List<?> list1 = new ArrayList<Object>();
List<?> list2 = new ArrayList<String>();
//类型通配符上限上限是Number类型
List<? extends  Number> list3 = new ArrayList<Number>();
List<? extends  Number> list4 = new ArrayList<Integer>();
//类型通配符下限是Number类型
List<? super   Number> list5 = new ArrayList<Object>();
List<? super   Number> list6 = new ArrayList<Number>();

26.创建参数可变函数

public class NiHao {
//创建参数可变函数
public static int sum(int b,int...a){
int sum = 0;
//可变参数是一个素组,所以可以遍历获取数值
for (int i : a) {
    sum+=i;
}
//返回所有参数的和,可变参数必须要放在不变参数的后面才不会报错
return sum+b;
}
}

@Test
public void test1(){
int sum1 = NiHao.sum(5, 20, 30);
System.out.println(sum1);  //输出:55
int sum2 = NiHao.sum(5, 20, 30, 40, 50);
System.out.println(sum2); //输出:145

27.序列化和反序列化

//这个被transient修饰的属性不可以被序列化:private transient int age;
@Data
@NoArgsConstructor
@AllArgsConstructor
//只有继承Serializable接口,对象才可以被序列化,且不需要重写任何方法
public class Student implements Serializable {
    //必须要加上这一句序列化就不会出错
    private static final  long serialVersionUID = 42L;
    private String name;
    private int age;
}

@Test
public void test1() throws IOException, ClassNotFoundException {
//1.下面执行对象序列化结果是一个读不懂的文件
//创建一个写入指定的outputstream的ObjectOutputStream对象
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("D:\\project\\src\\test\\java\\com\\qy\\spring5\\testdemo\\1.txt"));
//创建Student对象
Student stu = new Student("林青霞",30);
//将指定的对象写入ObjectOutputStream
oos.writeObject(stu);
//释放资源
oos.close();

//2.下面执行对象反序列化来读取这个读不懂的文件
ObjectInputStream ois= new ObjectInputStream(new FileInputStream("D:\\project\\src\\test\\java\\com\\qy\\spring5\\testdemo\\1.txt"));
//读取反序列化对象
Object obj = ois.readObject();
//转换成Student对象
Student st = (Student) obj;
//获取属性
System.out.println(st.getName()+","+st.getAge());       //输出结果:林青霞,30

28网络通信

28.1获取计算机名,IP地址

//获取计算机名为sc-202103112315的IP的IP地址,创建对象可以是下面两种方式中的任意一种
//InetAddress address = InetAddress.getByName("sc-202103112315");
InetAddress address = InetAddress.getByName("192.168.232.1");
System.out.println(address);   //输出  /192.168.232.1
String hostName = address.getHostName();
System.out.println(hostName);  //输出主机名 sc-202103112315
String hostAddress = address.getHostAddress();
System.out.println(hostAddress);  //输出IP地址 192.168.232.1
//如果java运行过程中提示:java Address already in use: bind 表明端口已经被占用,需要重新跟换端口测试,即可
/**
端口设置在1024到65535之间即可,
UDP协议:音频,视频,普通数据传输,不需要连接
TCP协议:3次握手,可靠连接以后才传输数据
*/

28.1UDP通信

UDP发送端:
//UDP协议传输,创建发送端的socket对象
DatagramSocket ds = new DatagramSocket();
//要发的数据包内容
byte[] bys = "你好,中国,我来了哦".getBytes();
//创建网络对象
InetAddress address = InetAddress.getByName("SC-202103112315");
//定义应用程序的端口
int port = 10086;
//创建发送数据包
DatagramPacket dp = new DatagramPacket(bys, bys.length, address, port);
//调用发送端socket发送数据
ds.send(dp);
//关闭发送端
ds.close();

/**
可以简写如下:
//UDP协议传输,创建发送端的socket对象
DatagramSocket ds = new DatagramSocket();
//要发的数据包内容
byte[] bys = "你好,中国,我来了哦".getBytes();
//创建发送数据包
DatagramPacket dp = new DatagramPacket(bys, bys.length, InetAddress.getByName("SC-202103112315"), 10086);
//调用发送端socket发送数据
ds.send(dp);
//关闭发送端
ds.close();
*/



UDP接收端:
//UDP协议传输,创建接收端的socket对象
DatagramSocket ds = new DatagramSocket(10086);
//定义接收数据的空字符数组
byte[] bys = new byte[1024];
//创建接收数据包
DatagramPacket dp = new DatagramPacket(bys, bys.length);
//接收数据
ds.receive(dp);
//将数据装入字符数组
byte[] datas = dp.getData();
//转成字符串
String s = new String(datas);
System.out.println("接收的数据是:" + s);
//关闭接收端
ds.close();

/**
接收端可以简写如下
//UDP协议传输,创建接收端的socket对象
DatagramSocket ds = new DatagramSocket(10086);
//定义接收数据的空字符数组
byte[] bys = new byte[1024];
//创建接收数据包
DatagramPacket dp = new DatagramPacket(bys, bys.length);
//接收数据
ds.receive(dp);
//输出数据
System.out.println("接收的数据是:" + new String(dp.getData()));
//关闭接收端
ds.close();
*/
/**
UDP实现发送端:键盘录入,发送886退出
UDP接收端:一直接收
*/
//UDP发送端:
public class send1 {
    public static void main(String[] args) throws IOException {
        while (true) {
            //创建键盘录入对象
            Scanner sc = new Scanner(System.in);
            System.out.println("请输入数据:");
            //接收数据
            String s = sc.nextLine();
            if (s.equals("886")){
                System.exit(0);
            }else {
                send(s);
            }
        }
    }
    public static void send(String s) throws IOException {
        //UDP协议传输,创建发送端的socket对象
        DatagramSocket ds = new DatagramSocket();
        //要发的数据包内容
        byte[] bys = s.getBytes();
        //创建网络对象
        InetAddress address = InetAddress.getByName("SC-202103112315");
        //定义应用程序的端口
        int port = 10086;
        //创建发送数据包
        DatagramPacket dp = new DatagramPacket(bys, bys.length, address, port);
        //调用发送端socket发送数据
        ds.send(dp);
        //关闭发送端
        ds.close();
    }
}

//UDP接收端:
public class re1 {
    public static void main(String[] args) throws IOException {

            //UDP协议传输,创建接收端的socket对象
            DatagramSocket ds = new DatagramSocket(10086);
            while (true) {
                //定义接收数据的空字符数组
                byte[] bys = new byte[1024];
                //创建接收数据包
                DatagramPacket dp = new DatagramPacket(bys, bys.length);
                //接收数据
                ds.receive(dp);
                //将数据装入字符数组
                byte[] datas = dp.getData();
                //转成字符串
                String s = new String(datas);
                System.out.println("接收的数据是:" + s);
            }
    }
}

28.2TCP协议通信

//TCP协议发送端:
public class Send2 {
    public static void main(String[] args) throws IOException {
        //创建客户端的Socket对象
        Socket s = new Socket("192.168.232.1", 10086);
        //获取输出流
        OutputStream os = s.getOutputStream();
        //写数据
        os.write("中国中国我爱你".getBytes());
        //接收服务器的反馈
        InputStream is = s.getInputStream();
        byte[] bys = new byte[1024];
        int len = is.read(bys);
        String data = new String(bys, 0, len);
        System.out.println("客户端"+data);
        //释放资源
        s.close();
    }
}

//TCP协议接收端:
public class re2 {
    public static void main(String[] args) throws IOException {
        //创建服务器的ServerSocket对象
        ServerSocket ss = new ServerSocket(10086);
        //侦听要连接到此套接字并接收它
        Socket s = ss.accept();
        //获取收入流
        InputStream is = s.getInputStream();
        byte[] bys = new byte[1024];
        //读取数据
        int len = is.read(bys);
        //数据转成字符串
        String data = new String(bys, 0, len);
        System.out.println("服务器:"+data);
        //给出反馈
        OutputStream os = s.getOutputStream();
        os.write("数据已经收到了".getBytes());
        //关闭资源
        s.close();
        ss.close();
    }
}
/**
数据来自键盘输入,客户端输入“886”就断开连接,服务器端接收数据,并把接收到的数据写入到2.txt文件中
*/
//TCP协议服务器端部分
 //创建服务器的ServerSocket对象
        ServerSocket ss = new ServerSocket(10086);
        //监听客户端的连接,返回一个对应的socket对象
        Socket s = ss.accept();
        //获取输入流对象,接收数据
       BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
        //把数据写入文本文件
    BufferedWriter bw = new BufferedWriter(new FileWriter("Test\\2.txt"));  //Test是模块名
        String line;
        while ((line = br.readLine()) != null) {
            System.out.println(line);  //打印接收到的内容
            bw.write(line);            //写入文件到2.txt
            bw.newLine();             //换行
            bw.flush();               //刷新
        }
        //释放资源
        ss.close();
        bw.close();

//TCP协议客户端部分
//创建客户端的Socket对象,TCP发送都是客户端向服务器端先发送数据,连接时,先开启服务器,然后开启客户端,不然连接不上会报错
        Socket s = new Socket("192.168.232.1", 10086);
        //1.下面两种客户端发送数据的方式选择一种
        //1.1接收来自及键盘输入的数据
        BufferedReader bis = new BufferedReader(new InputStreamReader(System.in));
        //1.2如果客户端数据不是来自键盘输入而是来自文本文件2.txt内容如下:
         BufferedReader bis = new BufferedReader(new FileReader("Test\\2.txt"));
        //封装数据输出流对象
    BufferedWriter bos = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
        String line;
        while ((line = bis.readLine()) != null) {  //来自键盘输入的数据如果不为空
            if ("886".equals(line)) {  //如果输出886,就退出
                break;
            }
            bos.write(line);    //输出流对象写出字符串
            bos.newLine();      //输出流对象换行
            bos.flush();        //刷新
        }
        //释放资源
        s.close();
//客户端:数据来自文本文件,接收服务器反馈
//服务器端:接收到的数据写入文本文件,给出反馈
//TCP协议客户端:
Socket s = new Socket("192.168.232.1", 12086);
        //1.下面两种客户端发送数据的方式选择一种
        //1.1接收来自及键盘输入的数据
        //BufferedReader bis = new BufferedReader(new InputStreamReader(System.in));
        //1.2如果客户端数据不是来自键盘输入而是来自文本文件2.txt内容如下:
        BufferedReader bis = new BufferedReader(new FileReader("Test\\1.txt"));
        //封装数据输出流对象
        BufferedWriter bos = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
        String line;
        while ((line = bis.readLine()) != null) {  //来自键盘输入的数据如果不为空
            bos.write(line);    //输出流对象写出字符串
            bos.newLine();      //输出流对象换行
            bos.flush();        //刷新
        }
//        //自定义结束标记(一般不用)
//        bos.write("886");
//        bos.newLine();
//        bos.flush();
        //用函数定义结束标记
        s.shutdownOutput();

        //接收反馈
 BufferedReader brclient = new BufferedReader(new InputStreamReader(s.getInputStream()));
        String data = brclient.readLine();
        System.out.println("服务器反馈:"+data);
        //释放资源
        s.close();
        bis.close();

//TCP协议服务器端:
 //创建服务器的ServerSocket对象
        ServerSocket ss = new ServerSocket(12086);
        //监听客户端的连接,返回一个对应的socket对象
        Socket s = ss.accept();
        //获取输入流对象,接收数据
       BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
        //把数据写入文本文件
    BufferedWriter bw = new BufferedWriter(new FileWriter("Test\\2.txt"));  //Test是模块名
        String line;
        while ((line = br.readLine()) != null) {  //等待读取
//            if("886".equals(line)){  //886接收连接标志判断
//                break;
//            }
            System.out.println(line);  //打印接收到的内容
            bw.write(line);            //写入文件到2.txt
            bw.newLine();             //换行
            bw.flush();               //刷新
        }
         //给出反馈
       BufferedWriter bwserver = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));      
        bwserver.write("上传成功");
        bwserver.newLine();             //换行
        bwserver.flush();                //刷新
        //释放资源
        ss.close();
        bw.close();
/**
TCP协议客户端:数据来自文本文件,接收服务器反馈,
TCP协议客户端:接收到的数据写入文本文件,给出反馈,为每一个客户端开起一个线程
*/
//客户端:
Socket s = new Socket("192.168.232.1", 12086);
//1.下面两种客户端发送数据的方式选择一种
//1.1接收来自及键盘输入的数据
//BufferedReader bis = new BufferedReader(new InputStreamReader(System.in));
//1.2如果客户端数据不是来自键盘输入而是来自文本文件2.txt内容如下:
BufferedReader bis = new BufferedReader(new FileReader("Test\\1.txt"));
//封装数据输出流对象
BufferedWriter bos = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
String line;
while ((line = bis.readLine()) != null) {  //来自键盘输入的数据如果不为空
	bos.write(line);    //输出流对象写出字符串
	bos.newLine();      //输出流对象换行
	bos.flush();        //刷新
}
//用函数定义结束标记
s.shutdownOutput();
//接收反馈
BufferedReader brclient = new BufferedReader(new InputStreamReader(s.getInputStream()));
String data = brclient.readLine();
System.out.println("服务器反馈:" + data);
//释放资源
s.close();
bis.close();


//服务器端:
//TCP协议服务器端:
//创建服务器的ServerSocket对象
ServerSocket ss = new ServerSocket(12086);
while(true) {
	//监听客户端的连接,返回一个对应的socket对象
	Socket s = ss.accept();
	//为每一个客户端开启一个线程
	new Thread(new ServerThead(s)).start();
}




//ServerThead.java:线程类
//前面new ServerThead(s)报错的时候
//alt+回车键,生成ServerTgead类一定要继承Runnable才可以
public class ServerThead implements Runnable {
private  Socket s;
public ServerThead(Socket s) {
	//这一句要手写
	this.s = s;
}

@Override
public void run() {
try {
	//获取输入流对象,接收数据
	BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
//解决名称冲突问题,每重启一此客户端和服务器,都会写入copy[0].txt,copy[1].txt,这样不同的名称文件
	int count = 0;
	File file = new File("Test\\copy[" + count + "].txt");
	while (file.exists()) {
		count++;
		file = new File("Test\\copy[" + count + "].txt");
	}
	//把数据写入文本文件
	BufferedWriter bw = new BufferedWriter(new FileWriter(file));  //Test是模块名
	String line;
	while ((line = br.readLine()) != null) {  //等待读取
		System.out.println(line);  //打印接收到的内容
		bw.write(line);            //写入文件到2.txt
		bw.newLine();             //换行
		bw.flush();               //刷新</try>
	}
	//给出反馈
	BufferedWriter bwserver = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
	bwserver.write("上传成功");
	bwserver.newLine();             //换行
	bwserver.flush();                //刷新
	//释放资源
	bw.close();
}catch(IOException e){
}
}
}

29.定义接口并且实现接口

//1.定义一个接口Eatable
public interface Eatable {
    void eat();
}

//2.定义一个接口实现类EatableImpl继承Eatable
public class EatableImpl implements Eatable{
    @Override
    public void eat() {
        System.out.println("一天一个苹果,医生远离我");
    }
}

//3.1定义一个测试类EatableTest,这个测试类的执行结果是实现类里面的输出结果:一天一个苹果,医生远离我
//这里就需要接口,实现接口的类,测试类
public class EatableTest {
    public static void main(String[] args) {
        //多态的方式接口,new一个实现类对象
        Eatable e = new EatableImpl();
        //调用自定义函数
        useEatable(e);
    }
    //定义一个方法调用实现类里的eat()方法,把实现类的对象作为参数传入
    private static void useEatable(Eatable e){
        //通过实现类对象.的方式调用eat方法
        e.eat();
    }
}

//3.2定义一个测试类EatableTest,这个测试类的执行结果是实现类里面的输出结果:哈哈哈哈哈哈
//这里就只需要接口和测试类就可以,不需要实现接口的类了
public class EatableTest {
    public static void main(String[] args) {
        //匿名内部类
        useEatable(new Eatable() {
            @Override
            public void eat() {
                System.out.println("哈哈哈哈哈哈");
            }
        });
    }
    //定义一个方法调用实现类里的eat()方法,把实现类的对象作为参数传入
    private static void useEatable(Eatable e){
        //通过实现类对象.的方式调用eat方法
        e.eat();
    }
}
//3.3定义一个测试类EatableTest,通过lambda表达式输出,输出结果是:你个小鬼
//这里就只需要接口和测试类就可以,不需要实现接口的类了
public class EatableTest {
    public static void main(String[] args) {
          // lambda表达式输出
        useEatable(()->{
            System.out.println("你个小鬼");
        });
    }
    //定义一个方法调用实现类里的eat()方法,把实现类的对象作为参数传入
    private static void useEatable(Eatable e){
        //通过实现类对象.的方式调用eat方法
        e.eat();
    }
}
//创建一个接口
public interface Flyable {
    void fly(String s);
}

//**
创建一个测试类,输出结果是:
晴空万里无云
飞机自驾游
适合飞行
*/
public class FlyableTest {
    public static void main(String[] args) {
        //通过匿名内部类实现
    useFlyable(new Flyable() {
        @Override
        public void fly(String s) {
            System.out.println(s);
            System.out.println("飞机自驾游");
        }
    });
    //通过lambda表达式实现
        useFlyable((String s)->{
            System.out.println("适合飞行");
        });
    }
    private static void useFlyable(Flyable f){
        f.fly("晴空万里无云");
    }
}
 //当接口有且仅有一个方法的时候才可以使用lambda表达式,
        // 参数类型可以省略如下:
       useAddable(( x, y)->{
           return x*y;
       });

 //当且仅当只有一个参数的时候可以入如下写:
        useAddable(x->{
            System.out.println(s);
        });
 //当只有一个参数和只有一个语句的时候可以如下写:
        useFlyable(s->System.out.println("你好呀"));

30.通过idea软件运行gitte上面的项目

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

31.maven和git的使用

31.1Maven的安装

请添加图片描述
请添加图片描述
请添加图片描述

请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述

31.2Maven的安装配置

请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述

31.3Maven的配置本地仓库和阿里云镜像

请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述

31.3.1Maven的命令格式和常用命令

请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述

31.4在Idea中配置Maven

请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述

31.5在Idea中创建web项目

请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述

31.5.1在Idea中创建web项目部署的插件

请添加图片描述
请添加图片描述
请添加图片描述

31.5.2Jetty插件

请添加图片描述

31.5.3Tomacat插件

请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述

31.5.4mvn仓库

请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述

31.5.5Maven项目环境下构建多模块项目

请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述

31.5.6servlet服务器

请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述

31.5.7Maven的打包操作

请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述

31.5.8添加Profile配置

请添加图片描述
请添加图片描述

31.5.9设置资源文件配置

请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述

31.5.10通过Maven创建的Web工程

请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述

31.6在Idea中使用Git

请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述

31.6.1在Idea中常用快捷键

请添加图片描述
请添加图片描述
请添加图片描述

31.6.2在Idea中添加GitHub账号

请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述

请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

胡启行

您的鼓励将是我前进的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值