【自学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、有规则,前后计算满足同样的条件
在上文遍历目录的程序中,规则是遍历到目录的时候,会继续遍历;遍历到文件的时候,则会输出。输出文件的动作就是这个程序的出口。
浙公网安备 33010602011771号