重踏学习Java路上_Day20(递归,IO流)

1:递归(理解)


    (1)方法定义中调用方法本身的现象
        举例:老和尚给小和尚讲故事,我们学编程
    (2)递归的注意事项;
        A:要有出口,否则就是死递归
        B:次数不能过多,否则内存溢出
        C:构造方法不能递归使用
    (3)递归的案例:
        A:递归求阶乘
        B:兔子问题
        C:递归输出指定目录下所有指定后缀名的文件绝对路径
        D:递归删除带内容的目录(小心使用)

2:IO流(掌握)


    (1)IO用于在设备间进行数据传输的操作    
    (2)分类:
        A:流向
            输入流    读取数据
            输出流    写出数据
        B:数据类型
            字节流    
                    字节输入流
                    字节输出流
            字符流
                    字符输入流
                    字符输出流
        注意:
            a:如果我们没有明确说明按照什么分,默认按照数据类型分。
            b:除非文件用windows自带的记事本打开我们能够读懂,才采用字符流,否则建议使用字节流。
    (3)FileOutputStream写出数据
        A:操作步骤
            a:创建字节输出流对象
            b:调用write()方法
            c:释放资源
            
        B:代码体现:
            FileOutputStream fos = new FileOutputStream("fos.txt");
            
            fos.write("hello".getBytes());
            
            fos.close();
            
        C:要注意的问题?
            a:创建字节输出流对象做了几件事情?

             * A:调用系统功能去创建文件(若文件不存在就会去创建文件,而File类仅仅只是路径的抽象实例)
             * B:创建fos对象
             * C:把fos对象指向这个文件
            b:为什么要close()?

         * A:让流对象变成垃圾,这样就可以被垃圾回收器回收了
             * B:通知系统去释放跟该文件相关的资源
            c:如何实现数据的换行?

         刚才我们看到了有写文本文件打开是可以的,通过windows自带的那个不行,为什么呢?
         因为不同的系统针对不同的换行符号识别是不一样的?
         windows:\r\n
         linux:\n
         Mac:\r
         而一些常见的个高级记事本,是可以识别任意换行符号的。
            d:如何实现数据的追加写入?

        用构造方法带第二个参数是true的情况即可:public FileOutputStream(File file, boolean append)
    (4)FileInputStream读取数据
        A:操作步骤
            a:创建字节输入流对象
            b:调用read()方法
            c:释放资源
            
        B:代码体现:
            FileInputStream fis = new FileInputStream("fos.txt");
            
            //方式1
            int by = 0;
            while((by=fis.read())!=-1) {
                System.out.print((char)by);
            }
            
            //方式2
            byte[] bys = new byte[1024];
            int len = 0;
            while((len=fis.read(bys))!=-1) {
                System.out.print(new String(bys,0,len));
            }
            
            fis.close();
    (5)案例:2种实现
        A:复制文本文件
        B:复制图片
        C:复制视频
    (6)字节缓冲区流
        A:BufferedOutputStream
        B:BufferedInputStream
    (7)案例:4种实现
        A:复制文本文件
        B:复制图片
        C:复制视频
        
3:自学字符流
    IO流分类
        字节流:
            InputStream
                FileInputStream
                BufferedInputStream
            OutputStream
                FileOutputStream
                BufferedOutputStream
        
        字符流:
            Reader
                FileReader
                BufferedReader
            Writer
                FileWriter
                BufferedWriter

标准的四种字节输入输出流写法:

