【自学java笔记#第三十四天#】JavaSE查漏补缺:字节流

今天刷到一道题,发现里面涉及到了很多IO流方面的代码。

而Java核心技术卷一这本书里并没有讲到这些东西,所以我跟着B站黑马程序员的视频对这一部分进行了学习。

视频链接:https://www.bilibili.com/video/BV18J411W7cE?p=290

一、File类和字节流知识点总结

 

 

 二、输入/输出几种方式效率的比较

代码如下:

package io;
/*
 * 案例:复制视频
 */

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class IoDemo1 {
    public static void main(String[] args) throws IOException{
        //记录开始时间
        long startTime=System.currentTimeMillis();
        
        //method1();
        //method2();
        //method3();
        method4();
        
        //记录结束时间
        long endTime=System.currentTimeMillis();
        System.out.println("共耗时:"+(endTime-startTime)+"毫秒");
        }
    
    //基本字节流一次读写一个字节
    public static void method1() throws IOException {
        FileInputStream fis=new FileInputStream("D:\\1.mp4");
        FileOutputStream fos=new FileOutputStream("src\\1.mp4");
        
        int by=0;
        while((by=fis.read())!=-1) {
            fos.write(by);
        }
        fos.close();
        fis.close();
    }
    
    //基本字节流一次读写一个字节数组
    public static void method2() throws IOException {
        FileInputStream fis=new FileInputStream("D:\\1.mp4");
        FileOutputStream fos=new FileOutputStream("src\\1.mp4");
        
        byte[] bys=new byte[1024];
        int len;
        while((len=fis.read(bys))!=1) {
            fos.write(len);
        }
        fos.close();
        fis.close();
        }
    
    //字节缓冲流一次读写一个字节:共耗时:558毫秒
    public static void method3() throws IOException {
        BufferedInputStream bis=new BufferedInputStream(new FileInputStream("D:\\1.mp4"));
        BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream("src\\1.mp4"));
        int by;
        while((by=bis.read())!=-1) {
            bos.write(by);
        }
        bos.close();
        bis.close();
    }
    
    //字节缓冲流一次读写一个数组:共耗时:45毫秒
    public static void method4() throws IOException {
        BufferedInputStream bis=new BufferedInputStream(new FileInputStream("D:\\1.mp4"));
        BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream("src\\1.mp4"));
        byte[] bys=new byte[1024];
        int len;
        while((len=bis.read(bys))!=-1) {
            bos.write(len);
        }
        bos.close();
        bis.close();
    }
}

我的电脑只能跑出来第三个第四种方式,前两种都是跑半天没一点反应。

三、利用递归方式来遍历文件目录

package file;

import java.io.File;

/*
 * 需求:给定一个路径(D:\\itcase)。
 * 请通过递归完成遍历该目录下的所有内容,并把所有文件的绝对路径输出在控制台。
 * 思路:
 * 1、根据给定的路径创建一个File对象
 * 2、定义一个方法,用于获取给定目录下的所有内容,参数为第一步创建的对象
 * 3、获取给定的File目录下所有的文件或目录的File数组
 * 4、遍历该File数组,得到每一个File对象
 * 5、判断该File对象是否是目录:是:递归调用,不是:获取绝对路径输出在控制台
 * 6、调用方法
 */
public class DiguiDemo1 {
    public static void main(String[] args) {
        //1、根据给定的路径创建一个File对象
        File srcfile=new File("D:\\itcase");
        //调用方法
        getAllFilePath(srcfile);
    }
    
    //2、定义一个方法,用于获取给定目录下的所有内容,参数为第一步创建的对象
    public static void getAllFilePath(File srcfile) {
        //3、获取给定的File目录下所有的文件或目录的File数组
        File[] fileArray=srcfile.listFiles();
        //4、遍历该File数组,得到每一个File对象
        if(fileArray!=null) {
            for(File file:fileArray) {
                //判断该File对象是否是目录
                if(file.isDirectory()) {
                    //是:递归调用
                    getAllFilePath(file);
                }
                else {
                    //不是:获取绝对路径输出在控制台
                    System.out.println(file.getAbsolutePath());
                }
            }
        }
    }
}

一个程序要想使用递归算法,必须要满足两个条件:

1、有出口,否则会造成内存溢出

2、有规则,前后计算满足同样的条件

在上文遍历目录的程序中,规则是遍历到目录的时候,会继续遍历;遍历到文件的时候,则会输出。输出文件的动作就是这个程序的出口。

posted @ 2020-04-16 21:04  一只奶鹿  阅读(151)  评论(0)    收藏  举报