【学习日记2023.4.7】之File_IO(文件复制_字节缓冲流)

1. File

1.1 File和IO概述

  • File能干什么?操作文件或文件夹
  • IO能干什么?读写数据(文件,网络…)
请添加图片描述
请添加图片描述
请添加图片描述

1.2 File构造方法

  • 注意:
    • File对象既可以表示文件,也可以表示文件夹
    • File对象仅仅表示的是一个路径名而已,而这个路径是可以存在的,也允许是不存在的
  • File对象的路径分隔符写法
    • 一个正斜杠/
    • 两个反斜杠\\
    • 示例:
      • new File(“d:/resource/a.txt”);
      • new File(“d:\resource\a.txt”);
构造方法说明
File(String pathName)参数:路径字符串"D:\resource\a.txt"
File(String parent, String child)参数1:父路径的字符串"D:\resource"参数2:子路径的字符串 "a.txt"作用:把两个路径拼起来 “D:\resource\a.txt”
File(File parent, String child)参数1:父路径的File对象 new File(“D:\resource”) 参数2:子路径的字符串 “a.txt” 作用:把两个路径拼起来 “D:\resource\a.txt”

1.3 绝对路径和相对路径

绝对路径:

  • 从盘符开始,一直到目标的完整路径
    请添加图片描述

相对路径:

  • 从当前位置到目标的简单路径
  • 好处: 书写简单
    请添加图片描述

idea中的相对路径

  • 一般情况是从项目(Project)所在的路径开始
  • 如果不是: 可以使用System.getProperty(“user.dir”)获取
  • 好处找项目中的文件或文件夹方便
File f1 = new File("D:\\JavaSE-code\\day09-code\\src\\a.txt");
System.out.println(f1.exists());

File f2 = new File("day09-code\\src\\a.txt");
System.out.println(f2.exists());


String s = System.getProperty("user.dir");
System.out.println(s);

1.4 File判断、获取信息的方法

方法名说明
public boolean exists()判断当前文件对象,对应的文件路径是否存在,存在返回true,反之。
public boolean isFile()判断当前文件对象指代的是否是文件,是文件返回true,反之。
public boolean isDirectory()判断当前文件对象指代的是否是文件夹,是文件夹返回true,反之。
public String getName()获取文件的名称(包含后缀)
public long length()获取文件的大小,返回字节个数
public long lastModified()获取文件的最后修改时间。
public String getPath()获取创建文件对象时,使用的路径
public String getAbsolutePath()获取绝对路径
public static void main(String[] args) throws UnsupportedEncodingException {
// 1.创建文件对象,指代某个文件
File f1 = new File("D:/resource/a.txt");
//File f1 = new File("D:/resource/");

// 2、public boolean exists():判断当前文件对象,对应的文件路径是否存在,存在返回true.
System.out.println(f1.exists());

// 3、public boolean isFile() : 判断当前文件对象指代的是否是文件,是文件返回true,反之。
System.out.println(f1.isFile());

// 4、public boolean isDirectory()  : 判断当前文件对象指代的是否是文件夹,是文件夹返回true,反之。
System.out.println(f1.isDirectory());

// 5.public String getName():获取文件的名称(包含后缀)
System.out.println(f1.getName());

// 6.public long length():获取文件的大小,返回字节个数
System.out.println(f1.length());

// 7.public long lastModified():获取文件的最后修改时间。
long time = f1.lastModified();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
System.out.println(sdf.format(time));

// 8.public String getPath():获取创建文件对象时,使用的路径
File f2 = new File("D:\\resource\\ab.txt");
File f3 = new File("file-io-app\\src\\itheima.txt");
System.out.println(f2.getPath());
System.out.println(f3.getPath());

// 9.public String getAbsolutePath():获取绝对路径
System.out.println(f2.getAbsolutePath());
System.out.println(f3.getAbsolutePath());
}

1.5 File创建、删除方法

创建方法

方法名说明
public boolean createNewFile()创建一个新的没有内容的文件
public boolean mkdir()只能创建一级文件夹
public boolean mkdirs()可以创建多级文件夹

删除方法

  • 注意: delete方法默认只能删除文件和空文件夹,删除后的文件不会进入回收站