public class Demo01 {

public static void main(String[] args) {
        Date start = new Date();
        //method01("01.avi", "123.avi");//时间太长,受不了了
        //method02("01.avi", "123.avi");//60毫秒
        //method03("01.avi", "123.avi");//花费:543毫秒
        method04("01.avi", "123.avi");//花费:24毫秒
        Date end = new Date();
        long time = end.getTime()-start.getTime();
        System.out.println("花费:"+time+"毫秒");
    }

// 字节流输入输出:单一字节
    public static void method01(String inputfile, String outputfile) {
        FileInputStream fis = null;
        FileOutputStream fos = null;
        try {
            fis = new FileInputStream(inputfile);
            fos = new FileOutputStream(outputfile);
            int by = 0;
            while ((by = fis.read()) != -1) {
                fos.write(by);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (fis != null) {
                try {
                    fis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (fos != null) {
                try {
                    fos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

// 字节流输入输出:字节数组
    public static void method02(String inputfile, String outputfile) {
        FileInputStream fis = null;
        FileOutputStream fos = null;
        try {
            fis = new FileInputStream(inputfile);
            fos = new FileOutputStream(outputfile);
            byte[] array = new byte[1024];
            int len = 0;
            while ((len = fis.read(array, 0, array.length)) != -1) {
                fos.write(array, 0, len);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (fis != null) {
                try {
                    fis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (fos != null) {
                try {
                    fos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

// 字节流输入输出:高效单一字节
    public static void method03(String inputfile, String outputfile) {
        BufferedInputStream bis = null;
        BufferedOutputStream bos = null;
        try {
            bis = new BufferedInputStream(new FileInputStream(inputfile));
            bos = new BufferedOutputStream(new FileOutputStream(outputfile));
            int by = 0;
            while ((by = bis.read()) != -1) {
                bos.write(by);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (bis != null) {
                try {
                    bis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (bos != null) {
                try {
                    bos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

// 字节流输入输出:高效字节数组
    public static void method04(String inputfile, String outputfile) {
        BufferedInputStream bis = null;
        BufferedOutputStream bos = null;
        try {
            bis = new BufferedInputStream(new FileInputStream(inputfile));
            bos = new BufferedOutputStream(new FileOutputStream(outputfile));
            byte[] array = new byte[1024];
            int len = 0;
            while ((len = bis.read(array, 0, array.length)) != -1) {
                bos.write(array, 0, len);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (bis != null) {
                try {
                    bis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (bos != null) {
                try {
                    bos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

时间: 2024-12-17 03:00:36

重踏学习Java路上_Day20(递归,IO流)的相关文章

重踏学习Java路上_Day21(字符流,io小结,案例)

1:字符流(掌握)    (1)字节流操作中文数据不是特别的方便,所以就出现了转换流.       转换流的作用就是把字节流转换字符流来使用.    (2)转换流其实是一个字符流        字符流 = 字节流 + 编码表    (3)编码表        A:就是由字符和对应的数值组成的一张表        B:常见的编码表            ASCII            ISO-8859-1            GB2312            GBK            G

重踏学习Java路上_Day19(异常,File)

1:异常(理解) 异常的图解:     (1)异常就是Java程序在运行过程中出现的错误.    (2)异常的体系        Throwable            |--Error    严重问题,我们不处理.这种问题一般都是很严重的,比如说内存溢出.            |--Exception                |--RuntimeException  运行期发生问题:    这种问题我们也不处理,因为是你的问题,而且这个问题出现肯定是我们的代码不够严谨,需要修正代码的

重踏学习Java路上_Day26(网络编程)

1:网络编程(理解)    (1)网络编程:用Java语言实现计算机间数据的信息传递和资源共享    (2)网络编程模型    (3)网络编程的三要素        A:IP地址            a:点分十进制            b:IP地址的组成            c:IP地址的分类            d:dos命令            e:InetAddress        B:端口            是应用程序的标识.范围:0-65535.其中0-1024不建议使

重踏学习Java路上_Day15(对象数组,集合类,列表)

1:对象数组(掌握)    (1)数组既可以存储基本数据类型,也可以存储引用类型.它存储引用类型的时候的数组就叫对象数组.    (2)案例:        用数组存储5个学生对象,并遍历数组. public class Student {    // 成员变量    private String name;    private int age; // 构造方法    public Student() {        super();    } public Student(String n

重踏学习Java路上_Day27(反射,模式设计,jdk新特性)

1:反射(理解) (1)类的加载及类加载器 (2)反射: 通过字节码文件对象,去使用成员变量,构造方法,成员方法 (3)反射的使用 A:通过反射获取构造方法并使用 B:通过反射获取成员变量并使用 C:通过反射获取成员方法并使用 (4)反射案例 A:通过反射运行配置文件的内容 B:通过反射越过泛型检查 C:通过反射给任意的一个对象的任意的属性赋值为指定的值 (5)动态代理 2:设计模式 (1)装饰设计模式 BufferedReader br = new BufferedReader(new Inp

重踏学习Java路上_Day13(StringBuffer,Array与数组,Integer,Character)

1:StringBuffer(掌握)    (1)用字符串做拼接,比较耗时并且也耗内存,而这种拼接操作又是比较常见的,为了解决这个问题,Java就提供了       一个字符串缓冲区类.StringBuffer供我们使用.    (2)StringBuffer的构造方法        A:StringBuffer()        B:StringBuffer(int size)        C:StringBuffer(String str)    (3)StringBuffer的常见功能(

重踏学习Java路上_Day18(Map,Collections)

1:Map(掌握) Map接口概述 将键映射到值的对象 一个映射不能包含重复的键 每个键最多只能映射到一个值 Map接口和Collection接口的不同 Map是双列的,Collection是单列的 Map的键唯一,Collection的子体系Set是唯一的 Map集合的数据结构值针对键有效,跟值无关   Collection集合的数据结构是针对元素有效    (3)Map接口功能概述(自己补齐)        A:添加功能        B:删除功能        C:判断功能        

重踏学习Java路上_Day14(正则表达式,Math,Random,System,BigInteger,BigDecimal,Date,Calendar)

1:正则表达式(理解)    (1)就是符合一定规则的字符串    (2)常见规则        A:字符            x 字符 x.举例:'a'表示字符a            \\ 反斜线字符.            \n 新行(换行)符 ('\u000A')             \r 回车符 ('\u000D')                    B:字符类            [abc] a.b 或 c(简单类)             [^abc] 任何字符,除了

重踏学习Java路上_Day24(多线程锁,线程组,设计模式)

1:多线程(理解)     (1)JDK5以后的针对线程的锁定操作和释放操作        Lock锁    (2)死锁问题的描述和代码体现    (3)生产者和消费者多线程体现(线程间通信问题)         以学生作为资源来实现的                资源类:Student        设置数据类:SetThread(生产者)        获取数据类:GetThread(消费者)        测试类:StudentDemo                代码: