(二十五)基础系列 io流

来源:互联网 发布:淘宝网打不开商品强细 编辑:程序博客网 时间:2024/06/08 05:57

一、异常

01异常的概述

* A: 异常的概述    * a:什么是异常        * Java代码在运行时期发生的问题就是异常。    * b:异常类        * 在Java中,把异常信息封装成了一个类。        * 当出现了问题时,就会创建异常类对象并抛出异常相关的信息(如异常出现的位置、原因等)。    * c:我们见过的异常:数组角标越界异常ArrayIndexOutOfBoundsException,空指针异常NullPointerException

02异常的继续体系和错误的区别

* A: 异常的继承体系    Throwable: 它是所有错误与异常的超类(祖宗类)        |- Error 错误        |- Exception 编译期异常,进行编译JAVA程序时出现的问题            |- RuntimeException 运行期异常, JAVA程序运行过程中出现的问题* B:异常与错误的区别    * a:异常        * 指程序在编译、运行期间发生了某种异常(XxxException),我们可以对异常进行具体的处理。        * 若不处理异常,程序将会结束运行。        * 案例演示:            public static void main(String[] args) {                int[] arr = new int[3];                System.out.println(arr[0]);                System.out.println(arr[3]);                // 该句运行时发生了数组索引越界异常ArrayIndexOutOfBoundsException,                // 由于没有处理异常,导致程序无法继续执行,程序结束。                System.out.println("over"); // 由于上面代码发生了异常,此句代码不会执行            }    * b:错误        * 指程序在运行期间发生了某种错误(XxxError),Error错误通常没有具体的处理方式,程序将会结束运行。        * Error错误的发生往往都是系统级别的问题,都是jvm所在系统发生的,并反馈给jvm的。        * 我们无法针对处理,只能修正代码。        * 案例演示:            public static void main(String[] args) {                int[] arr = new int[1024*1024*100];                //该句运行时发生了内存溢出错误OutOfMemoryError,开辟了过大的数组空间,                //导致JVM在分配数组空间时超出了JVM内存空间,直接发生错误。            }

03异常对象的产生原因和处理方式

* A: 异常对象的产生原因    * 案例代码:       * 工具类        class ArrayTools{            //对给定的数组通过给定的角标获取元素。            public static int getElement(int[] arr,int index)   {                int element = arr[index];                return element;            }        }        * 测试类        class ExceptionDemo2 {            public static void main(String[] args)  {                int[] arr = {34,12,67};                int num = ArrayTools.getElement(arr,4)                System.out.println("num="+num);                System.out.println("over");            }        }    * 原因分析:        * a: 由于没找到4索引,导致运行时发生了异常。这个异常JVM认识:ArrayIndexOutOfBoundsException。            这个异常Java本身有描述:异常的名称、异常的内容、异常的产生位置。            java将这些信息直接封装到异常对象中。new ArrayIndexOutOfBoundsException(4);        * b:throw new ArrayIndexOutOfBoundsException(4);产生异常对象。JVM将产生的异常抛给调用者main()方法。        * c:main()方法接收到了数组索引越界异常对象。            由于main()方法并没有进行处理异常,main()方法就会继续把异常抛给调用者JVM。            当JVM收到异常后,将异常对象中的名称、异常内容、位置都显示在就控制台上。同时让程序立刻终止。* B:异常的处理方式    * a:JVM的默认处理方式        * 把异常的名称,原因,位置等信息输出在控制台,同时会结束程序。        * 一旦有异常发生,其后来的代码不能继续执行。    * b:解决程序中异常的手动方式        * a):编写处理代码 try...catch...finally        * b):抛出 throws

04方法内部抛出对象throw关键字

在java中,提供了一个throw关键字,它用来抛出一个指定的异常对象。* A: 什么时候使用throw关键字?    * 当调用方法使用接受到的参数时,首先需要先对参数数据进行合法的判断,      数据若不合法,就应该告诉调用者,传递合法的数据进来。      这时需要使用抛出异常的方式来告诉调用者。* B: 使用throw关键字具体操作    * a: 创建一个异常对象。封装一些提示信息(信息可以自己编写)。    * b: 通过关键字throw将这个异常对象告知给调用者。throw 异常对象;    throw 用在方法内,用来抛出一个异常对象,将这个异常对象传递到调用者处,并结束当前方法的执行。* C: throw关键字使用格式    * throw new 异常类名(参数);    * 例如:        throw new NullPointerException("要访问的arr数组不存在");        throw new ArrayIndexOutOfBoundsException("该索引在数组中不存在,已超出范围");* D:案例演示    * throw的使用

05方法声明异常关键字throws

* A: 声明    * 将问题标识出来,报告给调用者。如果方法内通过throw抛出了编译时异常,而没有捕获处理(稍后讲解该方式),那么必须通过throws进行声明,让调用者去处理。* B: 声明异常格式    * 修饰符 返回值类型 方法名(参数) throws 异常类名1,异常类名2… {   }* C:注意事项:    * throws用于进行异常类的声明,若该方法可能有多种异常情况产生,那么在throws后面可以写多个异常类,用逗号隔开。* D:代码演示:    * 多个异常的处理

==============================第二节课开始====================================

06try...catch异常处理

* A: 捕获    * Java中对异常有针对性的语句进行捕获,可以对出现的异常进行指定方式的处理* B: 捕获异常格式    try {        //需要被检测的语句。    }    catch(异常类 变量) { //参数。        //异常的处理语句。    }    finally {        //一定会被执行的语句。    }* C: 格式说明    * a: try        * 该代码块中编写可能产生异常的代码。    * b: catch        * 用来进行某种异常的捕获,实现对捕获到的异常进行处理。    * c: finally:        * 有一些特定的代码无论异常是否发生,都需要执行。        * 另外,因为异常会引发程序跳转,导致有些语句执行不到。        * 而finally就是解决这个问题的,在finally代码块中存放的代码都是一定会被执行的。    * d:try...catch...处理掉异常后,程序可以继续执行* D:案例演示    * 捕获异常格式

07多catch处理

* A:一个try 多个catch组合     * 对代码进行异常检测,并对检测的异常传递给catch处理。对每种异常信息进行不同的捕获处理。* B:多catch处理的格式    void show(){ //不用throws         try{            throw new Exception();//产生异常,直接捕获处理        }catch(XxxException e){            //处理方式          }catch(YyyException e){            //处理方式          }catch(ZzzException e){            //处理方式          }    }    注意事项:在捕获异常处理中,变量也是有作用域的,如可以定义多个catch中异常变量名为e。

08多catch处理细节

* A:细节:多个catch小括号中,写的是异常类的类名,有没有顺序的概念?    * 有顺序关系。* B:平级异常:    * 抛出的异常类之间,没有继承关系,没有顺序        NullPointerException extends RuntimeException        NoSuchElementException extends RuntimeException        ArrayIndexOutOfBoundsException extends IndexOutOfBoundsException extends RuntimeException* C:上下级关系的异常    * 越高级的父类,越写在下面        NullPointerException extends RuntimeException extends Exception

09finally代码块

* A: finally的特点    * 被finally控制的语句体一定会执行* B:finally的作用    * finally,无论程序是否有异常出现,程序必须执行释放资源在      如:IO流操作和数据库操作中会见到

10调用抛出异常方法try和throws处理方式

* A: 在实际开发中使用哪种异常处理方式呢?    * 能自己处理的尽量自己处理。(建议用try...catch)

==============================第三节课开始====================================

11运行时期异常的特点

* A: 运行时期异常的概述:     * RuntimeException和他的所有子类异常,都属于运行时期异常。        NullPointerException,ArrayIndexOutOfBoundsException等都属于运行时期异常.* B:运行时期异常的特点    * a:方法中抛出运行时期异常,方法定义中无需throws声明,调用者也无需处理此异常。    * b:运行时期异常一旦发生,需要程序人员修改源代码。    设计原因:        运行异常,不能发生,但是如果发生了,程序人员停止程序修改源代码        运行异常: 一旦发生,不要处理,请你修改源代码,运行异常一旦发生,后面的代码没有执行的意义

12运行异常的案例

* A: 计算圆的面积案例    定义方法,计算圆形的面积    传递参数0,或者负数,计算的时候没有问题    但是,违反了真实情况    参数小于=0, 停止程序,不要在计算了* B:数组索引越界案例    使用数组中不存在的索引    public class RuntimeExceptionDemo {        public static void main(String[] args) {                double d = getArea(1);                System.out.println(d);        }        /*         *  定义方法,计算圆形的面积         *  传递参数0,或者负数,计算的时候没有问题         *  但是,违反了真实情况         *  参数小于=0, 停止程序,不要在计算了         */        public static double getArea(double r){            if(r <= 0)                throw new RuntimeException("圆形不存在");            return r*r*Math.PI;        }        public static void function(){            int[] arr = {1,2,3};            //对数组的5索引进行判断,如果5索引大于100,请将5索引上的数据/2,否则除以3            //索引根本就没有            if(arr[5] > 100){                arr[5] = arr[5]/2;            }else{                arr[5] = arr[5]/3;            }    }

13方法重写时候异常的处理

* A:方法重写时候异常的处理    * a:子类覆盖父类方法时,如果父类的方法声明异常,子类只能声明父类异常或者该异常的子类,或者不声明。        例如:        class Fu {            public void method () throws RuntimeException {            }        }        class Zi extends Fu {            public void method() throws RuntimeException { }  //抛出父类一样的异常            //public void method() throws NullPointerException{ } //抛出父类子异常        }    * b:当父类方法声明多个异常时,子类覆盖时只能声明多个异常的子集。        例如:        class Fu {            public void method () throws NullPointerException, ClassCastException{            }        }        class Zi extends Fu {            public void method()throws NullPointerException, ClassCastException { }                     public void method() throws NullPointerException{ } //抛出父类异常中的一部分            public void method() throws ClassCastException { } //抛出父类异常中的一部分        }    * c:当被覆盖的方法没有异常声明时,子类覆盖时无法声明异常的。        例如:        class Fu {            public void method (){            }        }        class Zi extends Fu {            public void method() throws Exception { }//错误的方式        }* B:问题:父类中会存在下列这种情况,接口也有这种情况。            接口中没有声明异常,而实现的子类覆盖方法时发生了异常,怎么办?     回答:无法进行throws声明,只能catch的捕获。            万一问题处理不了呢?catch中继续throw抛出,但是只能将异常转换成RuntimeException子类抛出。

14Throwable类方法

* A: 常见方法    * a:getMessage()方法        返回该异常的详细信息字符串,即异常提示信息    * b:toString()方法        返回该异常的名称与详细信息字符串    * c:printStackTrace()方法        在控制台输出该异常的名称与详细信息字符串、异常出现的代码位置* B:案例演示    异常的常用方法代码演示        try {            Person p= null;            if (p==null) {                throw new NullPointerException(“出现空指针异常了,请检查对象是否为null”);            }        } catch (NullPointerException e) {            String message = e.getMesage();            System.out.println(message );             String result = e.toString();            System.out.println(result);             e.printStackTrace();         }

 A: 自定义异常的定义    * a:通过阅读源码,发现规律:        每个异常中都调用了父类的构造方法,把异常描述信息传递给了父类,让父类帮我们进行异常信息的封装。    * b:格式:        Class 异常名 extends Exception{ //或继承RuntimeException            public 异常名(){            }            public 异常名(String s){                 super(s);             }        }       * c:自定义异常继承Exception演示    * d:自定义异常继承RuntimeException演示* B:自定义异常的练习    在Person类的有参数构造方法中,进行年龄范围的判断,    若年龄为负数或大于200岁,则抛出NoAgeException异常,异常提示信息“年龄数值非法”。    要求:在测试类中,调用有参数构造方法,完成Person对象创建,并进行异常的处理。* C:关于构造方法抛出异常总结    构造函数到底抛出这个NoAgeException是继承Exception呢?还是继承RuntimeException呢?    * a:继承Exception,必须要throws声明,一声明就告知调用者进行捕获,一旦问题处理了调用者的程序会继续执行。    * b:继承RuntimeExcpetion,不需要throws声明的,这时调用是不需要编写捕获代码的,因为调用根本就不知道有问题。        一旦发生NoAgeException,调用者程序会停掉,并有jvm将信息显示到屏幕,让调用者看到问题,修正代码。
二、

01IO技术概述.avi(02:49)

* A:IO技术概述    * a: Output        * 把内存中的数据存储到持久化设备上这个动作称为输出(写)Output操作    * b: Input        * 把持久设备上的数据读取到内存中的这个动作称为输入(读)Input操作    * c: IO操作        * 把上面的这种输入和输出动作称为IO操作

02File类的概述和作用

* A:File类的概述和作用    * a: File的概念        * File类是文件和目录路径名的抽象表示形式        * Java中把文件或者目录(文件夹)都封装成File对象        * 我们要去操作硬盘上的文件,或者文件夹只要找到File这个类即可

03File类静态的成员变量

* A:File类静态的成员变量    * a: pathSeparator        * 与系统有关的路径分隔符,为了方便,它被表示为一个字符串    * b: separator        * 与系统有关的默认名称分隔符,为了方便,它被表示为一个字符串    * c: 案例代码        /*         *  java.io.File         *    将操作系统中的,文件,目录(文件夹),路径,封装成File对象         *    提供方法,操作系统中的内容         *    File与系统无关的类         *    文件 file         *    目录 directory         *    路径 path         */        public class FileDemo {            public static void main(String[] args) {                //File类静态成员变量                //与系统有关的路径分隔符                String separator = File.pathSeparator;                System.out.println(separator);// 是一个分号,目录的分割(window中环境变量配置各个路径用分号分割,表示一个完整的路径结束)  Linux中是冒号 :                //与系统有关的默认名称分隔符                separator = File.separator;                System.out.println(separator);// 向右 \  目录名称分割  Linux /             }        }

04File类构造方法_1

* A: File类构造方法_1    * a: File(String pathname)        * 通过将给定路径名字符串转换为一个File对象,之后可以使用File中的方法        * windows中的路径或文件名不区分大小写    * d: 案例代码        public class FileDemo1 {            public static void main(String[] args) {                function();            }            /*             *  File(String pathname)             *  传递路径名: 可以写到文件夹,可以写到一个文件             *  c:\\abc   c:\\abc\\Demo.java             *  将路径封装File类型对象             */            public static void function(){                File file = new File("d:\\eclipse");                System.out.println(file);            }        }

05相对路径和绝对路径

* A: 相对路径和绝对路径    * a: 绝对路径        * 绝对路径是一个固定的路径,从盘符开始    * b: 相对路径        * 相对路径相对于某个位置,在eclipse下是指当前项目下      * c: 路径            绝对路径                在系统中具有唯一性                c:\\windows\\system32            相对路径                表示路径之间的关系                D:\\develop\\Java\\jdk1.7.0_72\\bin                D:\\develop\\Java\\jre7                路径之间关系                    Java 父目录是D:\\develop                    Java 子目录是:jdk1.7.0_72                父路径是 唯一性                子目录是可以多个

06File类的构造方法_2

* A: File类的构造方法_2    * a:File(String parent, String child)         * 根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 对象    * b: File(File parent, String child)    * c: 案例代码    public class FileDemo1 {        public static void main(String[] args) {            function_2();        }        /*         *  File(File parent,String child)         *  传递路径,传递File类型父路径,字符串子路径         *  好处: 父路径是File类型,父路径可以直接调用File类方法         */        public static void function_2(){            File parent = new File("d:");            File file = new File(parent,"eclipse");            System.out.println(file);        }        /*         *  File(String parent,String child)         *  传递路径,传递字符串父路径,字符串子路径         *  好处: 单独操作父路径和子路径         */        public static void function_1(){            File file = new File("d:","eclipse");            System.out.println(file);        }    }

07File类创建文件功能

* A: File类创建文件功能    * a: public boolean createNewFile()        * 创建文件 如果存在这样的文件,就不创建了    * b: 案例代码        public class FileDemo2 {            public static void main(String[] args)throws IOException {                function();            }                                   /*             *  File创建文件的功能             *  boolean createNewFile()             *  创建的文件路径和文件名,在File构造方法中给出             *  文件已经存在了,不在创建             */            public static void function()throws IOException{                File file = new File("c:\\a.txt");                boolean b = file.createNewFile();                System.out.println(b);            }        }

08File类创建目录功能

* A: File类创建目录功能    * a: 创建目录        * public boolean mkdir():创建文件夹 如果存在这样的文件夹,就不创建了        * public boolean mkdirs():创建文件夹,如果父文件夹不存在,会帮你创建出来    * b: 案例代码        public class FileDemo2 {            public static void main(String[] args)throws IOException {                function_1();            }            /*             *  File创建文件夹功能             *  boolean mkdirs() 创建多层文件夹             *  创建的路径也在File构造方法中给出             *  文件夹已经存在了,不在创建             */            public static void function_1(){                File file = new File("c:\\abc");                boolean b = file.mkdirs();                System.out.println(b);            }                       }

09File类删除功能

* A: File类删除功能    * a: 删除功能        * public boolean delete():删除文件或者文件夹* B: 案例代码    public class FileDemo2 {        public static void main(String[] args)throws IOException {            function_2();        }        /*         *  File类的删除功能         *  boolean delete()         *  删除的文件或者是文件夹,在File构造方法中给出         *  删除成功返回true,删除失败返回false         *  删除方法,不走回收站,直接从硬盘中删除         *  删除有风险,运行需谨慎         */        public static void function_2(){            File file = new File("c:\\a.txt");            boolean b = file.delete();            System.out.println(b);        }               }

10File类获取功能

* A:File类获取功能    * a: 方法介绍        * String getName(): 返回路径中表示的文件或者文件夹名            * 获取路径中的最后部分的名字        * long length(): 返回路径中表示的文件的字节数        * String getAbsolutePath(): 获取绝对路径,返回String对象        * File   getAbsoluteFile() : 获取绝对路径,返回File对象            * eclipse环境中,写一个相对路径,绝对位置工程根目录        * String getParent(): 获取父路径,返回String对象        * File getParentFile(): 获取父路径,返回File对象    * b: 案例代码        public class FileDemo3 {            public static void main(String[] args) {                function_3();            }            /*             * File类的获取功能             * String getParent() 返回String对象             * File getParentFile()返回File对象             * 获取父路径             */            public static void function_3(){                File file = new File("d:\\eclipse\\eclipse.exe");                File parent = file.getParentFile();                System.out.println(parent);            }            /*             * File类获取功能             * String getAbsolutePath() 返回String对象             * File   getAbsoluteFile() 返回File对象             * 获取绝对路径             * eclipse环境中,写的是一个相对路径,绝对位置工程根目录             */            public static void function_2(){                File file = new File("src");                File absolute = file.getAbsoluteFile();                System.out.println(absolute);            }            /*             * File类获取功能             * long length()             * 返回路径中表示的文件的字节数             */            public static void function_1(){                File file = new File("d:\\eclipse\\eclipse.exe");                long length = file.length();                System.out.println(length);            }            /*             *  File类的获取功能             *  String getName()             *  返回路径中表示的文件或者文件夹名             *  获取路径中的最后部分的名字             */            public static void function(){                File file = new File("d:\\eclipse\\eclipse.exe");                String name = file.getName();                System.out.println(name);                /*String path = file.getPath();                System.out.println(path);*/        //      System.out.println(file);            }        }

11File类判断功能

* A: File类判断功能    * a: 方法介绍        * boolean exists(): 判断File构造方法中封装路径是否存在            * 存在返回true,不存在返回false        * boolean isDirectory(): 判断File构造方法中封装的路径是不是文件夹            * 如果是文件夹,返回true,不是文件返回false        * boolean isFile(): 判断File构造方法中封装的路径是不是文件            * 如果是文件,返回true,不是文件返回false    * b: 案例代码        public class FileDemo4 {            public static void main(String[] args) {                function_1();            }            /*             *  File判断功能             *  boolean isDirectory()             *  判断File构造方法中封装的路径是不是文件夹             *  如果是文件夹,返回true,不是文件返回false             *               *  boolean isFile()             *  判断File构造方法中封装的路径是不是文件             */            public static void function_1(){                File file = new File("d:\\eclipse\\eclipse.exe");                if(file.exists()){                    boolean b = file.isDirectory();                    System.out.println(b);                }            }            /*             *  File判断功能             *  boolean exists()             *  判断File构造方法中封装路径是否存在             *  存在返回true,不存在返回false             */            public static void function(){                File file = new File("src");                boolean b = file.exists();                System.out.println(b);            }        }

12File类list获取功能

* A: File类list获取功能    * a: 方法介绍        * String[] list():获取到File构造方法中封装的路径中的文件和文件夹名 (遍历一个目录)            * 返回只有名字        * File[] listFiles():获取到,File构造方法中封装的路径中的文件和文件夹名 (遍历一个目录)            * 返回的是目录或者文件的全路径        * static File[] listRoots(): 列出可用的文件系统根     * b: 案例代码        public class FileDemo {            public static void main(String[] args) {                function_2();            }            public static void function_2(){                //获取系统中的所有根目录                File[] fileArr = File.listRoots();                for(File f : fileArr){                    System.out.println(f);                }            }            /*             *  File类的获取功能             *  File[] listFiles()             *  获取到,File构造方法中封装的路径中的文件和文件夹名 (遍历一个目录)             *  返回的是目录或者文件的全路径             */            public static void function_1(){                File file = new File("d:\\eclipse");                File[] fileArr = file.listFiles();                for(File f : fileArr){                    System.out.println(f);                }            }            /*             *  File类的获取功能             *  String[] list()             *  获取到,File构造方法中封装的路径中的文件和文件夹名 (遍历一个目录)             *  返回只有名字             */            public static void function(){                File file = new File("c:");                String[] strArr = file.list();                System.out.println(strArr.length);                for(String str : strArr){                    System.out.println(str);                }            }        }

13文件过滤器

* A: 文件过滤器    * a: 作用        * 过滤一个目录下的指定扩展名的文件,或者包含某些关键字的文件夹    * b: 方法介绍        * public String[] list(FilenameFilter filter)        * public File[] listFiles(FileFilter filter)    * C: 案例代码           /*         *  自定义过滤器         *  实现FileFilter接口,重写抽象方法         */        public class MyFilter implements FileFilter{            public boolean accept(File pathname)  {                /*                 * pathname 接受到的也是文件的全路径                 * c:\\demo\\1.txt                 * 对路径进行判断,如果是java文件,返回true,不是java文件,返回false                 * 文件的后缀结尾是.java                 */                //String name = pathname.getName();                return pathname.getName().endsWith(".java");            }        }        /*         *  File类的获取,文件获取过滤器         *  遍历目录的时候,可以根据需要,只获取满足条件的文件         *  遍历目录方法 listFiles()重载形式         *  listFiles(FileFilter filter)接口类型         *  传递FileFilter接口的实现类         *  自定义FileFilter接口实现类,重写抽象方法,         *  接口实现类对象传递到遍历方法listFiles         */        public class FileDemo1 {            public static void main(String[] args) {                File file = new File("c:\\demo");                File[] fileArr = file.listFiles(new MyFilter());                for(File f : fileArr){                    System.out.println(f);                }            }        }

14文件过滤器_原理分析

* A:文件过滤器_原理分析    * listFiles()遍历目录的同时,获取到了文件名全路径,调用过滤器的方法accept,将获取到的路径传递给accept方法的参数pathname    * accept方法接收了参数pathname,参数是listFiles传递来的    * 在accept方法中,进行判断,如果这个路径是Java文件,返回true,走着返回false    * 一旦方法返回了true    * listFiles将路径保存到File数组中

15递归遍历全目录

* A: 递归遍历全目录    * a: 案例代码        /*         *  对一个目录的下的所有内容,进行完全的遍历         *  编程技巧,方法的递归调用,自己调用自己         */        public class FileDemo {            public static void main(String[] args) {                File dir = new File("d:\\eclipse");                getAllDir(dir);            }            /*             *  定义方法,实现目录的全遍历             */            public static void getAllDir(File dir){                System.out.println(dir);                //调用方法listFiles()对目录,dir进行遍历                File[] fileArr = dir.listFiles();                for(File f : fileArr){                    //判断变量f表示的路径是不是文件夹                    if(f.isDirectory()){                        //是一个目录,就要去遍历这个目录                        //本方法,getAllDir,就是给个目录去遍历                        //继续调用getAllDir,传递他目录                        getAllDir(f);                    }else{                        System.out.println(f);                    }                }            }        }

16递归概念和注意事项

* A:递归概念和注意事项    * a: 递归概念        * 递归,指在当前方法内调用自己的这种现象        * 递归分为两种,直接递归和间接递归        * 直接递归称为方法自身调用自己。间接递归可以A方法调用B方法,B方法调用C方法,C方法调用A方法    * b: 注意事项        * 递归一定要有出口, 必须可以让程序停下        * 递归次数不能过多        * 构造方法,禁止递归

17递归求和计算

* A: 递归求和计算    * a: 题目分析        * 1+2+3+...+(n-1)+n:求1到n的和        * 总结规律:1到n的和等于1到(n-1)的和再加n        * getSum(n-1)+ n        * 递归出口:getSum(1) return 1;    * b: 案例代码           /*         *  方法的递归调用         *    方法自己调用自己         *  适合于,方法中运算的主体不变,但是运行的时候,参与运行的方法参数会变化         *  注意:         *     递归一定要有出口, 必须可以让程序停下         *     递归次数不能过多         *     构造方法,禁止递归         */        public class DiGuiDemo {            public static void main(String[] args) {                int sum = getSum(3);                System.out.println(sum);            }            /*             *  计算 1+2+3+100和 = 5050             *  计算规律:             *    n+(n-1)+(n-2)             *    100+(100-1)+(99-1)+...1             */            public static int getSum(int n){                if( n == 1)                    return 1;                return n + getSum(n-1);            }        }

18递归求阶乘

* A: 递归求和计算    * a: 题目分析        * 5!=5*4*3*2*1        *   =5*4!        * 4!=4*3!        * 3!=3*2!        * 2!=2*1!        * 1!=1        * n!=n*(n-1)!        * 递归出口:n*getJieCheng(n-1):  getJieCheng(1) return 1;    * b: 案例代码        /*         *  方法的递归调用         *    方法自己调用自己         *  适合于,方法中运算的主体不变,但是运行的时候,参与运行的方法参数会变化         *  注意:         *     递归一定要有出口, 必须可以让程序停下         *     递归次数不能过多         *     构造方法,禁止递归         */        public class DiGuiDemo {            public static void main(String[] args) {                                    System.out.println(getJieCheng(5));            }            /*              *  计算阶乘 5!             *   5*4*3*2*1             */            public static int getJieCheng(int n){                if ( n == 1)                    return 1;                return n * getJieCheng(n-1);            }                                       }

19递归计算斐波那契数列

* A: 递归计算斐波那契数列    * a:题目分析        * 1 1 2 3 5 8 13 21        * 从第三项开始,后面的每一项都等于前面两项的和,第一项和第二项的值为1,作为程序的出口    * b: 案例代码        /*         *  方法的递归调用         *    方法自己调用自己         *  适合于,方法中运算的主体不变,但是运行的时候,参与运行的方法参数会变化         *  注意:         *     递归一定要有出口, 必须可以让程序停下         *     递归次数不能过多         *     构造方法,禁止递归         */        public class DiGuiDemo {            public static void main(String[] args) {                                    System.out.println(getFBNQ(12));            }            /*             *  方法递归,计算斐波那契数列             *               */            public static int getFBNQ(int month){                if( month == 1)                    return 1;                if( month == 2)                    return 1;                return getFBNQ(month-1)+getFBNQ(month-2);            }        }

20遍历目录下的所有java文件

* A: 遍历目录下的所有java文件    * a: 案例代码        public class MyJavaFilter implements FileFilter {            public boolean accept(File pathname) {                //判断获取的是目录,直接返回true                if(pathname.isDirectory())                    return true;                return pathname.getName().toLowerCase().endsWith(".java");            }        }        /*         *  遍历目录,获取目录下的所有.java文件         *  遍历多级目录,方法递归实现         *  遍历的过程中,使用过滤器         */        public class FileDemo1 {            public static void main(String[] args) {                getAllJava(new File("c:\\demo"));        //      new File("c:\\demo").delete();            }            /*             * 定义方法,实现遍历指定目录             * 获取目录中所有的.java文件             */            public static void getAllJava(File dir){                //调用File对象方法listFiles()获取,加入过滤器                File[] fileArr = dir.listFiles(new MyJavaFilter());                for(File f : fileArr){                    //对f路径,判断是不是文件夹                    if(f.isDirectory()){                        //递归进入文件夹遍历                        getAllJava(f);                    }else{                        System.out.println(f);                    }                }            }        }

01输入和输出

* A:输入和输出    * a: 参照物        * 到底是输入还是输出,都是以Java程序为参照    * b: Output        * 把内存中的数据存储到持久化设备上这个动作称为输出(写)Output操作        * 程序到文件称为输出    * c: Input        * 把持久设备上的数据读取到内存中的这个动作称为输入(读)Input操作        * 文件到程序称为输入    * d: IO操作        * 把上面的这种输入和输出动作称为IO操作

02字节输出流OutputStream

* A: 字节输出流OutputStream    * a.概念        * IO流用来处理设备之间的数据传输        * Java对数据的操作是通过流的方式        * Java用于操作流的类都在IO包中        * 流按流向分为两种:输入流,输出流。        * 流按操作类型分为两种:            * 字节流 : 字节流可以操作任何数据,因为在计算机中任何数据都是以字节的形式存储的            * 字符流 : 字符流只能操作纯字符数据,比较方便。    * b.IO流常用父类        * 字节流的抽象父类:            * InputStream             * OutputStream        * 字符流的抽象父类:            * Reader             * Writer            * c.IO程序书写        * 使用前,导入IO包中的类        * 使用时,进行IO异常处理        * 使用后,释放资源    * d: 方法介绍        *  void close(): 关闭此输出流并释放与此流有关的所有系统资源。        *  void write(byte[] b): 将 b.length 个字节从指定的 byte 数组写入此输出流        *  void write(byte[] b, int off, int len) :将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此输出流。        * abstract  void write(int b) : 将指定的字节写入此输出流。

03字节输出流FileOutputStream写字节

* A: 字节输出流FileOutputStream写字节    * a: FileOutputStream        * 写入数据文件,学习父类方法,使用子类对象    * b: FileOutputStream构造方法        * 作用:绑定输出的输出目的        * FileOutputStream(File file)             * 创建一个向指定 File 对象表示的文件中写入数据的文件输出流。        * FileOutputStream(File file, boolean append)             * 创建一个向指定 File 对象表示的文件中写入数据的文件输出流,以追加的方式写入。        * FileOutputStream(String name)             * 创建一个向具有指定名称的文件中写入数据的输出文件流。        * FileOutputStream(String name, boolean append)             * 创建一个向具有指定 name 的文件中写入数据的输出文件流,以追加的方式写入。    * c: 流对象使用步骤        *  1. 创建流子类的对象,绑定数据目的        *  2. 调用流对象的方法write写        *  3. close释放资源    * d: 注意事项        * 流对象的构造方法,可以创建文件,如果文件存在,直接覆盖    * e: 案例代码        /*         *   FileOutputStream         *   写入数据文件,学习父类方法,使用子类对象         *            *   子类中的构造方法: 作用:绑定输出的输出目的         *     参数:         *       File    封装文件         *       String  字符串的文件名         *            *   流对象使用步骤         *     1. 创建流子类的对象,绑定数据目的         *     2. 调用流对象的方法write写         *     3. close释放资源         *              *    流对象的构造方法,可以创建文件,如果文件存在,直接覆盖         */        public class FileOutputStreamDemo {            public static void main(String[] args)throws IOException {                FileOutputStream fos = new FileOutputStream("c:\\a.txt");                //流对象的方法write写数据                //写1个字节                fos.write(97);                //关闭资源                fos.close();            }        }

04字节输出流FileOutputStream写字节数组

* A: 字节输出流FileOutputStream写字节数组    * a: 方法介绍        *  void write(byte[] b): 将 b.length 个字节从指定的 byte 数组写入此输出流        *  void write(byte[] b, int off, int len) :将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此输出流。    * b: 案例代码        /*         *   FileOutputStream         *   写入数据文件,学习父类方法,使用子类对象         *            *   子类中的构造方法: 作用:绑定输出的输出目的         *     参数:         *       File    封装文件         *       String  字符串的文件名         *            *   流对象使用步骤         *     1. 创建流子类的对象,绑定数据目的         *     2. 调用流对象的方法write写         *     3. close释放资源         *              *    流对象的构造方法,可以创建文件,如果文件存在,直接覆盖         */        public class FileOutputStreamDemo {            public static void main(String[] args)throws IOException {                FileOutputStream fos = new FileOutputStream("c:\\a.txt");                //流对象的方法write写数据                //写字节数组                byte[] bytes = {65,66,67,68};                fos.write(bytes);                //写字节数组的一部分,开始索引,写几个                fos.write(bytes, 1, 2);                //写入字节数组的简便方式                //写字符串                fos.write("hello".getBytes());                //关闭资源                fos.close();            }        }

05文件的续写和换行符号

* A: 文件的续写和换行符号    * a: 文件的续写        *  FileOutputStream构造方法, 的第二个参数中,加入true    * b: 换行符号        * 在文件中,写入换行,符号换行  \r\n        * \r\n 可以写在上一行的末尾, 也可以写在下一行的开头    * c: 案例代码            /*             *  FileOutputStream 文件的续写和换行问题             *  续写: FileOutputStream构造方法, 的第二个参数中,加入true             *  在文件中,写入换行,符号换行  \r\n             *  \r\n 可以写在上一行的末尾, 也可以写在下一行的开头             */            public class FileOutputStreamDemo1 {                public static void main(String[] args)throws IOException {                    File file = new File("c:\\b.txt");                    FileOutputStream fos = new FileOutputStream(file,true);                    fos.write("hello\r\n".getBytes());                    fos.write("world".getBytes());                    fos.close();                }            }

06IO中的异常处理

* A: IO中的异常处理    * a:IO流的异常处理        * try catch finally    * b: 细节        * 1. 保证流对象变量,作用域足够        * 2. catch里面,怎么处理异常            * 输出异常的信息,目的看到哪里出现了问题            * 停下程序,从新尝试        * 3. 如果流对象建立失败了,需要关闭资源吗            * new 对象的时候,失败了,没有占用系统资源            * 释放资源的时候,对流对象判断null            * 变量不是null,对象建立成功,需要关闭资源    * c: 案例代码        public class FileOutputStreamDemo3 {            public static void main(String[] args) {                //try 外面声明变量,try 里面建立对象                FileOutputStream fos = null;                try{                    fos = new FileOutputStream("s:\\a.txt");                    fos.write(100);                }catch(IOException ex){                    System.out.println(ex);                    throw new RuntimeException("文件写入失败,重试");                }finally{                    try{                        if(fos!=null)                          fos.close();                    }catch(IOException ex){                        throw new RuntimeException("关闭资源失败");                    }                }            }        }

07字节输入流InputStream

* A: 字节输入流InputStream    * a: 方法介绍        * abstract  int read() :            * 从输入流中读取数据的下一个字节。        * int read(byte[] b)              * 从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中。        * int read(byte[] b, int off, int len)             * 将输入流中最多 len 个数据字节读入 byte 数组。        * void close()             * 关闭此输入流并释放与该流关联的所有系统资源。    * b: 案例代码        /*         *   字节输入流         *     java.io.InputStream 所有字节输入流的超类         *   作用: 读取任意文件,每次只读取1个字节         *   读取的方法  read         *     int  read() 读取1个字节         *     int  read(byte[] b) 读取一定量的字节,存储到数组中         */        public class InputStreamDemo {        }

08字节输入流FileInputStream读取字节

* A: 字节输入流FileInputStream读取字节    * a: 方法介绍        * abstract  int read() :            * 从输入流中读取数据的下一个字节,返回-1表示文件结束        * int read(byte[] b)              * 从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中。            * 读入缓冲区的字节总数,如果因为已经到达文件末尾而没有更多的数据,则返回 -1。        * int read(byte[] b, int off, int len)             * 将输入流中最多 len 个数据字节读入 byte 数组。        * void close()             * 关闭此输入流并释放与该流关联的所有系统资源。    * b: 案例代码        /*         *  FileInputStream读取文件         *           *  构造方法: 为这个流对象绑定数据源         *           *    参数:          *      File 类型对象         *      String 对象         *   输入流读取文件的步骤         *     1. 创建字节输入流的子类对象         *     2. 调用读取方法read读取         *     3. 关闭资源         *              *     read()方法,         *       read()执行一次,就会自动读取下一个字节         *       返回值,返回的是读取到的字节, 读取到结尾返回-1         */        public class FileInputStreamDemo {            public static void main(String[] args) throws IOException{                FileInputStream fis = new FileInputStream("c:\\a.txt");                //读取一个字节,调用方法read 返回int                //使用循环方式,读取文件,  循环结束的条件  read()方法返回-1                int len = 0;//接受read方法的返回值                while( (len = fis.read()) != -1){                    System.out.print((char)len);                }                //关闭资源                fis.close();            }        }        /*         * int i = fis.read();                System.out.println(i);                i = fis.read();                System.out.println(i);                i = fis.read();                System.out.println(i);                i = fis.read();                System.out.println(i);         */

09字节输入流FileInputStream读取字节数组

* A: 字节输入流FileInputStream读取字节数组    * a: 方法介绍        * int read(byte[] b)              * 从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中。            * 读入缓冲区的字节总数,如果因为已经到达文件末尾而没有更多的数据,则返回 -1。        * int read(byte[] b, int off, int len)             * 将输入流中最多 len 个数据字节读入 byte 数组。    * b: 案例代码        /*         *  FileInputStream读取文件         *   读取方法  int read(byte[] b) 读取字节数组         *   数组作用: 缓冲的作用, 提高效率         *   read返回的int,表示什么含义 读取到多少个有效的字节数         */        public class FileInputStreamDemo1 {            public static void main(String[] args) throws IOException {                FileInputStream fis = new FileInputStream("c:\\a.txt");                // 创建字节数组                byte[] b = new byte[2];                int len = fis.read(b);                System.out.println(new String(b));// ab                System.out.println(len);// 2                len = fis.read(b);                System.out.println(new String(b));// cd                System.out.println(len);// 2                len = fis.read(b);                System.out.println(new String(b));// ed                System.out.println(len);// 1                len = fis.read(b);                System.out.println(new String(b));// ed                System.out.println(len);// -1                fis.close();            }        }

10字节输入流FileInputStream读取字节数组的实现原理

* A:字节输入流FileInputStream读取字节数组的实现原理    * a: 原理        * 参见day23_source文件夹中的"读取数组的原理.jpg"    * b: 案例代码        public class FileInputStreamDemo1 {            public static void main(String[] args) throws IOException {                FileInputStream fis = new FileInputStream("c:\\a.txt");                //创建字节数组                byte[] b = new byte[1024];                int len = 0 ;                while( (len = fis.read(b)) !=-1){                    System.out.print(new String(b,0,len));                }                fis.close();            }        }

11文件复制原理

* A: 文件复制原理    * a: 见day23_source/文件复制原理.jpg

12字节流复制文件读取单个字节

* A: 字节流复制文件读取单个字节    * a: 案例代码        /*         *  将数据源 c:\\a.txt         *  复制到 d:\\a.txt  数据目的         *  字节输入流,绑定数据源         *  字节输出流,绑定数据目的         *           *  输入,读取1个字节         *  输出,写1个字节         */        public class Copy {            public static void main(String[] args) {                //定义两个流的对象变量                FileInputStream fis = null;                FileOutputStream fos = null;                try{                    //建立两个流的对象,绑定数据源和数据目的                    fis = new FileInputStream("c:\\t.zip");                    fos = new FileOutputStream("d:\\t.zip");                    //字节输入流,读取1个字节,输出流写1个字节                    int len = 0 ;                    while((len = fis.read())!=-1){                        fos.write(len);                    }                }catch(IOException ex){                    System.out.println(ex);                    throw new RuntimeException("文件复制失败");                }finally{                    try{                        if(fos!=null)                            fos.close();                    }catch(IOException ex){                        throw new RuntimeException("释放资源失败");                    }finally{                        try{                            if(fis!=null)                                fis.close();                        }catch(IOException ex){                            throw new RuntimeException("释放资源失败");                        }                    }                }            }        }

13字节流复制文件读取字节数组

* A: 字节流复制文件读取字节数组    * a: 案例代码        /*         *  字节流复制文件         *   采用数组缓冲提高效率         *   字节数组         *   FileInputStream 读取字节数组         *   FileOutputStream 写字节数组         */        public class Copy_1 {            public static void main(String[] args) {                long s = System.currentTimeMillis();                FileInputStream fis = null;                FileOutputStream fos = null;                try{                    fis = new FileInputStream("c:\\t.zip");                    fos = new FileOutputStream("d:\\t.zip");                    //定义字节数组,缓冲                    byte[] bytes = new byte[1024*10];                    //读取数组,写入数组                    int len = 0 ;                     while((len = fis.read(bytes))!=-1){                        fos.write(bytes, 0, len);                    }                }catch(IOException ex){                    System.out.println(ex);                    throw new RuntimeException("文件复制失败");                }finally{                    try{                        if(fos!=null)                            fos.close();                    }catch(IOException ex){                        throw new RuntimeException("释放资源失败");                    }finally{                        try{                            if(fis!=null)                                fis.close();                        }catch(IOException ex){                            throw new RuntimeException("释放资源失败");                        }                    }                }                long e = System.currentTimeMillis();                System.out.println(e-s);            }        }

14编码表

* A: 编码表    * a: 定义:        * 生活中字符和计算机二进制的对应关系表,就是编码表    * b: 分类        * 1、ascii: 一个字节中的7位就可以表示。对应的字节都是正数。0-xxxxxxx        * 2、iso-8859-1:拉丁码表 latin,用了一个字节用的8位。1-xxxxxxx  负数。        * 3、GB2312:简体中文码表。包含6000-7000中文和符号。用两个字节表示。两个字节第一个字节是负数,第二个字节可能是正数            * GBK:目前最常用的中文码表,2万的中文和符号。用两个字节表示,其中的一部分文字,第一个字节开头是1,第二字节开头是0            * GB18030:最新的中文码表,目前还没有正式使用。        * 4、unicode:国际标准码表:无论是什么文字,都用两个字节存储。            * Java中的char类型用的就是这个码表。char c = 'a';占两个字节。            * Java中的字符串是按照系统默认码表来解析的。简体中文版 字符串默认的码表是GBK。        * 5、UTF-8:基于unicode,一个字节就可以存储数据,不要用两个字节存储,而且这个码表更加的标准化,在每一个字节头加入了编码信息(后期到api中查找)。        * 6、能识别中文的码表:GBK、UTF-8;正因为识别中文码表不唯一,涉及到了编码解码问题。            * 对于我们开发而言;常见的编码 GBK  UTF-8  ISO-8859-1            * 文字--->(数字) :编码。 “abc”.getBytes()  byte[]            * (数字)--->文字  : 解码。 byte[] b={97,98,99}  new String(b) 

15字符输出流写文本FileWriter类

* A: 字符输出流写文本FileWriter类    * a: 方法介绍        *  void write(int c)            *  写入单个字符        * void write(String str)              * 写入字符串        * void write(String str, int off, int len)             * 写入字符串的某一部分        * void write(char[] cbuf)              * 写入字符数组        * abstract  void write(char[] cbuf, int off, int len)              *  写入字符数组的某一部分    * b: 案例代码        /*         *   字符输出流         *     java.io.Writer 所有字符输出流的超类         *   写文件,写文本文件         *            *   写的方法 write         *     write(int c) 写1个字符         *     write(char[] c)写字符数组         *     write(char[] c,int,int)字符数组一部分,开始索引,写几个         *     write(String s) 写入字符串         *              *   Writer类的子类对象 FileWriter         *            *   构造方法:  写入的数据目的         *     File 类型对象         *     String 文件名         *              *   字符输出流写数据的时候,必须要运行一个功能,刷新功能         *   flush()         */        public class WriterDemo {            public static void main(String[] args) throws IOException{                FileWriter fw = new FileWriter("c:\\1.txt");                //写1个字符                fw.write(100);                fw.flush();                //写1个字符数组                char[] c = {'a','b','c','d','e'};                fw.write(c);                fw.flush();                //写字符数组一部分                fw.write(c, 2, 2);                fw.flush();                //写如字符串                fw.write("hello");                fw.flush();                fw.close();            }        }

16字符输入流读取文本FileReader类

* A: 字符输入流读取文本FileReader类    * a: 方法介绍        *  int read()             * 读取单个字符        * int read(char[] cbuf)             * 将字符读入数组        * abstract  int read(char[] cbuf, int off, int len)              * 将字符读入数组的某一部分。    * b: 案例代码        /*         *  字符输入流读取文本文件,所有字符输入流的超类         *    java.io.Reader         *  专门读取文本文件         *           *  读取的方法 : read()         *   int read() 读取1个字符         *   int read(char[] c) 读取字符数组         *            *   Reader类是抽象类,找到子类对象 FileReader         *            *   构造方法: 绑定数据源         *     参数:         *        File  类型对象         *        String文件名         */        public class ReaderDemo {            public static void main(String[] args) throws IOException{                FileReader fr = new FileReader("c:\\1.txt");                /*int len = 0 ;                while((len = fr.read())!=-1){                    System.out.print((char)len);                }*/                char[] ch = new char[1024];                int len = 0 ;                while((len = fr.read(ch))!=-1){                    System.out.print(new String(ch,0,len));                }                fr.close();            }        }

17flush方法和close方法区别

* A: flush方法和close方法区别    *a: flush()方法        * 用来刷新缓冲区的,刷新后可以再次写出,只有字符流才需要刷新    *b: close()方法        * 用来关闭流释放资源的的,如果是带缓冲区的流对象的close()方法,不但会关闭流,还会再关闭流之前刷新缓冲区,关闭后不能再写出 

18字符流复制文本文件

* A: 字符流复制文本文件    * a: 案例代码        /*         *  字符流复制文本文件,必须文本文件         *  字符流查询本机默认的编码表,简体中文GBK         *  FileReader读取数据源         *  FileWriter写入到数据目的         */        public class Copy_2 {            public static void main(String[] args) {                FileReader fr = null;                FileWriter fw = null;                try{                    fr = new FileReader("c:\\1.txt");                    fw = new FileWriter("d:\\1.txt");                    char[] cbuf = new char[1024];                    int len = 0 ;                    while(( len = fr.read(cbuf))!=-1){                        fw.write(cbuf, 0, len);                        fw.flush();                    }                }catch(IOException ex){                    System.out.println(ex);                    throw new RuntimeException("复制失败");                }finally{                    try{                        if(fw!=null)                            fw.close();                    }catch(IOException ex){                        throw new RuntimeException("释放资源失败");                    }finally{                        try{                            if(fr!=null)                                fr.close();                        }catch(IOException ex){                            throw new RuntimeException("释放资源失败");                        }                    }                }            }        }

01转换流概述

* A: 转换流概述    * a: 转换流概述        * OutputStreamWriter 是字符流通向字节流的桥梁:可使用指定的字符编码表,将要写入流中的字符编码成字节        * 将字符串按照指定的编码表转成字节,在使用字节流将这些字节写出去

02转换流_字符转字节的过程

* A: 转换流_字符转字节的过程    * a.图解        * 详见day24_source/转换流.JPG图片

03OutputStreamWriter写文本文件

* A: OutputStreamWriter写文本文件    * a: OutputStreamWriter        * java.io.OutputStreamWriter 继承Writer类        * 就是一个字符输出流,写文本文件        * write()字符,字符数组,字符串            * 字符通向字节的桥梁,将字符流转字节流        * OutputStreamWriter 使用方式            * 构造方法:                * OutputStreamWriter(OuputStream out)接收所有的字节输出流                * 字节输出流:  FileOutputStream                       * OutputStreamWriter(OutputStream out, String charsetName)                * String charsetName 传递编码表名字 GBK  UTF-8         * OutputStreamWriter 有个子类,  FileWriter    * b: 案例代码            public class OutputStreamWriterDemo {                public static void main(String[] args)throws IOException {            //      writeGBK();                    writeUTF();                }                /*                 * 转换流对象OutputStreamWriter写文本                 * 采用UTF-8编码表写入                 */                public static void writeUTF()throws IOException{                    //创建字节输出流,绑定文件                    FileOutputStream fos = new FileOutputStream("c:\\utf.txt");                    //创建转换流对象,构造方法保证字节输出流,并指定编码表是UTF-8                    OutputStreamWriter osw = new OutputStreamWriter(fos,"UTF-8");                    osw.write("你好");                    osw.close();                }                /*                 * 转换流对象 OutputStreamWriter写文本                 * 文本采用GBK的形式写入                 */                public static void writeGBK()throws IOException{                    //创建字节输出流,绑定数据文件                    FileOutputStream fos = new FileOutputStream("c:\\gbk.txt");                    //创建转换流对象,构造方法,绑定字节输出流,使用GBK编码表                    OutputStreamWriter osw = new OutputStreamWriter(fos);                    //转换流写数据                    osw.write("你好");                    osw.close();                }            }

04转换流_字节转字符流过程

* A: 转换流_字节转字符流过程    * a: InputStreamReader                  * java.io.InputStreamReader 继承 Reader        * 字符输入流,读取文本文件        * 字节流向字符的敲了,将字节流转字符流        * 读取的方法:            * read() 读取1个字符,读取字符数组        * 技巧            * OuputStreamWriter写了文件            * InputStreamReader读取文件        * OutputStreamWriter(OutputStream out)所有字节输出流        * InputStreamReader(InputStream in) 接收所有的字节输入流        * 可以传递的字节输入流: FileInputStream        * InputStreamReader(InputStream in,String charsetName) 传递编码表的名字    * b: 图解        * 详见day24_source/转换流.JPG图片

05InputSteamReader读取文本文件

* A: InputSteamReader读取文本文件    * a: 案例代码        public class InputStreamReaderDemo {            public static void main(String[] args) throws IOException {        //      readGBK();                readUTF();            }            /*             *  转换流,InputSteamReader读取文本             *  采用UTF-8编码表,读取文件utf             */            public static void readUTF()throws IOException{                //创建自己输入流,传递文本文件                FileInputStream fis = new FileInputStream("c:\\utf.txt");                //创建转换流对象,构造方法中,包装字节输入流,同时写编码表名                InputStreamReader isr = new InputStreamReader(fis,"UTF-8");                char[] ch = new char[1024];                int len = isr.read(ch);                System.out.println(new String(ch,0,len));                isr.close();            }            /*             *  转换流,InputSteamReader读取文本             *  采用系统默认编码表,读取GBK文件             */            public static void readGBK()throws IOException{                //创建自己输入流,传递文本文件                FileInputStream fis = new FileInputStream("c:\\gbk.txt");                //创建转换流对象,构造方法,包装字节输入流                InputStreamReader isr = new InputStreamReader(fis);                char[] ch = new char[1024];                int len = isr.read(ch);                System.out.println(new String(ch,0,len));                isr.close();            }        }

06转换流子类父类的区别

* A: 转换流子类父类的区别    * a: 继承关系        OutputStreamWriter:            |--FileWriter:        InputStreamReader:            |--FileReader;    * b: 区别        * OutputStreamWriter和InputStreamReader是字符和字节的桥梁:也可以称之为字符转换流。字符转换流原理:字节流+编码表。        * FileWriter和FileReader:作为子类,仅作为操作字符文件的便捷类存在。            当操作的字符文件,使用的是默认编码表时可以不用父类,而直接用子类就完成操作了,简化了代码。        * 以下三句话功能相同            * InputStreamReader isr = new InputStreamReader(new FileInputStream("a.txt"));//默认字符集。            * InputStreamReader isr = new InputStreamReader(new FileInputStream("a.txt"),"GBK");//指定GBK字符集。            * FileReader fr = new FileReader("a.txt");

07缓冲流概述

* A: 缓冲流概述    * a: 概述        * 可提高IO流的读写速度        * 分为字节缓冲流与字符缓冲流 

08字节输出流缓冲流BufferedOutputStream

* A: 字节输出流缓冲流BufferedOutputStream    * a: BufferedOutputStream        * 字节输出流的缓冲流        * java.io.BufferedOuputStream 作用: 提高原有输出流的写入效率        * BufferedOuputStream 继承 OutputStream        * 方法,写入 write 字节,字节数组                    * 构造方法:            * BufferedOuputStream(OuputStream out)            * 可以传递任意的字节输出流, 传递的是哪个字节流,就对哪个字节流提高效率      * b: 案例代码        public class BufferedOutputStreamDemo {            public static void main(String[] args)throws IOException {                //创建字节输出流,绑定文件                //FileOutputStream fos = new FileOutputStream("c:\\buffer.txt");                //创建字节输出流缓冲流的对象,构造方法中,传递字节输出流                BufferedOutputStream bos = new                        BufferedOutputStream(new FileOutputStream("c:\\buffer.txt"));                bos.write(55);                byte[] bytes = "HelloWorld".getBytes();                bos.write(bytes);                bos.write(bytes, 3, 2);                bos.close();            }        }

09字节输入流缓冲流BufferedInputStream

* A: 字节输入流缓冲流BufferedInputStream    * a: BufferedInputStream        * 字节输入流的缓冲流        * 继承InputStream,标准的字节输入流        * 读取方法  read() 单个字节,字节数组                      * 构造方法:            * BufferedInputStream(InputStream in)            * 可以传递任意的字节输入流,传递是谁,就提高谁的效率            * 可以传递的字节输入流 FileInputStream    * b: 案例代码        public class BufferedInputStreamDemo {            public static void main(String[] args) throws IOException{                //创建字节输入流的缓冲流对象,构造方法中包装字节输入流,包装文件                BufferedInputStream bis = new                         BufferedInputStream(new FileInputStream("c:\\buffer.txt"));                byte[] bytes = new byte[10];                int len = 0 ;                while((len = bis.read(bytes))!=-1){                    System.out.print(new String(bytes,0,len));                }                bis.close();            }        }

10四种文件复制方式的效率比较

* A:四种文件复制方式的效率比较    * a: 四中复制方式        * 字节流读写单个字节                    125250 毫秒        * 字节流读写字节数组                    193    毫秒  OK        * 字节流缓冲区流读写单个字节         1210   毫秒        * 字节流缓冲区流读写字节数组            73     毫秒  OK            * b: 案例代码        public class Copy {            public static void main(String[] args)throws IOException {                long s = System.currentTimeMillis();                copy_4(new File("c:\\q.exe"), new File("d:\\q.exe"));                long e = System.currentTimeMillis();                System.out.println(e-s);            }            /*             * 方法,实现文件复制             *  4. 字节流缓冲区流读写字节数组             */            public static void copy_4(File src,File desc)throws IOException{                BufferedInputStream bis = new BufferedInputStream(new FileInputStream(src));                BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(desc));                int len = 0 ;                byte[] bytes = new byte[1024];                while((len = bis.read(bytes))!=-1){                    bos.write(bytes,0,len);                }                bos.close();                bis.close();            }            /*             * 方法,实现文件复制             *  3. 字节流缓冲区流读写单个字节             */            public static void copy_3(File src,File desc)throws IOException{                BufferedInputStream bis = new BufferedInputStream(new FileInputStream(src));                BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(desc));                int len = 0 ;                while((len = bis.read())!=-1){                    bos.write(len);                }                bos.close();                bis.close();            }            /*             * 方法,实现文件复制             *  2. 字节流读写字节数组             */            public static void copy_2(File src,File desc)throws IOException{                FileInputStream fis = new FileInputStream(src);                FileOutputStream fos = new FileOutputStream(desc);                int len = 0 ;                byte[] bytes = new byte[1024];                while((len = fis.read(bytes))!=-1){                    fos.write(bytes,0,len);                }                fos.close();                fis.close();            }            /*             * 方法,实现文件复制             *  1. 字节流读写单个字节             */            public static void copy_1(File src,File desc)throws IOException{                FileInputStream fis = new FileInputStream(src);                FileOutputStream fos = new FileOutputStream(desc);                int len = 0 ;                while((len = fis.read())!=-1){                    fos.write(len);                }                fos.close();                fis.close();            }        }

11字符输出流缓冲流BufferedWriter

* A: 字符输出流缓冲流BufferedWriter    * a: BufferedWriter        * 字符输出流缓冲区流        * java.io.BufferedWriter 继承 Writer        * 写入方法 write () 单个字符,字符数组,字符串        * 构造方法:            * BufferedWriter(Writer w)传递任意字符输出流            * 传递谁,就高效谁            * 能传递的字符输出流 FileWriter, OutputStreamWriter    * b: 案例代码        public class BufferedWrierDemo {            public static void main(String[] args) throws IOException{                //创建字符输出流,封装文件                FileWriter fw = new FileWriter("c:\\buffer.txt");                BufferedWriter bfw = new BufferedWriter(fw);                bfw.write(100);                bfw.flush();                bfw.write("你好".toCharArray());                bfw.flush();                bfw.write("你好");                bfw.flush();                bfw.write("我好好");                bfw.flush();                bfw.write("大家都好");                bfw.flush();                bfw.close();            }        }

12字符输出流缓冲流BufferedWriter特有方法newLine

* A: 字符输出流缓冲流BufferedWriter特有方法newLine    * a: 方法介绍        * void  newLine() 写换行        * newLine()文本中换行, \r\n也是文本换行        * 方法具有平台无关性        * Windows  \r\n        * Linux    \n        * newLine()运行结果,和操作系统是相互关系        * JVM: 安装的是Windows版本,newLine()写的就是\r\n        * 安装的是Linux版本,newLine()写的就是\n        /*         *  将数据源 c:\\a.txt         *  复制到 d:\\a.txt  数据目的         *  字节输入流,绑定数据源         *  字节输出流,绑定数据目的         *           *  输入,读取1个字节         *  输出,写1个字节         */    * b: 案例代码        public class BufferedWrierDemo {            public static void main(String[] args) throws IOException{                //创建字符输出流,封装文件                FileWriter fw = new FileWriter("c:\\buffer.txt");                BufferedWriter bfw = new BufferedWriter(fw);                bfw.write(100);                bfw.flush();                bfw.write("你好".toCharArray());                bfw.flush();                bfw.write("你好");                bfw.newLine();                bfw.flush();                bfw.write("我好好");                bfw.newLine();                bfw.flush();                bfw.write("大家都好");                bfw.flush();                bfw.close();            }        }

13字符输入流缓冲流BufferedReader

* A: 字符输入流缓冲流BufferedReader    * a: 概述        * 从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取        * public String readLine() 读取一个文本行,包含该行内容的字符串,不包含任何行终止符,如果已到达流末尾,则返回 null

14字符输入流缓冲流BufferedReader读取文本行

* A: 字符输入流缓冲流BufferedReader读取文本行    * a: BufferedReader        * 字符输入流缓冲流        * java.io.BufferedReader 继承 Reader        * 读取功能 read() 单个字符,字符数组        * 构造方法:            * BufferedReader(Reader r)            * 可以任意的字符输入流               FileReader  InputStreamReader               * BufferedReader自己的功能            * String readLine() 读取文本行 \r\n                   * 方法读取到流末尾,返回null    * b: 小特点         * 获取内容的方法一般都有返回值         * int 没有返回的都是负数         * 引用类型 找不到返回null         * boolean 找不到返回false    * c: 案例代码        public class BufferedReaderDemo {            public static void main(String[] args) throws IOException {                int lineNumber = 0;                //创建字符输入流缓冲流对象,构造方法传递字符输入流,包装数据源文件                BufferedReader bfr = new BufferedReader(new FileReader("c:\\a.txt"));                //调用缓冲流的方法 readLine()读取文本行                //循环读取文本行, 结束条件 readLine()返回null                String line = null;                while((line = bfr.readLine())!=null){                    lineNumber++;                    System.out.println(lineNumber+"  "+line);                }                bfr.close();            }        }        /*         * String line = bfr.readLine();                System.out.println(line);                line = bfr.readLine();                System.out.println(line);                line = bfr.readLine();                System.out.println(line);                line = bfr.readLine();                System.out.println(line);                line = bfr.readLine();                System.out.println(line);         */

15字符流缓冲区流复制文本文件

* A: 字符流缓冲区流复制文本文件    * a: 案例代码        /*         *  使用缓冲区流对象,复制文本文件         *  数据源  BufferedReader+FileReader 读取         *  数据目的 BufferedWriter+FileWriter 写入         *  读取文本行, 读一行,写一行,写换行         */        public class Copy_1 {            public static void main(String[] args) throws IOException{                BufferedReader bfr = new BufferedReader(new FileReader("c:\\w.log"));                   BufferedWriter bfw = new BufferedWriter(new FileWriter("d:\\w.log"));                //读取文本行, 读一行,写一行,写换行                String line = null;                while((line = bfr.readLine())!=null){                    bfw.write(line);                    bfw.newLine();                    bfw.flush();                }                bfw.close();                bfr.close();            }        }

16IO流对象的操作规律

* A: IO流对象的操作规律    * a: 明确一:要操作的数据是数据源还是数据目的。        * 源:InputStream    Reader        * 目的:OutputStream Writer        * 先根据需求明确要读,还是要写。    * b: 明确二:要操作的数据是字节还是文本呢?        * 源:            * 字节:InputStream            * 文本:Reader        * 目的:            * 字节:OutputStream            * 文本:Writer    * c: 明确三:明确数据所在的具体设备。        * 源设备:            * 硬盘:文件  File开头。            * 内存:数组,字符串。            * 键盘:System.in;            * 网络:Socket        * 目的设备:            * 硬盘:文件  File开头。            * 内存:数组,字符串。            * 屏幕:System.out            * 网络:Socket            * 完全可以明确具体要使用哪个流对象。    * d: 明确四:是否需要额外功能呢?        * 额外功能:            * 转换吗?转换流。InputStreamReader OutputStreamWriter            * 高效吗?缓冲区对象。BufferedXXX            * 已经明确到了具体的体系上。

01Properties集合的特点

* A: Properties集合的特点    * a: Properties类介绍        * Properties 类表示了一个持久的属性集。Properties 可保存在流中或从流中加载。属性列表中每个键及其对应值都是一个字符串    * b: 特点        * Hashtable的子类,map集合中的方法都可以用。        * 该集合没有泛型。键值都是字符串。        * 它是一个可以持久化的属性集。键值可以存储到集合中,也可以存储到持久化的设备(硬盘、U盘、光盘)上。键值的来源也可以是持久化的设备。        * 有和流技术相结合的方法。    * c: 方法介绍        * load(InputStream inputStream)  把指定流所对应的文件中的数据,读取出来,保存到Propertie集合中        * load(Reader reader) 按简单的面向行的格式从输入字符流中读取属性列表(键和元素对)        * store(OutputStream outputStream,String commonts) 把集合中的数据,保存到指定的流所对应的文件中,参数commonts代表对描述信息        * stroe(Writer writer,String comments) 以适合使用 load(Reader) 方法的格式,将此 Properties 表中的属性列表(键和元素对)写入输出字符

02Properties集合存储键值对

* A: Properties集合存储键值对          * a: 方法介绍        *  集合对象Properties类,继承Hashtable,实现Map接口        *  可以和IO对象结合使用,实现数据的持久存储        * 使用Properties集合,存储键值对        * setProperty等同与Map接口中的put        * setProperty(String key, String value)        * 通过键获取值, getProperty(String key)    * b: 案例代码        public class PropertiesDemo {            public static void main(String[] args)throws IOException {                function_2();            }            /*             * 使用Properties集合,存储键值对             * setProperty等同与Map接口中的put             * setProperty(String key, String value)             * 通过键获取值, getProperty(String key)             */            public static void function(){                Properties pro = new Properties();                pro.setProperty("a", "1");                pro.setProperty("b", "2");                pro.setProperty("c", "3");                System.out.println(pro);                String value = pro.getProperty("c");                System.out.println(value);                //方法stringPropertyNames,将集合中的键存储到Set集合,类似于Map接口的方法keySet                Set<String> set = pro.stringPropertyNames();                for(String key : set){                    System.out.println(key+"..."+pro.getProperty(key));                }            }        }

03Properties集合的方法load

* A: Properties集合的方法load    * a: 方法介绍        * Properties集合特有方法 load        * load(InputStream in)        * load(Reader r)        * 传递任意的字节或者字符输入流        * 流对象读取文件中的键值对,保存到集合    * b: 案例代码                   public class PropertiesDemo {                public static void main(String[] args)throws IOException {                    function_1();                }                                                   /*                 * Properties集合特有方法 load                 * load(InputStream in)                 * load(Reader r)                 * 传递任意的字节或者字符输入流                 * 流对象读取文件中的键值对,保存到集合                 */                public static void function_1()throws IOException{                    Properties pro = new Properties();                    FileReader fr = new FileReader("c:\\pro.properties");                    //调用集合的方法load,传递字符输入流                    pro.load(fr);                    fr.close();                    System.out.println(pro);                }                               }

04Properties集合的方法store

* A: Properties集合的方法store    * a: 方法介绍                   * Properties集合的特有方法store        * store(OutputStream out)        * store(Writer w)        * 接收所有的字节或者字符的输出流,将集合中的键值对,写回文件中保存    * b: 案例代码        public class PropertiesDemo {            public static void main(String[] args)throws IOException {                function_2();            }            /*             * Properties集合的特有方法store             * store(OutputStream out)             * store(Writer w)             * 接收所有的字节或者字符的输出流,将集合中的键值对,写回文件中保存             */            public static void function_2()throws IOException{                Properties pro = new Properties();                pro.setProperty("name", "zhangsan");                pro.setProperty("age", "31");                pro.setProperty("email", "123456789@163.com");                FileWriter fw = new FileWriter("c:\\pro.properties");                //键值对,存回文件,使用集合的方法store传递字符输出流                pro.store(fw, "");                fw.close();            }                       }

05对象的序列化与反序列化

* A: 对象的序列化与反序列化    * a: 基本概念        * 对象的序列化            * 对象中的数据,以流的形式,写入到文件中保存过程称为写出对象,对象的序列化            * ObjectOutputStream将对象写道文件中,实现序列化        * 对象的反序列化            * 在文件中,以流的形式,将对象读出来,读取对象,对象的反序列化            * ObjectInputStream 将文件对象读取出来

06ObjectOutputStream流写对象

* A: ObjectOutputStream流写对象    * a: 简单介绍         *  IO流对象,实现对象Person序列化,和反序列化         *  ObjectOutputStream 写对象,实现序列化         *  ObjectInputStream 读取对象,实现反序列化    * b: 案例代码        public class Person implements Serializable{            public String name;            public int age;            public Person(String name, int age) {                super();                this.name = name;                this.age = age;            }            public Person(){}            public String getName() {                return name;            }            public void setName(String name) {                this.name = name;            }            public int getAge() {                return age;            }            public void setAge(int age) {                this.age = age;            }            @Override            public String toString() {                return "Person [name=" + name + ", age=" + age + "]";            }                       }        public class ObjectStreamDemo {            public static void main(String[] args)throws IOException, ClassNotFoundException {        //      writeObject();                readObject();            }            /*             * ObjectOutputStream             * 构造方法: ObjectOutputStream(OutputSteam out)             * 传递任意的字节输出流             * void writeObject(Object obj)写出对象的方法             */            public static void writeObject() throws IOException{                //创建字节输出流,封装文件                FileOutputStream fos = new FileOutputStream("c:\\person.txt");                //创建写出对象的序列化流的对象,构造方法传递字节输出流                ObjectOutputStream oos = new ObjectOutputStream(fos);                Person p = new Person("lisi",25);                //调用序列化流的方法writeObject,写出对象                oos.writeObject(p);                oos.close();            }        }

07ObjectInputStream流读取对象

* A: ObjectInputStream流读取对象    * a: 简单介绍        * ObjectInputStream        * 构造方法:ObjectInputStream(InputStream in)        * 传递任意的字节输入流,输入流封装文件,必须是序列化的文件        * Object readObject()  读取对象    * b: 案例代码        /*         *  IO流对象,实现对象Person序列化,和反序列化         *  ObjectOutputStream 写对象,实现序列化         *  ObjectInputStream 读取对象,实现反序列化         */        public class ObjectStreamDemo {            public static void main(String[] args)throws IOException, ClassNotFoundException {                readObject();            }            /*             * ObjectInputStream             * 构造方法:ObjectInputStream(InputStream in)             * 传递任意的字节输入流,输入流封装文件,必须是序列化的文件             * Object readObject()  读取对象             */            public static void readObject() throws IOException, ClassNotFoundException{                FileInputStream fis = new FileInputStream("c:\\person.txt");                //创建反序列化流,构造方法中,传递字节输入流                ObjectInputStream ois = new ObjectInputStream(fis);                //调用反序列化流的方法 readObject()读取对象                Object obj =ois.readObject();                System.out.println(obj);                ois.close();            }                       }

08静态不能序列化

* A: 静态不能序列化    * a: 原因        * 序列化是把对象数据进行持久化存储        * 静态的东西不属于对象,而属于类

09transient关键字

* A: transient关键字    * a: 作用        * 被transient修饰的属性不会被序列化        * transient关键字只能修饰成员变量

10Serializable接口的含义

* A:Serializable接口的含义    * a: 作用        * 给需要序列化的类上加标记。该标记中没有任何抽象方法        * 只有实现了 Serializable接口的类的对象才能被序列化

11序列化中的序列号冲突问题

* A: 序列化中的序列号冲突问题    * a: 问题产生原因        * 当一个类实现Serializable接口后,创建对象并将对象写入文件,之后更改了源代码(比如:将成员变量的修饰符有private改成public),            再次从文件中读取对象时会报异常        * 见day25_source文件夹下的"序列号的冲突.JPG"文件

12序列化中自定义的序列号

* A: 序列化中自定义的序列号    * a: 定义方式        * private static final long serialVersionUID = 1478652478456L;            * 这样每次编译类时生成的serialVersionUID值都是固定的         * b: 案例代码        public class Person implements Serializable{            public String name;            public /*transient阻止成员变量序列化*/ int age;            //类,自定义了序列号,编译器不会计算序列号            private static final long serialVersionUID = 1478652478456L;            public Person(String name, int age) {                super();                this.name = name;                this.age = age;            }            public Person(){}            public String getName() {                return name;            }            public void setName(String name) {                this.name = name;            }            public int getAge() {                return age;            }            public void setAge(int age) {                this.age = age;            }            @Override            public String toString() {                return "Person [name=" + name + ", age=" + age + "]";            }                       }

13打印流和特性

* A: 打印流和特性    * a: 概述        * 打印流添加输出数据的功能,使它们能够方便地打印各种数据值表示形式.        * 打印流根据流的分类:            * 字节打印流 PrintStream            * 字符打印流 PrintWriter        * 方法:            * void print(String str): 输出任意类型的数据,            * void println(String str): 输出任意类型的数据,自动写入换行操作    * b: 特点                 * 此流不负责数据源,只负责数据目的        * 为其他输出流,添加功能        * 永远不会抛出IOException,但是可能抛出别的异常          * 两个打印流的方法,完全一致        * 构造方法,就是打印流的输出目的端        * PrintStream构造方法            * 接收File类型,接收字符串文件名,接收字节输出流OutputStream        * PrintWriter构造方法            * 接收File类型,接收字符串文件名,接收字节输出流OutputStream, 接收字符输出流Writer

14打印流输出目的是File对象

* A: 打印流输出目的是File对象    * a: 案例代码        public class PrintWriterDemo {            public static void main(String[] args) throws  IOException {                function_3();            }            /*             * 打印流,向File对象的数据目的写入数据             * 方法print println  原样输出             * write方法走码表             */            public static void function() throws FileNotFoundException{                File file = new File("c:\\1.txt");                PrintWriter pw = new PrintWriter(file);                pw.println(true);                pw.write(100);                pw.close();            }        }

15输出语句是char数组

* A: 输出语句是char数组    * a: 案例代码        public class Demo {            public static void main(String[] args) {                int[] arr = {1};                System.out.println(arr);                char[] ch = {'a','b'};                System.out.println(ch);                byte[] b = {};                System.out.println(b);            }        }    * b: 结果分析        * println数组,只有打印字符数组时只有容,其余均打印数组的地址            * 因为api中定义了打印字符数组的方法,其底层是在遍历数组中的元素            * 而其他打印数组的方法,都是将数组对象编程Object,其底层再将对象编程String,调用了String s = String.valueOf(x);方法

16打印流输出目的是String和流对象

* A: 打印流输出目的是String和流对象    * a: 案例代码        public class PrintWriterDemo {            public static void main(String[] args) throws  IOException {                function_2();            }            /*             * 打印流,输出目的,是流对象             * 可以是字节输出流,可以是字符的输出流             * OutputStream  Writer             */            public static void function_2() throws IOException{            //  FileOutputStream fos = new FileOutputStream("c:\\3.txt");                FileWriter fw = new FileWriter("c:\\4.txt");                PrintWriter pw = new PrintWriter(fw);                pw.println("打印流");                pw.close();            }            /*             * 打印流,输出目的,String文件名             */            public static void function_1() throws FileNotFoundException{                PrintWriter pw = new PrintWriter("c:\\2.txt");                pw.println(3.5);                pw.close();            }           }

17打印流开启自动刷新

* A: 打印流开启自动刷新    * 案例代码        public class PrintWriterDemo {            public static void main(String[] args) throws  IOException {                function_3();            }            /*              * 打印流,可以开启自动刷新功能             * 满足2个条件:             *   1. 输出的数据目的必须是流对象             *       OutputStream  Writer             *   2. 必须调用println,printf,format三个方法中的一个,启用自动刷新             */            public static void function_3()throws  IOException{                //File f = new File("XXX.txt");                FileOutputStream fos = new FileOutputStream("c:\\5.txt");                PrintWriter pw = new PrintWriter(fos,true);                pw.println("i");                pw.println("love");                pw.println("java");                pw.close();            }        }

18打印流复制文本文件

* A: 打印流复制文本文件    * a: 案例代码        /*         * 打印流实现文本复制         *   读取数据源  BufferedReader+File 读取文本行         *   写入数据目的 PrintWriter+println 自动刷新         */        public class PrintWriterDemo1 {            public static void main(String[] args) throws IOException{                BufferedReader bfr = new BufferedReader(new FileReader("c:\\a.txt"));                PrintWriter pw = new PrintWriter(new FileWriter("d:\\a.txt"),true);                String line = null;                while((line = bfr.readLine())!=null){                    pw.println(line);                }                pw.close();                bfr.close();            }        }

19commons-io工具类介绍

* A: commons-io工具类介绍    * a: 工具类介绍        * 解压缩commons-io-2.4.zip文件        * commons-io-2.4.jar需要导入到项目中的jar包,里面存放的是class文件        * commons-io-2.4-sources.jar工具类中原代码        * docs是帮助文档

20使用工具类commons_io

* A: 使用工具类commons_io    * a: 导入jar包        * 加入classpath的第三方jar包内的class文件才能在项目中使用        * 创建lib文件夹        * 将commons-io.jar拷贝到lib文件夹        * 右键点击commons-io.jar,Build Path→Add to Build Path    * b: 学会如何看源代码

21IO工具类FilenameUtils

* A: IO工具类FilenameUtils    * a: 方法介绍        * getExtension(String path):获取文件的扩展名;        * getName():获取文件名;        * isExtension(String fileName,String ext):判断fileName是否是ext后缀名;    * b: 案例代码        public class Commons_IODemo {            public static void main(String[] args) {                function_2();            }            /*             * FilenameUtils类的方法             * static boolean isExtension(String filename,String extension)             * 判断文件名的后缀是不是extension             */            public static void function_2(){                boolean b = FilenameUtils.isExtension("Demo.java", "java");                System.out.println(b);            }            /*             * FilenameUtils类的方法             * static String getName(String filename)             * 获取文件名             */            public static void function_1(){                String name = FilenameUtils.getName("c:\\windows\\");                System.out.println(name);            }            /*             * FilenameUtils类的方法             * static String getExtension(String filename)             * 获取文件名的扩展名             */             public static void function(){                 String name = FilenameUtils.getExtension("c:\\windows");                 System.out.println(name);             }        }

22IO工具类FileUtils

* A: IO工具类FileUtils    * a: 方法介绍        * readFileToString(File file):读取文件内容,并返回一个String;        * writeStringToFile(File file,String content):将内容content写入到file中;        * copyDirectoryToDirectory(File srcDir,File destDir);文件夹复制        * copyFile(File srcFile,File destFile);文件复制    * b: 案例代码        public class Commons_IODemo1 {            public static void main(String[] args)throws IOException {                function_3();            }            /*             * FileUtils工具类方法             * static void copyDirectoryToDirectory(File src,File desc)             * 复制文件夹             */            public static void function_3() throws IOException{                FileUtils.copyDirectoryToDirectory(new File("d:\\demo"), new File("c:\\"));            }            /*             * FileUtils工具类的方法             * static void copyFile(File src,File desc)             * 复制文件             */            public static void function_2() throws IOException{                FileUtils.copyFile(new File("c:\\k.jpg"),new File("d:\\k.jpg"));            }            /*             * FileUtils工具类的方法             * static void writeStringToFile(File src,String date)             * 将字符串直接写到文件中             */            public static void function_1() throws IOException{                FileUtils.writeStringToFile(new File("c:\\b.txt"),"我爱Java编程");            }            /*             * FileUtils工具类的方法             * static String readFileToString(File src)读取文本,返回字符串             */             public static void function() throws IOException{                 String s = FileUtils.readFileToString(new File("c:\\a.txt"));                 System.out.println(s);             }        }


1

======================第四节课开始=========