方法名说明
public boolean delete()删除文件、空文件夹
public static void main(String[] args) throws Exception {
    // 1、public boolean createNewFile():创建一个新文件(文件内容为空),创建成功返回true,反之。
    File f1 = new File("D:/resource/itheima2.txt");
    System.out.println(f1.createNewFile());

    // 2、public boolean mkdir():用于创建文件夹,注意:只能创建一级文件夹
    File f2 = new File("D:/resource/aaa");
    System.out.println(f2.mkdir());

    // 3、public boolean mkdirs():用于创建文件夹,注意:可以创建多级文件夹
    File f3 = new File("D:/resource/bbb/ccc/ddd/eee/fff/ggg");
    System.out.println(f3.mkdirs());

    // 3、public boolean delete():删除文件,或者空文件,注意:不能删除非空文件夹。
    System.out.println(f1.delete());
    System.out.println(f2.delete());
    File f4 = new File("D:/resource");
    System.out.println(f4.delete());
}

1.6 File遍历文件夹的所有内容

方法

方法名说明
public File[] listFiles()进入当前文件夹,并获取当前文件夹下所有的内容并封装为File对象数组返回

注意事项

  • 当调用者是文件,或者路径不存在时,返回null
  • 当调用者是空文件夹时,返回一个长度为0的数组
  • 当调用者是一个有内容的文件夹时,将里面所有一级文件和文件夹的路径放在File数组中返回
  • 当调用者是一个文件夹,且里面有隐藏文件时,将里面所有文件和文件夹的路径放在File数组中返回,包含隐藏文件
  • 当调用者是一个文件夹,但是没有权限访问该文件夹时,返回null
File f1 = new File("d:\\aaa");
File[] files = f1.listFiles();
for (File file : files) {
    System.out.println(file.getAbsolutePath());
}

1.7 递归

概述

  • 递归: 方法中自己调用自己
  • 问题: 使用不当会造成栈内存溢出
/*
    什么是递归 : 方法中自己调用自己

    递归有可能出现的问题: 栈内存溢出 (递归死循环)
 */
public class Demo {
    public static void main(String[] args) {
        test();
    }

    public static void test(){
        System.out.println("test执行了~");
        test(); // 方法中调用了自己
    }
}

案例1

  • 需求: 使用递归,求n! (!表示阶乘)
  • 5! = 5 * 4 * 3 * 2 * 1
/*
        需求: 使用递归求n!  阶乘
        5! = 5 * 4 * 3 * 2 * 1
        4! = 4 * 3 * 2 * 1
        3! = 3 * 2 * 1
        ...

        分析:
            f(n) = n * f(n - 1)
            f(5) = 5 * f(4)
            f(4) = 4 * f(3)
            f(3) = 3 * f(2)
            f(2) = 2 * f(1)
            f(1) = 1
     */
public class Demo {
    public static void main(String[] args) {
    	System.out.println(recursion(5));
    }
    public static int recursion(int n){
        if (n==1){
            return 1;
        }else {
            return n * recursion(n-1);
        }
    }
}

递归执行流程

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

三要素

  • 推导公式: f(n) = f(n - 1) * n
  • 递归终结点: f(1)
  • 递归的方向必须走向终结点
    • f(5) = f(4) * 5
    • f(4) = f(3) * 4
    • f(3) = f(2) * 3
    • f(2) = f(1) * 2
    • f(1) = 1

案例2

  • 需求: 求1~n的和
public class Demo {
    public static void main(String[] args) {
    	System.out.println(sum(100));
    }    
	public static int sum(int n){
        if (n==1){
            return 1;
        }else {
            return n+sum(n-1);
        }
    }
}

1.8 递归操作文件练习

文件搜索

  • 需求:
    • 从C:盘中,搜索“java.exe” 这个文件,找到后直接输出其位置。
  • 分析:
    • ①先找出D:盘下的所有File对象
    • ②遍历数组,判断是否是文件
    • ③如果是文件,判断是否是自己想要的
    • ④如果是文件夹,需要继续进入到该文件夹,重复上述过程
  • 步骤
    • 拦截非法情况: 文件夹对象为null 或者 文件夹不存在 或者 对象是文件
    • 获取文件夹中所有的File对象并返回对象数组
    • 判断当前文件夹是否有内容(数组不能是null,数组的长度大于0)
    • 遍历数组
    • 判断是否为文件
      • 是文件: 判断文件名是不是想要的,如果是直接打印绝对路径
      • 不是文件,表示是文件夹: 递归调用方法
