记录学习每一天-day23

本文详细讲解了Java中如何实现文件复制,包括文件输入、输出、整合输入输出以及递归获取目录下所有子目录的方法。此外,还介绍了线程的基本概念,如进程与线程的区别、并发与并行的概念,以及线程的创建和使用。文中提供了具体的代码示例,演示了线程的启动、优先级设置和常用方法的使用。
摘要由CSDN通过智能技术生成

1.15 文件复制

 1,文件复制:本质就是输入和输出
 *                   1.1完成文件输入,读取文件
 *                   1.2完成文件输出
 *                   1.3 整合输入和输出完成复制
 * 2获取目录下所有的子目录
 *                   2.1 获取目录对象
 *                   2.2 获取该目录下所有直接子目录
 *                   2.3 递归获取子目录下面的子目录(获取后代目录)
 * 3整合代码
 *                 3.1 获取所有后代目录后,得到每一个文件对象
 *                 3.2 通过文件对象就可以获取该文件的全路径
 *                 3.3 有了全路径,就可以创建流对象
 *                 3.4 然后就能完成复制功能

 /**
 * 注意:文件复制的时候,目标路径和原路径 不能一样
 * 
 *     1 会清空该文件,因为在创建输出流的时候,可以指定是覆盖还是追加,如果是覆盖写入,
 *             那么在创建输出流的时候,会把该文件清空
 * 
 * 2 追加写入,导致永远读取不完,因为一边读 一边复制,永远没有执行不完
 */

文件复制大概流程(代码实现):

import java.io.*;

public class FileCopy {
    public static void main(String[] args) throws FileNotFoundException, IOException {
        File file=new File("要复制的目标文件路径");
        test(file);
        System.out.println("复制完毕");
    }

    public static void test(File file) throws FileNotFoundException, IOException {
        //判断是否是文件
        if(file.isFile()){
            //获得全路径
            String filepath =file.getAbsolutePath();
            /*注意 : 文件复制的时候,目标路径和原路径 不能一样*/
            //目标目录,复制到E盘,进行拼接字符串
            String newFilePath ="E"+filepath.substring(1);
            
            //判断目标目录是否存在
            // 获取目标文件对象
            File newfile =new File(newFilePath);
            //获取父文件对象
            File parentFile = newfile.getParentFile();
            //判断是否存在
            if(!parentFile.exists()){
                //不存在就创建
                parentFile.mkdir();
            }
            //创建字节流对象等,准备复制
            try(  
                    //filepath 全路径
                    FileInputStream fis = new FileInputStream(filepath);
                    //目标目录,上面已经拼接好了字符串
                    FileOutputStream fos = new FileOutputStream(newFilePath);
                    BufferedInputStream bis = new BufferedInputStream(fis);
                    BufferedOutputStream bos = new BufferedOutputStream(fos);
                    ){
                  byte[] bytes=new byte[1024];
                  int coun=0;
                  while((coun=bis.read(bytes))!=-1){
                      bos.write(bytes,0,coun);
                      bos.flush();
                  }
              }catch(Exception e){
                  e.printStackTrace();
              }
            }else{
                //进入else说明是文件夹
                //获取所有的子文件
                File[] files=file.listFiles();
                //遍历所有子文件,判断是不是文件
                for (File subFile:files){
                    test(subFile);
                }              
        }         
    }    

}
 

 JavaSE-16-线程

  1. 程序(program)是为完成特定任务、用某种语言编写的一组指令的集合。即指一 段静态的代码,静态对象。
  2. 进程(process)是程序的一次执行过程,或是正在运行的一个程序。是一个动态的过程:有它自身的产生、存在和消亡的过程。——生命周期
  3. 线程(thread),进程可进一步细化为线程,是一个程序内部的一条执行路径。

 并行和并发

并行:多个CPU同时执行多个任务。比如:多个人同时做不同的事。

并发:一个CPU(采用时间片)同时执行多个任务。比如:秒杀、多个人做同一件事1

 

 线程的创建和使用

方式一:Tread类

创建线程 1 继承 Thread 类并覆写run方法
               2 Runnable 接口,并实现run方法
               
  run方法 就等于是新线程中的main方法
  
  启动线程 只有一种方式,就是调用线程对象的start()方法

public static void main(String[] args) {
        //创建线程类对象  继承方式
        Thread t1=new Processor();
        //创建线程类对象   实现接口方式
        Thread t2=new Thread(new Prcess());
        //启动该线程
        t1.start();
        t2.start();
        //不能手动调用run方法,因为这样就是调用方法,而不是线程了
        //t1.run();
        System.out.println("-----------");
        System.out.println("-------");
        
    }
        
}
class Processor  extends Thread{
    @Override
    public void run(){
        for (int i = 1; i < 4; i++) {
            System.out.println("t1:"+i);        
        }
    }
}

class Prcess implements Runnable{
    @Override
    public void run() {
        for (int i = 1; i < 4; i++) {
            System.out.println("t2:"+i);
        }            
    }        
}
 

 常用方法:

 * getName():获取当前线程的名字
 * setName(): 设置线程的名字,默认是Thread-0,Thread-1 依次递增
 * setPriority():设置优先级,java有10个优先级,1-10
 *           在Thread 类中 用三个常量表示
 *               public final static int MIN_PRIORITY = 1;
 *               public final static int NORM_PRIORITY = 5;
 *               public final static int MAX_PRIORITY = 10;
 *                 默认子类继承父类优先级,而Thread的优先级为5
 *                 
 * static currentThread():获取当前线程对象,写在哪个类中,获取哪个线程类对象
 * 
 * static sleep(): 让当前线程进入睡眠状态,参数是睡眠的毫秒数,写在哪个类中,就睡眠哪个线程类 

 public static void main(String[] args) {
        Thread t1=new Thread(new Pro());
        //设置优先级
        t1.setPriority(10);
        // 设置名字
        t1.setName("t1");
        t1.start();

        for (int i = 0; i < 10; i++) {
            try {

                 //注意这里睡眠的是t1
                t1.sleep(500);   
            } catch (InterruptedException e) {
                e.printStackTrace();}
        // currentThread 获取当前线程对象
        // getName : 获取当前线程对象名字
        System.out.println(Thread.currentThread().getName()+" : "+i);
            }
    }

class Pro implements Runnable{

    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            // currentThread 获取当前线程对象
            // getName : 获取当前线程对象名字
            System.out.println(Thread.currentThread().getName()+" : "+i);
        }
    }
    
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值