- 1.理论
- 解释:什么是线程,在讲解线程之前,先了解什么是进程
- 进程:运行中的应用程序称为进程,拥有系统资源(cpu,内存)
- 线程:线程是进程中的一个任务(一件事一个人做),一个进程可以有多个任务(一件
- 事多个人做),所以就有了多线程
- 多线程:一个应用程序中的多个任务
- 程序入口被自动创建为主线程(一件事一个人做),在主线程中可以创建多个子线程
- (一个事分给多个人做)
- 多线程的解释:
- 假设在卖票,排十个人的队,那么就只能老老实实的等待排队,假设第二个人有
- 事买个票买了很久,后面的人就得老老实实等待他买完才能买到票。
- 多线程就是同样的事情,同样的本质,可以抢资源,可以插队。而且是十个人都
- 可以插队。
- 多线程的好处:效率高,不浪费资源。
- 线程的两种方式:
- Thread使用:继承Thread类,重写run(),子类调用start()开启线程,自动调用run(),不能直接调用run()。
- runnable接口使用:实现接口,重写run(),只有Thread中有start()开启线程,所有想使用,必须把类的对象放入Thread类实例化中,用Thread调用start().
- Thread.currentThread().getName()获取线程名字
- 线程的状态
- 1.新建:刚new出来在内存中
- 2.就绪:start表示该线程有资格抢CPU
- 3.运行:抢到了CPU,会执行run方法
- 4.死亡:执行完run方法
- 5.阻塞:调用了sleep方法或其他阻塞的方法
- 2.案例:老虎机游戏制作
- 实现
- extends Thread
- implements Runnable
- 实现
- 1.字符流:
- 读:一个--FileReader
- 一行--BufferedReader
- 写:一行--FileWriter
- 多行--BufferedWriter配合:newLine()创建行--flush()每次刷新
- 根据流的方向:输入,输出
- 根据流的类型:字节流,字符流(操作文本文件)
- 所有以Stream结尾的都是字节流
- 所有以Reader或者Writer结尾的都是字符流
- InputStreamReader是将字节流转换成字符流
- OutputStreamWriter
- 2.网络 net java.net网络包
- dos命令:查看IP地址 ipconfig
- 获取自己的电脑InetAddress.getLocalHost() 127.0.0.1本机
- 获取局域网中别人电脑InetAddress.getByName("放入别人ip地址")
- 统一资源定位符url http超文本传输协议 域名www.taobao.com www.qq.com
- URL url=new URL("https://www.baidu.com");
- 3.网上下载
- 3.1网页下载:
- 先声明资源定位
- URL url=new URL("https://www.baidu.com");
- 打开该网页的字节流
- InputStream is=url.openStream();
- 读取和写入在硬盘同时进行(字节流字符流都可以)
- 3.2图片下载:修改定位的地址,其他操作和上面一样(不使用字符流)
- io流
- 根据类型流分为字节流和字符流
- 字节流:
- 1.文件读取和写入
- 方向分为 操作分为 理解
- io包的意义:i--input 输入流 文件的读取 访问电脑磁盘,所以是输入命令进电脑磁盘,读取磁盘里面文件信息
- o--output 输出流 文件的写入 把电脑磁盘中信息拿出来,所以是输出信息,写入到一个地方将其保存
- 注意:与字面意思截然相反
- 2.1 FileInputStream--读取文件数据
- read()一次读一个字节,读取ascii码
- read(byte[])读取一定数量的字节,存储在byte[]容器中
- 2.2 FileOutputStream--在文件中写入数据
- write(int)一次写一个字节
- write(byte[])写入一定数量的字节
- 2.字符流:
- 读:一个--FileReader
- 一行--BufferedReader
- 写:一行--FileWriter
- 多行--BufferedWriter配合:newLine()创建行--flush()每次刷新
- 根据流的方向:输入,输出
- 根据流的类型:字节流,字符流(操作文本文件)
- 所有以Stream结尾的都是字节流
- 所有以Reader或者Writer结尾的都是字符流
- InputStreamReader是将字节流转换成字符流
- OutputStreamWriter是将字符流转成字节流
- 注意:关闭
- 2.读取性能好,有缓冲功能(重点使用)
- 3.1 BufferedInputStream(使用一样)
- 3.2 BufferedOutputStream(使用一样)
- 把读取对象放入构造方法中使用
- 例如:FileInputStream fis=new FileInputStream(file);
- BufferedInputStream bis=new BufferedInputStream(fis)
- 使用bis调用方法性能好,有缓冲功能
- 注意:都关闭
- package com.zking;
- import java.io.File;
- import java.io.IOException;
- import java.util.Date;
- public class Demo {
- public static void main(String[] args) {
- // File f=new File("d:\\a.txt");
- // //测试file类中的方法
- // System.out.println(f.getAbsolutePath());
- // System.out.println(f.getPath());
- // System.out.println(f.getParent());//上一级
- // System.out.println(f.getName());
- // System.out.println(f.lastModified());//得到最后修改时间的毫秒值
- // Date d=new Date(f.lastModified());
- // System.out.println(d.toLocaleString());
- // System.out.println(f.isFile());
- // System.out.println(f.isDirectory());
- // System.out.println(f.exists());
- // System.out.println(f.length());//得到文件大小b
- //
- // //得到电脑磁盘
- // File[] l = File.listRoots();
- // for (File file : l) {
- // System.out.println(file);
- // }
- //
- //创建文件夹
- // File f=new File("d:\\abc");
- //f.exists()是否存在 取反不存在返回true
- // if(!f.exists()) {//不存在的时候创建
- // f.mkdir();
- // System.out.println("OK");
- // }
- //创建文件
- // File f=new File("d:\\abc\\a.txt");
- // if(!f.exists()) {
- // try {
- // f.createNewFile();
- // System.out.println("OK");
- // } catch (IOException e) {
- // // TODO Auto-generated catch block
- // e.printStackTrace();
- // }
- // }
- //删除
- // File f=new File("d:\\abc");
- // if(f.exists()) {
- // boolean d = f.delete();
- // System.out.println(d);
- // }
- //查找文件夹中的文件
- // File f=new File("d:\\abc");
- //返回文件夹中所有文件名
- // String[] list = f.list();
- // for (String string : list) {
- // System.out.println(string);
- // }
- //返回文件夹中所有文件或者文件夹
- // File[] lf = f.listFiles();
- // for (File file : lf) {
- // System.out.println(file.getName());
- // }
- //算法:递归--自己玩 递归用来写方法,方法中调用方法(自己)
- // 1.查找文件夹下所有文件
- // File f=new File("c:\\");
- // Demo d=new Demo();
- // d.selFiles(f);
- // 2.删除文件夹下所有文件,删除文件夹
- // 下所有txt文件
- // File f=new File("d:\\abc");
- // Demo d=new Demo();
- // d.delAll(f);
- // System.out.println("OK");
- //txt文件
- // File f=new File("d:\\abc");
- // Demo d=new Demo();
- // d.delAll(f,"txt");
- // System.out.println("OK");
- // 3.使用递归完成斐波那契数列1,1,2,3,5,8,
- // 13,21,34,55,.....
- // Demo d=new Demo();
- // int num = d.num(10);
- // System.out.println(num);
- }
- public void selFiles(File f) {
- //1.判断是文件夹还是文件
- if(f.isFile()) {
- //文件就直接打印
- System.out.println(f.getName());
- }else if(f.isDirectory()) {//2.判断是否是文件夹
- //如果是文件夹,就再次得到文件夹中所有文件
- File[] lf = f.listFiles();
- for (File file : lf) {
- //遍历得到的所有文件或者文件夹
- //然后没遍历一个文件,就自己调用自己的方法
- //参数是当前文件
- selFiles(file);
- }
- }
- }
- public void delAll(File f) {
- if(f.isFile()) {
- f.delete();
- }else if(f.isDirectory()) {
- File[] lf = f.listFiles();
- for (File file : lf) {
- delAll(file);
- }
- }
- }
- public void delAll(File f,String s) {
- if(f.isFile()) {
- String []st=f.getName().split("\\.");
- if(st[st.length-1].equals(s)) {
- f.delete();
- }
- }else if(f.isDirectory()) {
- File[] lf = f.listFiles();
- for (File file : lf) {
- delAll(file,s);
- }
- }
- }
- //1+1+1+1+1。。。。。。
- public int num(int index) {//3 4
- if(index==1 ||index==2) {
- return 1;
- }else {
- return num(index-1)+num(index-2);
- }
- }
- }