package com.itheima.file.test;

import java.io.File;

/**
 * @Auther: Yishooo
 * @Date: 2023-4-7 - 04 - 07 - 11:46
 * @Description:
 */

/*
    【练习一】
    - 需求:
      - 从C:盘中,搜索“java.exe” 这个文件,找到后直接输出其位置。
    - **分析**:
      ①先找出C:盘下的所有一级文件对象
      ②遍历全部一级文件对象,判断是否是文件
      ③如果是文件,判断是否是自己想要的
      ④如果是文件夹,需要继续进入到该文件夹,重复上述过程
*/
public class Demo1 {
    public static void main(String[] args) {
        File f = new File("C:\\");
        findFile(f,"java.exe");
    }

    //去哪个文件夹下找  java.exe
    public static void findFile(File dir,String fileName){
        //1.排除非法的内容
            //dir 不能是null
            //dir 表示的文件夹路径必须存在
            //dir 必须指向的是一个文件夹
        if (dir == null || !dir.exists() || dir.isFile()){
            return;
        }

        //2.进入到文件夹(C盘)  获取所有的内容
        File[] files = dir.listFiles();

        //3.判断(数组不能是null,长度要>0)
        if (files != null && files.length > 0){
            //4.遍历数组
            try {
                for (File file : files) {//file(c盘下的文件夹和文件)
                    //5.判断是文件还是文件夹
                    if(file.isFile()){//文件
                        if (fileName.equals(file.getName())){
                            System.out.println(file.getAbsoluteFile());
                            return;
                        }
                    }else {//文件夹
                        findFile(file,fileName);
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

删除文件夹

  • 需求: 删除一个多级文件夹
  • 分析:
    • delete方法 只能删除文件和空文件夹
    • 要想删除非空文件夹,先删除掉里面所有的内容
    • 最后才能删除这个文件夹
package com.itheima.file.test;

import java.io.File;

/**
 * @Auther: Yishooo
 * @Date: 2023-4-7 - 04 - 07 - 14:33
 * @Description:
 */
/*
    【练习二】
    - 需求
      - 删除一个多级文件夹
    - 思路
      - delete方法 只能删除文件和空文件夹
      - 要想删除非空文件夹,先删除掉里面所有的内容
      - 最后才能删除这个文件夹
*/
public class Demo2 {
    public static void main(String[] args) {
        File f = new File("E:\\io\\iotest\\达咩");//替换自己的路径,注意:【切记写不需要文件的路径,此删除不经过回收站!】
        deleteDir(f);
    }

    public static void deleteDir(File dir){
        //1.排除非法的情况
        if (dir == null || !dir.exists() || dir.isFile()){
            return;
        }

        //2.获取文件夹中所有的内容
        File[] files = dir.listFiles();

        //3.判断数组  不能 null 长度 > 0
        if (files != null && files.length > 0){
            //4.遍历拿到每一个文件或文件夹的对象
            for (File file : files) {
                //5.判断是文件还是文件夹
                if (file.isFile()){//文件
                    file.delete();
                }else {//文件夹
                    deleteDir(file);
                }
            }
        }
        //6.删除自己
        dir.delete();
    }
}

统计文件个数

  • 需求: 统计一个文件夹中每种文件的个数并打印
  • 打印格式如下:
    • txt:3个
    • doc:4个
    • jpg:6个
  • 不考虑特殊文件名
    • a.txt.txt.txt(多个.)
    • a(没有后缀名)
package com.itheima.file.test;

import java.io.File;
import java.util.HashMap;
import java.util.Map;

/**
 * @Auther: Yishooo
 * @Date: 2023-4-7 - 04 - 07 - 14:50
 * @Description:
 */
/*
【练习三】
需求

- 统计一个文件夹中每种文件的个数并打印
- 打印格式如下:
  - txt:3个
  - doc:4个
  - jpg:6个
    ....
- 不考虑特殊文件名
  - a.txt.txt.txt
  - a
*//*
    【练习三】
    需求
    - 统计一个文件夹中每种文件的个数并打印
    - 打印格式如下:
      - txt:3- doc:4- jpg:6....
    - 不考虑特殊文件名
      - a.txt.txt.txt
      - a

      进入文件夹  拿到所有的文件名
      遇到了文件夹继续进入文件夹统计(递归)

      正常的文件名  按照\\.切割后,得到数组的长度为 2
      Map<String,Integer> 键:后缀名  值:次数
*/
public class Demo3 {
    public static void main(String[] args) {
        Map<String,Integer> map = new HashMap<>();
        File f = new File("D:\\学校基础数据文档\\表情包");
        getFileCount(f,map);
        System.out.println(map);
    }

    public static void getFileCount(File dir,Map<String,Integer> map){

        //1.排除不是文件夹的情况
        if (dir == null || !dir.exists() || dir.isFile()){
            return;
        }
        //2.获取文件夹中的所有内容
        File[] files = dir.listFiles();
        //3.判断数组 是否为null 且  长度 > 0
        if (files != null && files.length > 0){
            //4.遍历数组
            for (File file : files) {
                //5.判断是文件还是文件夹
                if (file.isFile()){//文件
                    String fileName = file.getName();
                    String[] split = fileName.split("\\.");//\\.  按.切割,\\转义字符
                    if (split.length == 2){//标准正常文件名类型经过切分,变为长度为2的数组
                        if (map.containsKey(split[1])){
                            map.put(split[1], map.get(split[1])+1);//判断后缀名是否存在,存在的话值加1
                        }else {
                            map.put(split[1], 1);//不存在就加1
                        }
                    }
                }else {//文件夹
                    getFileCount(file,map);
                }
            }
        }
    }
}

1.9 操作文件夹递归套路

请添加图片描述

2. IO

2.1 概述

  • 作用: 读写数据(硬盘,网络…)
  • 输入输出: 站在内存的角度
    • 输入(读): 从硬盘(网络) 中读数据到内存
    • 输出(写): 把内存的数据写到硬盘(网络)中

2.2 分类和IO流体系

分类

  • 按流向分类
    • 输入流(读)
    • 输出流(写)
  • 按数据类型分
    • 字节流: 操作任意类型的数据,用于文件复制
    • 字符流: 只适合操作纯文本文件,读写文件中的内容
    • 纯文本文件: windows系统中能用记事本打开,并且能读懂的
      请添加图片描述

IO体系

请添加图片描述

2.3 文件字节输出流

快速入门

  • 创建FileOutputStream对象(构造方法,参数为要操作文件的路径)
    • FileOutputStream fos = new FileOutputStream(String path);
    • FileOutputStream fos = new FileOutputStream(File file);
  • 写数据(write方法)
  • 释放资源(close方法)
//1.创建文件字节输出流的对象
FileOutputStream fos = new FileOutputStream("day09-code\\a.txt");

//2,写数据     传递一个整数时,那么实际上写到文件中的,是这个整数在码表中对应的那个字符.
fos.write(98);

//3,释放资源
fos.close(); //告诉操作系统,我现在已经不要再用这个文件了.

注意事项

  • 构造方法的注意事项
    • FileOutputStream fileOutputStream = new FileOutputStream(String path);
      • 如果文件不存在: 创建
      • 如果文件存在: 清空
    • 如果不想清空数据想要追加数据, 第二参数要传true
      • FileOutputStream fileOutputStream = new FileOutputStream(String path,boolean append);
  • 写方法(write)
    • 如果写入的是整数,实际写入的是该整数对应的码表值, write(97) -> a
  • 释放资源(close)
    • 必须要释放资源
public class Demo1 {
    /*
        FileOutputStream构造方法注意事项
            1.如果要操作的文件不存在: 创建
            2.如果要操作的文件存在: 清空文件的内容
            问题: 如果不想清空,追加数据
            回答: 在构造方法的第二个参数,传true表示不清空追加数据
            FileOutputStream(String path,boolean append)
        释放资源
            必须释放资源
     */
    public static void main(String[] args) throws IOException {
        // 1.创建FileOutputStream
//        FileOutputStream fos = new FileOutputStream("day10-code\\a.txt"); // 清空
        FileOutputStream fos = new FileOutputStream("day10-code\\a.txt",true); // 不清空,追加数据
        // 2.调用写方法
        fos.write(97);
        // 3.释放资源
        fos.close(); // 我和这个文件的联系已经断开了
//        while (true){
//
//        }
    }
}

写多个数据

  • write(byte[] b)
    • 把数组中所有的数据写到文件中
  • write(byte[] b, int off, int len)
    • 写数组的一部分
      • 参数1:要写入的数组
      • 参数2:从数组的第几个索引开始写
      • 参数3:写几个字节
public class Demo2 {
    /*
        文件字节输出流 一次写多个数据
            write(byte[] b); 一次写字节数组中所有的数据
            write(byte[] b, int off, int len); 一次写字节数组中一部分数据
                参数一: 一个字节数组
                参数二: 从哪个索引开始写
                参数三: 写多少个字节
     */
    public static void main(String[] args) throws IOException {
        FileOutputStream fos = new FileOutputStream("day10-code\\a.txt");

        byte[] bytes = {97,98,99,100,101,102};
//        fos.write(bytes);
        fos.write(bytes,2,2);

        fos.close();
    }
}

文件字节输出流小结

请添加图片描述

2.4 异常处理的方案

try…catch…finally

  • finally代码块中的代码,无论程序是否出现异常,都会执行
  • 可以将释放资源的代码写到finally中
public class Demo1 {
    /*
        try...catch...finally 处理异常的格式
        finally: 不论程序是否出现异常 都会执行finally中的代码
            在执行finally代码之前 虚拟机停止了
            在执行finally代码之前 程序阻塞(比如死循环)

        try{
            // 有可能出现异常的代码
        } catch(异常类名 变量名){
            // 如果捕获到异常,执行这里的代码
        } finally{
            //  不论程序是否出现异常 都会执行finally中的代码
        }

     */
    public static void main(String[] args) {
        try {
//            System.out.println(1);
            System.out.println(1 / 0);
//            System.exit(0);
        } catch (Exception e) {
            System.out.println("出现异常了");
        } finally {
            System.out.println("finally...看看我执行了吗");
        }
    }
}

finally执行时机

  • finally什么时候执行?
    • return之前(方法结束之前)
public class Demo2 {
    /*
        finally执行时机: 是在方法结束之前执行(return 之前)
     */
    public static void main(String[] args) {
        String s = test();
        System.out.println(s);
    }


    public static String test(){
        try {
            System.out.println(1 / 0);
            return "正常执行了";
        } catch (Exception e){
            return "出现异常了"; // finally中的代码在return之前执行
        } finally {
            return "我是finally的代码";
        }
    }
}

try-with-resources

  • JDK7开始支持的语法结构
  • 前提: 只有实现了AutoCloseable接口的类才能使用该语法结构
  • 格式
try(对象1;对象2;对象3;......){
    // 可能出现异常的代码
} catch(异常类名 变量名){
}
  • 好处: 不需要手动释放资源,自动释放资源
public class Demo2 {
    public static void main(String[] args) {
        // 选中代码 Ctrl+ALt+T 选择使用try-with-resources
        try (FileOutputStream fos = new FileOutputStream("day18//finally.txt",true)) {
            fos.write(98);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

2.5 文件字节流输入流

基本使用

  • 创建FileInputStream对象(构造方法,参数为要操作文件的路径)
    • FileInputStream fis = new FileInputStream(String path)
    • FileInputStream fis = new FileInputStream(File file)
    • 注意: 文件不存在,报错
  • 读数据(read方法)
    • int read();
    • 注意: 每次读一个字节,当读到末尾,没有数据可以读,返回-1(作为结束标记)
  • 释放资源(close方法)
public class Demo {
    /*
        文件字节输入流FileInputStream
        1.创建对象(从哪一个文件读)
            FileInputStream(String path)
            FileInputStream(File file)
        2.读方法
            int read() 一次读一个字节 ,如果文件读到了末尾,没有数据可读,返回-1 作为结束标记
        3.释放资源
     */
    public static void main(String[] args) throws IOException {
        FileInputStream fis = new FileInputStream("day10-code\\a.txt");
//        int b1 = fis.read();
//        System.out.println((char) b1);
//        int b2 = fis.read();
//        System.out.println((char) b2);
//        int b3 = fis.read();
//        System.out.println(b3);
//        int b4 = fis.read();
//        System.out.println(b4);

        // 循环做优化
        int b; // 准备记录这一次读到的字节
        // (b = fis.read()): 把这一次读到的字节赋值给b ()目的提高优先级
        // 拿着b判断是不是-1
        // 如果不是-1 继续执行循环
        // 是-1 结束循环
        while ((b = fis.read()) != -1){
            System.out.print((char) b);
        }

        fis.close();

    }
}

一次读多个字节

  • int read(byte[] b)
    • 作用: 一次读多个字节到字节数组中
    • 返回值: 返回这次读了多少个字节,同样返回-1作为结束标记
public class Demo1 {
    /*
        FileInputStream 一次读多个字节的方法
            int read(byte[] b);
                一次读多个字节放到这个字节数组中
                返回值表示这一次读到了多少个字节
                如果文件读到了末尾,没有数据可读,返回-1 作为结束标记
     */
    public static void main(String[] args) throws IOException {
        FileInputStream fis = new FileInputStream("day10-code\\a.txt");
        byte[] bytes = new byte[2];

        int len1 = fis.read(bytes);
        System.out.println(len1);
        System.out.println(Arrays.toString(bytes)); // 97 98   a b

        int len2 = fis.read(bytes);
        System.out.println(len2);
        System.out.println(Arrays.toString(bytes)); // 99 100 c d

        int len3 = fis.read(bytes);
        System.out.println(len3); // 1
        System.out.println(Arrays.toString(bytes)); // 101 e

        int len4 = fis.read(bytes);
        System.out.println(len4);
        System.out.println(Arrays.toString(bytes));

        fis.close();
    }
}

2.6 文件复制

  • 思路: 循环读写
public class Demo {
    public static void main(String[] args) throws IOException {
        // 从哪读往哪里写
        FileInputStream fis = new FileInputStream("day10-code\\file\\a.avi");
        FileOutputStream fos = new FileOutputStream("day10-code\\copy\\a.avi");

        // 循环读写 一次读写一个字节(慢)
        int b;
        while ((b = fis.read()) != -1){
            fos.write(b);
        }

        fis.close();
        fos.close();

    }
}

流程图

请添加图片描述

2.7 借助数组复制文件

代码

public class Demo {
 public static void main(String[] args) throws IOException {
     // 借助一个数组,复制文件
     FileInputStream fis = new FileInputStream("day10-code\\file\\a.avi");
     FileOutputStream fos = new FileOutputStream("day10-code\\copy\\a.avi");

     // 借助一个数组   一次读写多个字节;
     byte[] bytes = new byte[1024];

     int len;// 这一次读了多少个字节
     while ((len = fis.read(bytes)) != -1){
         fos.write(bytes,0,len); // 这一次读了多少个字节 就写多少个字节
     }

     fis.close();
     fos.close();
 }
}

原理

  • 一次读写多个字节
    请添加图片描述

2.8 字节缓冲流复制文件

代码

  • 字节缓冲输入流
    • BufferedInputStream in = new BufferedInputStream(字节输入流);
  • 字节缓冲输出流
    • BufferedOutputStream out = new BufferedOutputStream(字节输出流);
public class Demo1 {
    /*
        使用字节缓冲流操作文件的复制
     */
    public static void main(String[] args) {
        // 从哪里读
        // 写到哪里去
        try (
                FileInputStream fis = new FileInputStream("day11-code\\file\\a.avi");
                BufferedInputStream bis = new BufferedInputStream(fis); // 给一个文件字节输入流加速
              FileOutputStream fos = new FileOutputStream("day11-code\\copy\\a.avi");
              BufferedOutputStream bos = new BufferedOutputStream(fos)// 给一个文件字节输出流加速
        ) {
            // 循环读写 调用方法 使用缓冲流对象调用
            int b;
            while ((b = bis.read()) != -1){
                bos.write(b);
            }

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

原理

  • 字节缓冲输入流中有一个默认长度8192的字节数组
  • 字节缓冲输出流中有一个默认长度8192的字节数组
    请添加图片描述

2.9 字节缓冲流借助数组复制文件

代码

public class Demo2 {
    /*
        字节缓冲流+自定义的数组 实现文件的复制
     */
    public static void main(String[] args) {
        try (
                BufferedInputStream bis = new BufferedInputStream(new FileInputStream("day11-code\\file\\a.avi"));
                BufferedOutputStream  bos = new BufferedOutputStream(new FileOutputStream("day11-code\\copy\\a.avi"))
        ) {
            // 定义一个字节数组
            byte[] bytes = new byte[1024];
            int len; // 记录的是字节的个数
            while ((len = bis.read(bytes)) != -1){
                bos.write(bytes,0,len);
            }

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

原理

请添加图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值