1. package cn.Exception;
    2. /**
    3. * 异常:程序出了不正常的情况
    4. * 程序出现的问题:
    5. * 1、严重问题:(Error)(不处理,这种问题一般解决不了,比如内存溢出)
    6. * 2、一般问题:(Exception)
    7. * a、编译期问题:不是RuntimeException的异常(必须处理,如果不处理,编译不能通过)
    8. * b、运行期问题:RuntimeException(不处理,因为代码不够严谨,需要修正代码)
    9. *
    10. * 如果程序出现了问题,我们没有做处理,最终JVM会做出默认的处理
    11. * 把异常的名称,原因及出现的问题等在控制台输出
    12. * 同时会结束程序,但是后面的程序无法执行
    13. *
    14. * */
    15. public class ExceptionDemo {
    16. public static void main(String[] args) {
    17. int a = 10;
    18. //int b = 2;
    19. //System.out.println(a/b);
    20. int c = 0;
    21. System.out.println(a/c);
    22. System.out.println("over");
    23. }
    24. }
    1. package cn.Exception;
    2. /**
    3. * 如何处理异常
    4. * 1、try……catch……finally
    5. * 2、throws(抛出)
    6. *
    7. * try …… catch ……finally 格式
    8. * try{
    9. * 可能出现问题的代码
    10. * }catch(异常变量名){
    11. * 针对问题的处理
    12. * }finally{
    13. * 释放资源
    14. * }
    15. *
    16. * 变形格式
    17. * try{
    18. * 可能出现的问题
    19. * }catch(异常变量名){
    20. * 针对问题的处理
    21. * }
    22. *
    23. * 注意:
    24. * 1、try 里面的问题越少越好
    25. * 2、catch里面必须有内容
    26. *
    27. * */
    28. public class ExceptionDemo_02 {
    29. public static void main(String[] args) {
    30. //第一阶段
    31. int a = 10;
    32. //int b = 2;
    33. int b = 0;
    34. try {
    35. System.out.println(a / b);
    36. }catch(ArithmeticException ae){
    37. System.out.println("除数不能为0");
    38. }
    39. //第二阶段
    40. System.out.println("over");
    41. }
    42. }
    1. package cn.Exception;
    2. /**
    3. * 1、一个异常
    4. * 2、写一个try多个catch
    5. * try{
    6. * ……
    7. * }catch(){
    8. * ……
    9. * }catch(){
    10. * ……
    11. * }
    12. *
    13. *
    14. *
    15. * 能明确的问题,就尽量明确,实在找不出就使用Exception
    16. * Exception 是可以匹配所有的问题,只能放在最后
    17. *
    18. *
    19. * */
    20. public class ExceptionDemo_03 {
    21. public static void main(String[] args) {
    22. //method1();
    23. //method2();
    24. method3();
    25. }
    26. private static void method3() {
    27. int a = 10;
    28. int b = 0;
    29. int[] arr = {1, 2, 3};
    30. try {
    31. System.out.println(a / b);
    32. System.out.println(arr[3]);
    33. }
    34. // catch (ArithmeticException ae) {
    35. // System.out.println("除数不能为0");
    36. // } catch (ArrayIndexOutOfBoundsException ae) {
    37. // System.out.println("索引越界");
    38. // }
    39. catch(Exception e){
    40. System.out.println("出问题了"); //这个只能放在最后,否则后面的catch会保错
    41. }
    42. System.out.println("over");
    43. }
    44. private static void method2() {
    45. int a = 10;
    46. int b = 0;
    47. try {
    48. System.out.println(a / b);
    49. }catch(ArithmeticException ae){
    50. System.out.println("除数不能为0");
    51. }
    52. int []arr= {1,2,3};
    53. try{
    54. System.out.println(arr[3]);
    55. }catch(ArrayIndexOutOfBoundsException ae){
    56. System.out.println("索引越界");
    57. }
    58. System.out.println("over");
    59. }
    60. public static void method1() {
    61. //第一阶段
    62. int a = 10;
    63. //int b = 2;
    64. int b = 0;
    65. try {
    66. System.out.println(a / b);
    67. }catch(ArithmeticException ae){
    68. System.out.println("除数不能为0");
    69. }
    70. //第二阶段
    71. System.out.println("over");
    72. }
    73. }
    1. package cn.Exception;
    2. /**
    3. * JDK7出现了一个新特性
    4. * try{
    5. * ……
    6. * }catch(异常名1|异常名2|……变量名){
    7. * ……
    8. * }
    9. *
    10. * 注意:
    11. * 1、这种方式是一致的(开发中可能就会针对同一类型的问题,给出同一个处理)
    12. * 2、多个异常间必须是平级关系(不能使用Exception)
    13. *
    14. *
    15. * */
    16. public class ExceptionDemo_04 {
    17. public static void main(String[] args) {
    18. int a = 10;
    19. int b = 0;
    20. int [] arr = {1,2,3};
    21. // try{
    22. // System.out.println(a/b);
    23. // System.out.println(arr[3]);
    24. // System.out.println("这里出现了问题,怎么办");
    25. // }catch(ArithmeticException ae){
    26. // System.out.println("除数不能为0");
    27. // }catch(ArrayIndexOutOfBoundsException ae){
    28. // System.out.println("索引越界");
    29. // }catch(Exception e){
    30. // System.out.println("出问题了");
    31. // }
    32. // System.out.println("over");
    33. //JDK7的处理方案
    34. try{
    35. System.out.println(a/b);
    36. System.out.println(arr[3]);
    37. System.out.println("这里出现了问题,怎么办");
    38. }catch(ArithmeticException |ArrayIndexOutOfBoundsException ae){
    39. System.out.println("出问题了");
    40. }
    41. System.out.println("over");
    42. }
    43. }

    * 编译时异常和运行时异常的区别:
    编译时异常:java程序必须显示处理,否则就会发生错误,无法通过编译
    运行时异常:无需显示处理,也可以和编译时异常一样处理

    1. package cn.Exception;
    2. import java.text.ParseException;
    3. import java.text.SimpleDateFormat;
    4. import java.util.Date;
    5. /**
    6. * 编译时异常和运行时异常的区别
    7. * 编译时异常:java程序必须显示处理,否则就会发生错误,无法通过编译
    8. * 运行时异常:无需显示处理,也可以和编译时异常一样处理
    9. *
    10. * 在try里面发现问题,JVM会帮我们生成一个异常对象,然后把这个对象抛出,,和catch 里面的类进行匹配
    11. * 如果该对象是某个类型,就会执行catch里面的处理信息
    12. *
    13. * 异常中要了解几个方法:
    14. * public String getMessage() 异常消息的字符串
    15. *
    16. * public String toString() 返回异常的简单信息描述
    17. * 此对象的类的 name
    18. * ": "(冒号和一个空格)
    19. * 调用此对象 getLocalizedMessage() 方法的结果(默认返回的是getMessage()的内容)
    20. *
    21. * printStackTrace() 获取异常类名和异常信息,一讲话异常出现在程序的位置,返回值void,把信息输出在控制台(相当于toString)
    22. * */
    23. public class Exception_05 {
    24. public static void main(String[] args) {
    25. // int a = 10;
    26. // int b = 0;
    27. // if(b!=0){
    28. // System.out.println(a/b);
    29. // }
    30. String s = "2014-11-20";
    31. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    32. try {
    33. Date d = sdf.parse(s); //创建一个ParseException 对象,然后抛出,和catch里面的进行匹配
    34. System.out.println(d);
    35. } catch (ParseException e) { //ParseException e = new ParseException();
    36. //e.printStackTrace();
    37. //getMessage()
    38. System.out.println(e.getMessage()); //Unparseable date: "2014-11-20"
    39. //toString
    40. System.out.println(e.toString()); //java.text.ParseException: Unparseable date: "2014-11-20"
    41. e.printStackTrace();
    42. }
    43. System.out.println("over");
    44. }
    45. }
    1. package cn.Exception;
    2. import java.text.ParseException;
    3. import java.text.SimpleDateFormat;
    4. import java.util.Date;
    5. /**
    6. * 有的时候,我们是可以对异常进行处理的,但有的时候没有权限去处理某个异常
    7. * 为了解决这个问题,java针对这种情况提供了一种处理方案:抛出(throws)
    8. * 格式:
    9. * throws 异常类名
    10. * 注意:
    11. * 1、这个格式必须是跟在方法的括号后面的
    12. * 2、尽量不要在main方法上面抛出异常
    13. *
    14. * ArithmeticException 算数异常
    15. * parseException 解析异常
    16. *
    17. * 小结:
    18. * 编译期异常抛出,奖励啊调用必须处理,
    19. * 运行期异常抛出,将来调用可以不用处理
    20. *
    21. * */
    22. public class ExceptionDemo_06 {
    23. public static void main(String[] args) {
    24. System.out.println("今天天气很好");
    25. try {
    26. method();
    27. } catch (ParseException e) {
    28. e.printStackTrace();
    29. }
    30. System.out.println("但是就不该有雾霾");
    31. method2();
    32. }
    33. private static void method2() throws ArithmeticException{
    34. int a = 10;
    35. int b = 0;
    36. System.out.println(a/b);
    37. }
    38. public static void method() throws ParseException {
    39. String s = "2014-11-20";
    40. SimpleDateFormat sdf = new SimpleDateFormat();
    41. Date d = sdf.parse(s);
    42. System.out.println(d);
    43. }
    44. }
    1. * throw:如果出现了异常情况我们可以把异常抛出,这个时候抛出的是异常的对象
    2. * throws:在方法上面声明异常(表示的是一种异常的可能性)
    3. * throw用在方法内部抛出异常对象(表示的是真的异常)
    4. * throws
    5. * 1、用在方法声明后面跟的是异常类名
    6. * 2、可以跟多个异常类型,用逗号隔开
    7. * 3、表示抛出异常,由该方法的调用者处理
    8. * 4throws表示出现异常的可能性,并不一定会发生这些异常
    9. *
    10. * throw
    11. * 1、用在方法体没,跟的是异常对象名
    12. * 2、一次只能抛出一个异常对象名
    13. * 3、表示抛出异常,有方法体内的语句处理
    14. * 4throw则是抛出了异常,指定throw则是一定抛出了某种异常
    15. *

    处理原则:
    如果该功能颞骨可以将问题处理,同try,如果处理不了。交由调用者处理使用throws
    区别:
    后续程序还需要执行就是用try
    后续程序不需要执行就使用throws

    举例:
    感冒吃点药就好:try
    感冒吃药不见好:throws
    如果医院解决不了:Error(严重问题)

    异常的注意事项:
    1、子类重写父类方法时,子类方法必须抛出相同的异常或者父类异常的子类
    2、如果父类抛出了多个异常,子类重写父类时,只能抛出相同的异常或者是它的子集,子类不能抛出父类没有的异常
    3、如果被重写的方法没有抛出异常,那么子类的方法绝对不可以抛出异常,如果子类方法内有异常发生,那么子类只能使用try ,不能使用throws

    1. package cn.Exception.Finally;
    2. import java.text.ParseException;
    3. import java.text.SimpleDateFormat;
    4. import java.util.Date;
    5. /**
    6. * finally(异常处理的异常格式)
    7. * 格式try……catch……finally
    8. *
    9. * 特点:被finally控制的语句一定会执行
    10. *
    11. * 注意:如果 执行到finally之前jvm退出了,就不能在执行了
    12. *
    13. * 作用:用于释放资源,
    14. *
    15. * 面试题:
    16. * 1、final、finally、finalize
    17. * 1、final:最终的意思,可以修饰类,成员变量,成员方法
    18. * 修饰类:类不能被继承
    19. * 修饰变量:变量是常量
    20. * 修饰方法:方法不能别重写
    21. *
    22. * 2、finally:异常处理,用于释放资源
    23. * 一般来说,代码肯定会执行,特殊情况下:在执行finally之前jvm就退出了,就不在实行了
    24. *
    25. * 3、finalize:是Object类的一个方法,垃圾回收器
    26. *
    27. *
    28. * 2、如果catch里面有return,那么finally里面的代码还会执行吗
    29. * 如果会,是在return前执行还是return后执行
    30. * 会,return前执行
    31. *
    32. * try ……catch ……finally的格式变形
    33. * 1、try……catch……finally
    34. * 2、try……catch
    35. * 3、try……catch……catch
    36. * 4、try……catch……catch ……finally
    37. * 5、try……finally这种做法是为了释放资源
    38. *
    39. *
    40. *
    41. * */
    42. public class ExceptionFinallyDemo {
    43. public static void main(String[] args) {
    44. // String s = "2014-11-10";
    45. // SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    46. //
    47. // Date d = null;
    48. // try {
    49. // d = sdf.parse(s);
    50. // } catch (ParseException e) {
    51. // e.printStackTrace();
    52. // }finally{
    53. // System.out.println("这里的代码是可以执行的");
    54. // }
    55. // System.out.println(d);
    56. System.out.println(getInt());
    57. }
    58. public static int getInt(){
    59. int a = 10;
    60. try{
    61. System.out.println(a/0);
    62. a=20;
    63. }catch(ArithmeticException e){
    64. a = 30;
    65. return a; //返回路径
    66. /**
    67. * return a 在执行到这一步的时候,这里不是return a ,二是return 30;这个返回路径就形成了
    68. * 但是在后面有finally,所以就继执行finally的内容,a=40
    69. * 再次回到以前的返回路径,此时继续走return 30
    70. * */
    71. }finally{
    72. a = 40;
    73. return a; // 此时,a = 40;
    74. }
    75. //return a; //面试是在这里return
    76. }
    77. }

    File:

    1. package cn.File;
    2. import java.io.File;
    3. /**
    4. * 我们要想实现IO的操作,就必须知道硬盘上文件的表现形式
    5. * 而java就提供了一个类File供我们使用
    6. *
    7. * File:文件和目录(文件夹)路径名的抽象表现形式
    8. *
    9. * 构造方法:
    10. * 1、File(String pathname) : 根据一个路径得到一个File对象
    11. * 2、File(String parent ,String child) :根据一个目录和一个子文件/目录得到一个File对象
    12. *
    13. *
    14. * */
    15. public class FileDemo {
    16. public static void main(String[] args) {
    17. //1、File(String pathname) : 根据一个路径得到一个File对象
    18. //把e:\\demo\\a.tex封装成一个File对象
    19. File file = new File("e:\\demo\\a.txt");
    20. //2、File(String parent ,String child) :根据一个目录和一个子文件/目录得到一个File对象
    21. File file2 = new File("E:\\demo\\a.txt");
    22. //3、File(File parent ,String child) : 根据一个父File对象和一个子文件/目录得到一个File对象
    23. // File file3 = new File("e:\\demo);
    24. // File file4 = new File(file3,"a.txt");
    25. //以上三种表现形式效果都是一样的
    26. }
    27. }
    1. package cn.File;
    2. import java.io.File;
    3. import java.io.IOException;
    4. /**
    5. * File 的创建功能
    6. * 1、public boolean createNewFile() //创建文件
    7. * 2、public boolean mkdir() //创建文件夹 如果存在就会返回false ,不创建
    8. * 3、public boolean mkdirs() //创建多级文件夹如果父类文件夹不存在,会自动创建
    9. *
    10. * a.txt 不一定是文本文件,可以是文件名,所以需要判断一下是文件,还是文件夹
    11. *
    12. * File 的删除功能:
    13. * 1、public boolean delete()
    14. * 注意:
    15. * 1、在删除之前必须要有文件夹
    16. * 2、java删除不走回收站
    17. *
    18. * */
    19. public class FileDemo_02 {
    20. public static void main(String[] args) throws IOException {
    21. //需求: 在E盘创建一个文件夹demo
    22. File file1 = new File("e:\\demo");
    23. System.out.println("mkdir : " + file1.mkdir());
    24. //需求:在e盘demo文件下创建一个a.txt
    25. File file2 = new File("e:\\demo\\a.txt");
    26. System.out.println("creatNewFile : " +file2.createNewFile());
    27. //需求:在e盘目demo1录创建一个文件b.txt
    28. // File file3 = new File("e:\\demo1\\a.txt");
    29. // System.out.println("creatNewFile : "+ file3.createNewFile());
    30. //这样做会报错,因为在当前路径下,demo1文件夹还不存在,所以,需要先创建文件夹在穿件文件
    31. //需求:在e盘目录test下创建目录aaa(创建文件夹,在到文件夹里面创建文件夹)
    32. File file4 = new File("e:\\test\\aaa");
    33. System.out.println("mkdir : " + file4.mkdir()); //false,因为test文件夹还没有创建,所以创建不了aaa,但是没有报错
    34. File file5 = new File("e:\\test");
    35. File file6 = new File("e:\\test\\aaa");
    36. System.out.println("mkdir :" +file5.mkdir());
    37. System.out.println("mkdir :" + file6.mkdir()); //不适合多目录使用
    38. //3、public boolean mkdirs() //创建多级文件夹如果父类文件夹不存在,会自动创建
    39. File file7 =new File("e:\\aaa\\bbb\\ccc\\ddd\\eee\\fff\\zzz\\ddd\\eee\\ggg\\jjj");
    40. System.out.println("mkdir : " + file7.mkdirs());
    41. System.out.println("------");
    42. //创建目录dd并创建目录a.txt
    43. File file8 = new File("e:\\dd\\a.txt");
    44. System.out.println("mkdir : " + file8.mkdirs()); //a.txt 不一定是文本文件,还可以是文件名
    45. //删除功能:
    46. //创建文件:
    47. // File file = new File("a.txt"); //这里没有写盘符,但是可以创建成功,目录位置在当前项目路径
    48. // System.out.println("createNewFile :" + file.createNewFile()); //创建文件
    49. File file = new File("e:\\a.txt");
    50. System.out.println("createNewFile :" + file.createNewFile()); //创建文件
    51. //1、public boolean delete()
    52. // File file11 = new File("e:\\test\\aaa");
    53. // System.out.println("delete : " + file.delete());
    54. System.out.println("delete : " + file7.delete());
    55. }
    56. }
    1. package cn.File;
    2. import java.io.File;
    3. /**
    4. *
    5. * File 的创建功能
    6. * * 1、public boolean createNewFile() //创建文件
    7. * * 2、public boolean mkdir() //创建文件夹 如果存在就会返回false ,不创建
    8. * * 3、public boolean mkdirs() //创建多级文件夹如果父类文件夹不存在,会自动创建
    9. * *
    10. * * a.txt 不一定是文本文件,可以是文件名,所以需要判断一下是文件,还是文件夹
    11. * *
    12. * * File 的删除功能:
    13. * * 1、public boolean delete()
    14. * * 注意:
    15. * * 1、在删除之前必须要有文件夹
    16. * * 2、java删除不走回收站
    17. * * File 的重命名
    18. * public boolean renameTo(file dest) //重命名
    19. * 注意:
    20. * 1、如果路径名相同,就是改名
    21. * 2、如果路径名不同,就是改名并剪切
    22. *
    23. * 路径以盘符开始:绝对路径: c:\\a\txt
    24. * 路径不以盘符开始:相对路径: a.txt
    25. *
    26. * */
    27. public class FileDemo_03 {
    28. public static void main(String[] args) {
    29. //创建文件:
    30. File file = new File("证件照.jpg");
    31. //需求:改成邓同湖证件照.jpg
    32. // File newFile = new File("邓同湖证件照.jpg");
    33. // System.out.println("renameTo : " + file.renameTo(newFile));
    34. File file2 = new File("邓同湖证件照.jpg");
    35. File newFile2 = new File("e:\\dengtonghu");
    36. System.out.println("rename : " + file2.renameTo(newFile2)); //这一步相当于改名和剪切
    37. }
    38. }

    file的判断功能

    1. package cn.File;
    2. import java.io.File;
    3. import java.io.IOException;
    4. /**
    5. * File的判断功能:
    6. * 1、public boolean idDirectory() 判断是否是目录
    7. * 2、public boolean isFile(); 判断是否是文件
    8. * 3、public boolean exists(); 判断文件是否存在
    9. * 4、public boolean canRead() 判断是否可读
    10. * 5、public boolean canWrite(); 判断是否可写
    11. * 6、public boolean isHidden(); 判断是否隐藏
    12. *
    13. *
    14. * */
    15. public class FileDemo_04 {
    16. public static void main(String[] args) throws IOException {
    17. //创建文件
    18. File file = new File("a.txt");
    19. System.out.println("createNewFile : " +file.createNewFile());
    20. System.out.println("idDirectory : " +file.isDirectory());
    21. System.out.println("isFile : " +file.isFile());
    22. System.out.println("exists : " +file.exists());
    23. System.out.println("canRead : " +file.canRead());
    24. System.out.println("canWrite : " +file.canWrite());
    25. System.out.println("isHidden : " +file.isHidden());
    26. }
    27. }

    获取毫秒值转为格式化时间

    1. Date d = new Date(1595841521032l);
    2. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd : HH:mm:ss");
    3. String s= sdf.format(d);
    4. System.out.println(s);
    1. package cn.File;
    2. import java.io.File;
    3. import java.text.SimpleDateFormat;
    4. import java.util.Date;
    5. /**
    6. * File 的获取功能:
    7. * public String getAbsolutePath() 获取绝对路径
    8. * public String getPath() 获取相对路径
    9. * public String getName() 获取名字
    10. * public long length(); 获取长度,字节数
    11. * public long lastModified() 获取最后一次修改时间,返回毫秒值
    12. *
    13. *
    14. * */
    15. public class FileDemo_05 {
    16. public static void main(String[] args) {
    17. //创建文件方法:
    18. File file = new File("test.txt");
    19. System.out.println("getAbsolutePath : " + file.getAbsolutePath());
    20. System.out.println("getPath: " + file.getPath());
    21. System.out.println("getName : " + file.getName());
    22. System.out.println("length : " + file.length());
    23. System.out.println("lastModified : " + file.lastModified());
    24. //1595840481722毫秒值
    25. Date d = new Date(1595841521032l);
    26. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd : HH:mm:ss");
    27. String s= sdf.format(d);
    28. System.out.println(s);
    29. }
    30. }

    File的高级获取:(获取所有的文件夹)

    1. package cn.File_01;
    2. import java.io.File;
    3. /**
    4. * File的高级获取
    5. * public String [] list() 获取指定目录下的所有文件或者文件夹的名称数组
    6. * public File[] listFiles() 获取指定目录下的所有文件或者文件下的file数组
    7. *
    8. *
    9. * */
    10. public class FileDemo_06 {
    11. public static void main(String[] args) {
    12. //定义一个路径
    13. File file = new File("e:\\");
    14. //public String [] list() 获取制定目录下的所有文件或者文件夹名称的数组
    15. String[] strArray = file.list();
    16. for (String s : strArray) {
    17. System.out.println(s);
    18. }
    19. System.out.println("--------------");
    20. //public File[] listFiles() 获取指定目录下的所有文件或者文件下的file数组
    21. File[] fileArray = file.listFiles();
    22. for (File f : fileArray) {
    23. System.out.println(f);
    24. }
    25. }
    26. }
    1. package cn.FileTest;
    2. import java.io.File;
    3. /**
    4. * 判断e盘目录下是否有后缀名为.jpg 的文件,如果有,就输出文件的名称
    5. * 分析:
    6. * 1、封装e判断目录
    7. * 2、获取该目录下面所有文件或者文件夹的File数组
    8. * 3、遍历该file数组,单后判断
    9. * 4、是否是文件
    10. * 是:继续判断是否以.jpg结尾
    11. * 是:输出文件名称
    12. * 否:不搭理
    13. * 否:不搭理
    14. * */
    15. public class FileDemo {
    16. public static void main(String[] args) {
    17. //封装e盘目录
    18. File file= new File("e:\\");
    19. //获取该目录下面所有的文件或者文件夹数组//public File[] listFiles() 获取指定目录下的所有文件或者文件下的file数组
    20. File [] fileArray = file.listFiles();
    21. //遍历file数组,得到每一个File对象,然后判断
    22. for (File f : fileArray){
    23. //判断是否是文件
    24. if(f.isFile()){
    25. //判断是不是以.jpg结尾
    26. if(f.getName().endsWith(".jpg")){
    27. //输出给文件的名称
    28. System.out.println(f.getName());
    29. }
    30. }
    31. }
    32. }
    33. }

    Screenshot_2020-07-27-22-47-51.pngScreenshot_2020-07-27-22-53-50.pngScreenshot_2020-07-27-23-00-18.png
    递归:

    1. package cn.DiGui;
    2. import java.util.Scanner;
    3. /**
    4. * 递归:方法定义中调用方法本身的现象
    5. * public void show(int n){
    6. * System.out.println(n)
    7. * show()
    8. * }
    9. *
    10. * 注意事项:
    11. * 1、递归一定要有出口,否则就是死递归
    12. * 2、递归的次数不能太多,否则会造成内存溢出
    13. * 3、构造方法不能递归使用
    14. *
    15. *
    16. * 需求:
    17. * 计算5的阶乘
    18. * n!表示阶乘
    19. * 5!= 1*2*3*4*5
    20. * 循环实现
    21. * 递归实现
    22. *
    23. * 递归解决问题的思想
    24. * 1、分解法:
    25. * 2、合并法:
    26. * 先把大问题分解小问题解决,到后面返回形成一个大问题
    27. *
    28. * 递归:方法定义中,调用本身的现象
    29. * 实现:
    30. * 1、做递归要写一个方法
    31. * 写方法:
    32. * 1、返回值类型
    33. * 2、参数列表
    34. * 2、出口条件
    35. * 3、规律
    36. *
    37. * */
    38. public class DiGuiDemo {
    39. public static void main(String[] args) {
    40. // int jc = 1;
    41. // for(int x = 2;x<=5;x++){
    42. // jc*= x; //等价于jc = jc*x;
    43. //
    44. // }
    45. // System.out.println("5的阶乘是:" + jc);
    46. // Scanner sc =new Scanner(System.in);
    47. // System.out.println("请输入 : ");
    48. // int num = sc.nextInt();
    49. // int jc = 1;
    50. // for(int x = 2;x<=num;x++){
    51. // jc*= x; //等价于jc = jc*x;
    52. //
    53. // }
    54. // System.out.println("你输入:"+num+"的阶乘是:" + jc);
    55. // System.out.println("------------");
    56. System.out.println("5的阶乘是: "+jiecheng(5));
    57. }
    58. /**
    59. * 做递归要写一个方法
    60. * 返回值类型:int 或者long
    61. * 参数列表:int n
    62. *
    63. * 出口条件:
    64. * if(n==1 ) {return 1;}
    65. *
    66. * 规律:if(n!= 1) {return n*方法名(n-1)}
    67. *
    68. *
    69. * */
    70. public static int jiecheng(int n){
    71. if(n==1){
    72. return 1;
    73. }else {
    74. return n*jiecheng(n-1);
    75. }
    76. }
    77. }
    1. package cn.DiGui;
    2. /**
    3. * 有一对兔子,从出生后第三个月起,每个月生一对小兔子,小兔子长到第三个月的时候,每个月又生一对兔子,加入兔子不死,请问第20个月后有多少对兔子
    4. * 分析:
    5. * 兔子对数
    6. * 第一个月: 1
    7. * 第二个月: 1
    8. * 第三个月: 2 第一个月生的兔子生了一对小兔子
    9. * 第四个月: 3 第一个月生的兔子生一对,第二个月的兔子生一对,老兔子生一对
    10. * 第五个月: 5 第一个月的生一对,第二个月的生一对,第三个的生一对,第一个月生的小兔子兔子再生一对,第二个月生的小兔子再生一对
    11. * 第六个月: 8
    12. * ……
    13. *
    14. * 兔子的对数是:1、1、2、3、5、8
    15. * 1+1=2
    16. * 2+3=5
    17. * 3+5=8
    18. * ……
    19. * 1、从第三项开始,每一项是前两项之和
    20. * 2、前两项是已知的
    21. *
    22. * 实现:
    23. * 1、数组实现
    24. * 2、变量的变化实现
    25. *
    26. * 假如相邻的两个月的兔子变量是a,b
    27. * 第一个相邻的数据:a = 1,b = 1;
    28. * 第二个相邻的数据:a = 1,b = 2
    29. * 第三个相邻的数据:a = 2,b = 3
    30. * 第四个相邻的数据:a = 3,b = 5
    31. * 下一次的a是上一次的b, b是上一次的a+b
    32. *
    33. * */
    34. public class DiGuiDemo_02 {
    35. public static void main(String[] args) {
    36. //定义一个数组
    37. int [] arr = new int[20];
    38. arr[0] = 1;
    39. arr[1] = 1;
    40. // arr[2] = arr[0]+arr[1];
    41. // arr[3] = arr[1]+ arr[2];
    42. // ……
    43. for(int x = 2; x<arr.length;x++){
    44. arr[x] = arr[x-2] + arr[x-1];
    45. }
    46. System.out.println(arr[19]); //6765
    47. System.out.println("--------------------");
    48. int a = 1;
    49. int b = 1;
    50. for(int x = 0 ;x<18;x++){ //第一个月和第二个月已经拿出,所以是18
    51. //临时变量存储a的值
    52. int temp = a;
    53. a= b;
    54. b = temp+b;
    55. }
    56. System.out.println(b);
    57. //递归实现
    58. /*
    59. * 方法:
    60. * 1、返回值类型:int
    61. * 2、参数列表:int n
    62. *
    63. * 出口条件:
    64. * 第一个月是1,第二个月是1
    65. * 规律:
    66. * 从第三个月开始,每个月是前两个月之和
    67. *
    68. *
    69. *
    70. * */
    71. System.out.println(fib(20));
    72. }
    73. public static int fib(int n){
    74. if(n==1|| n==2){
    75. return 1;
    76. }else{
    77. return fib(n-1)+fib(n-2); //前一个月是n-1,前两个月是n-2
    78. }
    79. }
    80. }
    1. package cn.DiGui;
    2. import java.io.File;
    3. /**
    4. * 需求: 把D:\javaProject中目录下所有的以.java结尾的文件的绝对路径输出在控制台
    5. * 分析:
    6. * 1、封装对象
    7. * 2、获取该目录下所有的文件或者文件夹的File[]
    8. * 3、遍历File数组,得到每一个File对象
    9. * 4、判断该File对象是否是文件夹
    10. * 是:回到2 //因为要回到2,所以使用递归方法
    11. * 否:判断是否以.java结尾
    12. * 是:数据该文件的绝对路径
    13. * 否:不搭理
    14. *
    15. *
    16. * */
    17. public class FilePathDemo {
    18. public static void main(String[] args) {
    19. //封装对象
    20. File srcFolder = new File("d:\\javaProject");
    21. //递归功能实现
    22. getAllJavaFilePaths(srcFolder);
    23. }
    24. private static void getAllJavaFilePaths(File srcFolder) {
    25. //2、获取该目录下所有的文件或者文件夹的File[]
    26. File[] fileArray = srcFolder.listFiles();
    27. //3、遍历File数组,得到每一个File对象
    28. for(File file:fileArray){
    29. //4、判断该File对象是否是文件夹
    30. if(file.isDirectory()){ //判断是否是文件
    31. getAllJavaFilePaths(file);
    32. }else{
    33. if(file.getName().endsWith(".java")){ //判断是否以.java结尾
    34. System.out.println(file.getAbsoluteFile()); //是,则输出绝对路径
    35. }
    36. }
    37. }
    38. }
    39. }

    Screenshot_2020-07-28-16-33-16.png

    1. package cn.IO.cn;
    2. import java.io.File;
    3. import java.io.FileNotFoundException;
    4. import java.io.FileOutputStream;
    5. import java.io.IOException;
    6. /**
    7. * IO:
    8. * 概述:IO流用来处理设备之前的数据传输
    9. * 上传文件和下载文件
    10. * java对数据的操作都是通过流的方式
    11. * java用于操作流的对象都在IO包下
    12. *
    13. * 按照数据流向分:
    14. * 输入流 读数据
    15. * 输出流 写数据
    16. *
    17. * 按照数据类型分:
    18. * 字节流 不能读懂
    19. *
    20. * 字节输入流:读取数据 InputStream
    21. * 字节输出流:写出数据 OutputStream
    22. *
    23. * 字符流 可以读懂
    24. *
    25. * 字符输入流:读取数据 Reader
    26. * 字符输出流:写出数据 Writer
    27. *
    28. * 注意:如果没有明确说明按哪种分分类,是按照数据类型分类的
    29. *
    30. * 使用场景:
    31. * 如果数据所在的文件通过windows自带的记事本打开并且能够读懂里面的内容就是用字符流,其他使用字节流
    32. * 如果不清楚,就使用字符流
    33. *
    34. * 查看FileOutputStream 的构造方法:
    35. * FileOutputStream(File file)
    36. * FileOutputStream(String name)
    37. *
    38. * 字节输出流操作步骤:
    39. * 1.创建字节输出流对象
    40. * 2、写数据
    41. * 3、释放资源
    42. *
    43. *
    44. *
    45. * */
    46. public class IODemo {
    47. public static void main(String[] args) throws IOException {
    48. //创建字节输出流对象
    49. // //FileOutputStream(File file)
    50. // File file = new File("fos.txt");
    51. // FileOutputStream fos = new FileOutputStream(file);
    52. //FileOutputStream(String name)
    53. FileOutputStream fos = new FileOutputStream("fos.txt");
    54. /**
    55. * 创建字节流输出对象做了三件事情
    56. * 1、调用系统功能区创建文件
    57. * 2、创建fos对象
    58. * 3、把fos对象指向这个文件
    59. *
    60. * */
    61. //写数据“hello,io”
    62. fos.write("hello,io".getBytes());
    63. //释放资源
    64. fos.close();
    65. /**
    66. * 为什么要close
    67. * 1、让流对象变成垃圾,这样就可以被垃圾回收器回收
    68. * 2、通知体统去释放跟该文件相关的资源,如果不释放,那么该文件就一直无法关闭,占用系统资源
    69. * */
    70. }
    71. }
    1. package cn.IO.cn;
    2. import java.io.FileNotFoundException;
    3. import java.io.FileOutputStream;
    4. import java.io.IOException;
    5. /**
    6. * 字节流输出得操作步骤
    7. * 1、创建字节输出流对象
    8. * 2、调用writer() 方法
    9. * 3、释放资源
    10. *
    11. * public void write (int b) 写一个字节
    12. * public void write(byte[] b) 写一个字节数组
    13. * public void write(byte [] b, int off ,int len) 写一个字节数组的一部分
    14. *
    15. *
    16. * */
    17. public class IODemo_02 {
    18. public static void main(String[] args) throws IOException {
    19. //创建字节输出流对象
    20. FileOutputStream fos = new FileOutputStream("fos2.txt");
    21. //调用writer()方法:
    22. // fos.write(97); //输出:a: 因为底层是二进制数据结构,通过对应的记事本打开,找97对应的字符值a
    23. // fos.write(57); //9
    24. // fos.write(55); //7
    25. //public void write(byte[] b) 写一个字节数组
    26. byte[] bytes = {97,98,99,100,101};
    27. fos.write(bytes);
    28. // public void write(byte [] b, int off ,int len) 写一个字节数组的一部分
    29. fos.write(bytes,1,3); //bcd
    30. fos.close();
    31. }
    32. }

    标准的异常处理代码

    1. package cn.IO_01;
    2. import java.io.FileNotFoundException;
    3. import java.io.FileOutputStream;
    4. import java.io.IOException;
    5. /**
    6. * 加入异常处理的字节流输出操作
    7. *
    8. * */
    9. public class FileOutputStream_02 {
    10. public static void main(String[] args) {
    11. //创建字节输出流
    12. // FileOutputStream fos = null;
    13. // try {
    14. // fos = new FileOutputStream("fos4.txt");
    15. // } catch (FileNotFoundException e) {
    16. // e.printStackTrace();
    17. // }
    18. // //写数据
    19. // try {
    20. // fos.write("java".getBytes());
    21. // } catch (IOException e) {
    22. // e.printStackTrace();
    23. // }
    24. // //释放资源
    25. // try {
    26. // fos.close();
    27. // } catch (IOException e) {
    28. // e.printStackTrace();
    29. // }
    30. //一起处理异常
    31. // try{
    32. // FileOutputStream fos = new FileOutputStream("fos.txt");
    33. // fos.write("java".getBytes());
    34. // fos.close();
    35. //
    36. // }catch(FileNotFoundException e){
    37. // e.printStackTrace();
    38. // }catch(IOException e){
    39. // e.printStackTrace();
    40. // }
    41. //改进版:
    42. FileOutputStream fos = null;
    43. try {
    44. //fos = new FileOutputStream("z:\\fos4.txt"); //不存在盘符
    45. fos = new FileOutputStream("fos4.txt");
    46. fos.write("java".getBytes());
    47. } catch (FileNotFoundException e) {
    48. e.printStackTrace();
    49. } catch (IOException e) {
    50. e.printStackTrace();
    51. } finally {
    52. //为了保证close()一定会被执行,就放在这里
    53. //如果fos不是null,才需要close
    54. if (fos != null) { //如果对象没有造成功,就不会close从而触发空指针异常
    55. try {
    56. fos.close(); //close本身就有异常,所以要抛出
    57. } catch (IOException e) {
    58. e.printStackTrace();
    59. }
    60. }
    61. }
    62. }
    63. }
    1. package cn.IO_InputStream;
    2. import java.io.FileInputStream;
    3. import java.io.FileNotFoundException;
    4. import java.io.IOException;
    5. /**
    6. * 字节输入流的操作步骤(读)
    7. * 1、创建字节输入流对象
    8. * 2、调用read()方法读取数据,并把数据显示在控制台
    9. * 3、释放资源
    10. *
    11. * 读取数据的方式:
    12. * 1、int read() 一次读取一个字节数数组
    13. * 2、int read(byte [] b) 一次读取一个字节数组
    14. *
    15. * */
    16. public class FileInputStreamDemo_01 {
    17. public static void main(String[] args) throws IOException {
    18. //创建字节流输入流对象
    19. //FileInputStream fis = new FileInputStream("fis.txt");
    20. FileInputStream fis = new FileInputStream("FileOutputStreamDemo.java");
    21. //这里读取的是代码,但是注释会乱码,因为当前是char类型
    22. //2、调用read()方法读取数据,并把数据显示在控制台
    23. // int by = fis.read();
    24. // System.out.println("by = " + by);
    25. // System.out.println("(char)by = " + (char)by);
    26. //
    27. // by = fis.read();
    28. // System.out.println("by = " + by);
    29. // System.out.println("(char)by = " + (char)by);
    30. //
    31. // by= fis.read();
    32. // System.out.println("by = " + by);
    33. // System.out.println("(char)by = " + (char)by);
    34. //
    35. // by = fis.read();
    36. // System.out.println("by = " + by); //-1说明文件已经到达末尾了
    37. //用循环改进
    38. // int by = fis.read(); // 先读取一次
    39. // while(by!= -1){
    40. // System.out.print((char)by);
    41. // by = fis.read();
    42. // }
    43. //最终版:
    44. int by = 0;
    45. while((by = fis.read())!=-1){ //读取、赋值、判断
    46. System.out.print((char) by);
    47. }
    48. //3、释放资源
    49. fis.close();
    50. }
    51. }
    1. package cn.IO_InputStream;
    2. import java.io.FileInputStream;
    3. import java.io.FileNotFoundException;
    4. import java.io.FileOutputStream;
    5. import java.io.IOException;
    6. /**
    7. * 复制文本文件
    8. * 数据源:从哪里来
    9. * a.txt --- 读数据 --- FileInputStream
    10. * 目的地:到哪里去
    11. * b.txt --- 写数据 --- FileOutputStream
    12. *
    13. *
    14. * java.io.FileNotFoundException: a.txt (系统找不到指定的文件。)说明数据源不存在
    15. *
    16. * 上一次我们出现问题的原因是每次获取到一个字节是数据,就把该字节数据转换为了字符数据,然后输出在控制台
    17. * 这里复制中文没有出现问题而这一次是通过IO流读取数据,写到文本文件,读一个字节,就写入一个字节,‘没有做任何的转换,会自己做转换
    18. *
    19. *
    20. *
    21. * */
    22. public class CopyFileDemo {
    23. public static void main(String[] args) throws IOException {
    24. //封装数据源(读)
    25. FileInputStream fis = new FileInputStream("a.txt");
    26. //封住目的地(写)
    27. FileOutputStream fos = new FileOutputStream("b.txt");
    28. int by = 0;
    29. while((by=fis.read())!=-1){
    30. fos.write(by);
    31. }
    32. //释放资源
    33. fos.close();
    34. fis.close();
    35. }
    36. }

    计算机是如何识别什么时候该把两个字节转换为一个中文呢
    在计算机中,中文的存储分为两个字节,:
    第一个字节肯定是负数
    第二个字节是负数,也可能是正数,但是没有印象
    如:我—— -50
    爱—— -46

    复制数据:
    int by= 0;
    while(by = fis.read() != -1){
    fos.write(by);
    }

    1. package cn.IO_InputStream;
    2. import java.io.FileInputStream;
    3. import java.io.FileNotFoundException;
    4. import java.io.IOException;
    5. /**
    6. * 字节输入流的操作步骤(读)
    7. * 1、创建字节输入流对象
    8. * 2、调用read()方法读取数据,并把数据显示在控制台
    9. * 3、释放资源
    10. *
    11. * 读取数据的方式:
    12. * 1、int read() 一次读取一个字节数数组
    13. * 2、int read(byte [] b) 一次读取一个字节数组
    14. *
    15. * */
    16. public class FileInputStreamDemo_01 {
    17. public static void main(String[] args) throws IOException {
    18. //创建字节流输入流对象
    19. //FileInputStream fis = new FileInputStream("fis.txt");
    20. FileInputStream fis = new FileInputStream("FileOutputStreamDemo.java");
    21. //这里读取的是代码,但是注释会乱码,因为当前是char类型
    22. //2、调用read()方法读取数据,并把数据显示在控制台
    23. // int by = fis.read();
    24. // System.out.println("by = " + by);
    25. // System.out.println("(char)by = " + (char)by);
    26. //
    27. // by = fis.read();
    28. // System.out.println("by = " + by);
    29. // System.out.println("(char)by = " + (char)by);
    30. //
    31. // by= fis.read();
    32. // System.out.println("by = " + by);
    33. // System.out.println("(char)by = " + (char)by);
    34. //
    35. // by = fis.read();
    36. // System.out.println("by = " + by); //-1说明文件已经到达末尾了
    37. //用循环改进
    38. // int by = fis.read(); // 先读取一次
    39. // while(by!= -1){
    40. // System.out.print((char)by);
    41. // by = fis.read();
    42. // }
    43. //最终版:
    44. int by = 0;
    45. while((by = fis.read())!=-1){ //读取、赋值、判断
    46. System.out.print((char) by);
    47. }
    48. //3、释放资源
    49. fis.close();
    50. }
    51. }
    1. package cn.IO_InputStream;
    2. import java.io.FileInputStream;
    3. import java.io.FileOutputStream;
    4. import java.io.IOException;
    5. /**
    6. * 需求需求:把e:\\010_注释.mp4复制到当前目录下
    7. * 数据源
    8. * e:\\010_z注释.mp4 --- 读数据 ---FileInputStream
    9. * 目的地:
    10. * copy.mp4 ---写数据--- FileOutputStream
    11. *
    12. *
    13. * */
    14. public class CopyMp4Demo_02 {
    15. public static void main(String[] args) throws IOException {
    16. //封装数据源
    17. FileInputStream fis = new FileInputStream("e:\\010_注释.mp4");
    18. //封装目的地
    19. FileOutputStream fos = new FileOutputStream("010_注释.mp4");
    20. //复制数据
    21. int by = 0;
    22. while((by = fis.read())!=-1){
    23. fos.write(by);
    24. }
    25. byte[] bys = new byte[1024]; // java缓冲区效果
    26. int len = 0;
    27. while((len = fis.read(bys))!=-1){
    28. fos.write(bys,0,len);
    29. }
    30. //释放资源
    31. fos.close();
    32. fis.close();
    33. }
    34. }

    IO流的分类:

    1. /**
    2. * IO流分类:
    3. * 字节流:
    4. * InputStream:(输入流(读))
    5. * FileInputStream
    6. * BufferedInputStream
    7. * OutputStream(输出流(写))
    8. * FileOutputStream
    9. * BufferedOutputStream
    10. *
    11. * 字符流:
    12. * reader:(字符输入流(读))
    13. * FileReader
    14. * BufferedReader
    15. * writer:(字符输出流(写))
    16. * FileWriter
    17. * BufferedWrite
    18. *
    19. * */
    • 为什么要close
      * 1、让流对象变成垃圾,这样就可以被垃圾回收器回收
    • 2、通知系统去释放跟该文件相关的资源,如果不释放,那么该文件就一直无法关闭,占用系统资源

    编码表:由现实世界的字符和对应的数值组成的一张表
    ASCII码表:最高位位符号位,其余为数值位
    ‘a’ 97
    ‘A’ 65
    ‘0’ 48

    ISO-8859-1: 拉码表 8位表示一个数据

    GB2312: 中国的中文编码表
    GBK: 中国的中文编码表升级,融合了更多的中文文字符号
    GB19030 :GBK的取代版本
    BIG-5码: 通用于台湾、香港地区的一个繁体字编码方案,俗称“大五码”
    Unicode 国际编码表,融合了各种文字;
    所有文字都是用两个字节表示,java语言使用的就是Unicode

    UTF-8 最多三个字节表示一个字符
    能用一个字符用一个字符表示,(ASCII兼容)
    一个表示不了就使用两个,实在不行就使用三个

    1. package cn.IO;
    2. import java.io.UnsupportedEncodingException;
    3. import java.util.Arrays;
    4. /**
    5. * String(byte[] bytes, String charsetName) 通过指定的字符集解码字节数组
    6. * byte [] getBytes(String charsetName) 使用指定的字符集和把字符串编码为字节数组
    7. *
    8. * 编码:String --- byte[]
    9. * 把看的懂得变成看不懂的
    10. * 解码:byte[] --- String
    11. * 把看不懂的变成看得懂的
    12. *
    13. * */
    14. public class StringDemo {
    15. public static void main(String[] args) throws UnsupportedEncodingException {
    16. String s = "你好";
    17. //String --- byte[]
    18. byte[] bys = s.getBytes();
    19. System.out.println(Arrays.toString(bys)); //[-28, -67, -96, -27, -91, -67]
    20. byte[] bys2 = s.getBytes("GBK ");
    21. System.out.println(Arrays.toString(bys2)); //[-60, -29, -70, -61]
    22. //byte[] --- String
    23. String ss = new String(bys);
    24. System.out.println(ss);
    25. String sss = new String(bys2);
    26. System.out.println("sss = " + sss);
    27. }
    28. }
    1. package cn.IO;
    2. import java.io.FileNotFoundException;
    3. import java.io.FileOutputStream;
    4. import java.io.IOException;
    5. import java.io.OutputStreamWriter;
    6. /**
    7. * OutputStreamWriter(OutputStream out) 根据默认编码把字节流数据转换为字符流
    8. * OutputStreamWriter(OutputStream out ,String charsetName) 根据指定编码转把字节流数据转换为字符流
    9. * 把字节流转换为字符流
    10. * 字符流= 字节流+编码表
    11. *
    12. * */
    13. public class OutputStreamWriterDemo {
    14. public static void main(String[] args) throws IOException {
    15. //创建对象
    16. //OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("osw.txt")); //默认编码
    17. OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("osw.txt"),"Unicode"); //制定编码
    18. //写数据
    19. osw.write("中国");
    20. //释放资源
    21. osw.close();
    22. }
    23. }
    1. package cn.IO;
    2. import java.io.FileOutputStream;
    3. import java.io.IOException;
    4. import java.io.OutputStreamWriter;
    5. /**
    6. * OutputStreamWriter的方法:
    7. * public void write(int c) 写一个字符
    8. * public void write(char[] cbuf) 写一个字符数组
    9. * public void write(char[] cbuf , int off ,int len) 写一个字符数组的一部分
    10. * public void write(String str) 写一个字符串
    11. * public void write(String str ,int off ,int len ) 写一个字符串的一部分
    12. *
    13. * 面试题: close() 和flush()的区别:
    14. * 1、close() 关闭流对象,但是先刷新一次缓冲区,关闭之后,流对象就不能再使用了
    15. * 2、flush()仅仅刷新缓冲区,刷新之后,流对象还可以使用
    16. *
    17. *
    18. * */
    19. public class OutputStreamWriterDemo_02 {
    20. public static void main(String[] args) throws IOException {
    21. OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("osw2"));
    22. //写数据
    23. //public void write(int c) 写一个字符
    24. // osw.write('a');
    25. // osw.write(97);
    26. //public void write(char[] cbuf) 写一个字符数组
    27. // char[] chs = {'a','b','c','d','e'};
    28. // osw.write(chs);
    29. //public void write(char[] cbuf , int off ,int len) 写一个字符数组的一部分
    30. //osw.write(chs,1,4); //获取两个会报错
    31. //public void write(String str) 写一个字符串
    32. //osw.write("我爱林青霞");
    33. //public void write(String str ,int off ,int len ) 写一个字符串的一部分
    34. osw.write("我爱林青霞",2,3);
    35. osw.flush(); //刷新缓冲区,因为字符流数据没有直接进文件,而在缓冲区,所有刷新
    36. osw.write("我爱林青霞",2,3);
    37. osw.close();
    38. // osw.write("我爱林青霞",2,3); //写这里会报错
    39. }
    40. }
    1. package cn.test;
    2. import java.io.FileReader;
    3. import java.io.FileWriter;
    4. import java.io.IOException;
    5. /**
    6. * 由于常见的操作都是使用本地默认编码,所以不用指定编码
    7. * 而转换流的长度有点长,java就提供了其子类使用
    8. * OutputStreamWriter = FileOutputStream+ 编码表(GBK)
    9. * FileWriter = FilOutputStream+编码表(GBK)
    10. *
    11. * InputStreamReader = FileInputStream + 编码表(GBK)
    12. * FileReader = FileInputStream + 编码表(GBK)
    13. *
    14. *
    15. * 需求;把当前项目目录下的a.txt文件内容复制到当前项目目录下的b.txt
    16. * 数据源:
    17. * a.txt ---读取数据---字节转换流---InputStreamReader --- FileReader
    18. * 目的地:
    19. * b.txt ---写入数据---字节转换流---OutputStreamWriter ---FileWriter
    20. *
    21. * */
    22. public class CopyFileDemo_02 {
    23. public static void main(String[] args) throws IOException {
    24. //数据源
    25. FileReader fr = new FileReader("a.txt");
    26. //目的地
    27. FileWriter fw = new FileWriter("b.txt");
    28. //读数据
    29. // int ch = 0;
    30. // while((ch = fr.read())!=-1){
    31. // fw.write((char) ch);
    32. // }
    33. char[] chars = new char[1024];
    34. int len = 0;
    35. while((len = fr.read(chars))!=-1){
    36. fw.write(chars,0,len);
    37. }
    38. //释放资源
    39. fr.close();
    40. fw.close();
    41. }
    42. }
    1. package cn.Bufered;
    2. import java.io.*;
    3. /**
    4. * * 需求;把当前项目目录下的a.txt文件内容复制到当前项目目录下的b.txt
    5. * * 数据源:
    6. * * a.txt ---读取数据---字节转换流---InputStreamReader --- FileReader
    7. * * 目的地:
    8. * * b.txt ---写入数据---字节转换流---OutputStreamWriter ---FileWriter
    9. *
    10. * */
    11. public class CopyDemo_01 {
    12. public static void main(String[] args) throws IOException {
    13. //封装数据源
    14. BufferedReader br = new BufferedReader(new FileReader("a.txt"));
    15. //封装目的地
    16. BufferedWriter bw = new BufferedWriter(new FileWriter("b.txt"));
    17. //读数据
    18. // int ch = 0;
    19. // while((ch = br.read())!=-1){
    20. // bw.write(ch);
    21. // }
    22. char[] chars = new char[1024];
    23. int len = 0;
    24. while((len = br.read(chars))!= -1){
    25. bw.write(chars,0,len);
    26. bw.flush();
    27. }
    28. //释放资源
    29. br.close();
    30. bw.close();
    31. }
    32. }
    1. package cn.Bufered;
    2. import java.io.*;
    3. /**
    4. * 字符流为了搞笑读写,也提供了字符缓冲流
    5. * BufferedWriter:字符输出流(写)
    6. * 将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。
    7. * 可以指定缓冲区的大小,或者接受默认的大小。在大多数情况下,默认值就足够大了。
    8. *
    9. * BufferedReader:字符输入流(读)
    10. *
    11. *
    12. * */
    13. public class BufferedWriterDemo_01 {
    14. public static void main(String[] args) throws IOException {
    15. //BufferedWriter(Writer out)
    16. //BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("bw.txt")));
    17. BufferedWriter bw = new BufferedWriter(new FileWriter("bw.txt"));
    18. //写数据
    19. // bw.write("hello"+"\n");
    20. // bw.write("java"+"\n");
    21. // bw.write("world"+"\n");
    22. bw.close();
    23. }
    24. }
    1. package cn.Bufered;
    2. import java.io.BufferedReader;
    3. import java.io.FileReader;
    4. import java.io.IOException;
    5. /**
    6. * BufferedReader:
    7. * 从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。
    8. * 可以指定缓冲区的大小,或者可使用默认的大小。大多数情况下,默认值就足够大了。
    9. * BufferedReader(Reader in)
    10. *
    11. * */
    12. public class BufferedReaderDemo_01 {
    13. public static void main(String[] args) throws IOException {
    14. //创建字符缓冲输入流对象
    15. BufferedReader br = new BufferedReader(new FileReader("bw.txt"));
    16. //
    17. // int ch = 0;
    18. // while ((ch = br.read())!=-1){
    19. // System.out.print((char)ch);
    20. // }
    21. char [] chars = new char[1024];
    22. int len = 0;
    23. while((len = br.read(chars))!=-1){
    24. System.out.println(new String(chars,0,len));
    25. }
    26. br.close();
    27. }
    28. }
    1. package cn.Bufered;
    2. import java.io.*;
    3. /**
    4. * 字符 缓冲流的特殊方法:
    5. * BufferedWriter:
    6. * public void newLine() 根据 系统来决定换行符
    7. * BufferedReader:
    8. * public String readLine() 一次读取一行数据
    9. * 包含该行内容的字符串,不包含任何行终止符,如果已到达流末尾,则返回 null
    10. *
    11. *
    12. * */
    13. public class BufferedDemo {
    14. public static void main(String[] args) throws IOException {
    15. //创建字符缓冲数据流对象
    16. // BufferedWriter bw = new BufferedWriter(new FileWriter("bw2.txt"));
    17. //
    18. // for(int x = 0;x <10;x++){
    19. // bw.write("hello"+x);
    20. // //bw.write("\r\n");
    21. // bw.newLine();
    22. // bw.flush();
    23. //
    24. //
    25. // }
    26. //
    27. //
    28. // //释放资源
    29. // bw.close();
    30. //write();
    31. read();
    32. }
    33. private static void read() throws IOException{
    34. //创建字符缓冲输入流
    35. BufferedReader br = new BufferedReader(new FileReader("bw2.txt"));
    36. // String line = br.readLine();
    37. // System.out.println("line = " + line); //hello0
    38. // line = br.readLine();
    39. // System.out.println("line = " + line); //hello1
    40. String line = null;
    41. while((line = br.readLine())!=null){
    42. System.out.println(line);
    43. }
    44. br.close();
    45. }
    46. private static void write() throws IOException {
    47. BufferedWriter bw = new BufferedWriter(new FileWriter("bw2.txt"));
    48. for(int x = 0;x <10;x++){
    49. bw.write("hello"+x);
    50. //bw.write("\r\n");
    51. bw.newLine();
    52. bw.flush();
    53. }
    54. //释放资源
    55. bw.close();
    56. }
    57. }
    1. package cn.Bufered;
    2. import java.io.*;
    3. /**
    4. * * 需求;把当前项目目录下的a.txt文件内容复制到当前项目目录下的b.txt
    5. * * 数据源:
    6. * * a.txt ---读取数据---字节转换流---InputStreamReader --- FileReader
    7. * * 目的地:
    8. * * b.txt ---写入数据---字节转换流---OutputStreamWriter ---FileWriter
    9. *
    10. * */
    11. public class CopyDemo_02 {
    12. public static void main(String[] args) throws IOException {
    13. //封装数据源
    14. BufferedReader br = new BufferedReader(new FileReader("a.txt"));
    15. //封装目的地
    16. BufferedWriter bw = new BufferedWriter(new FileWriter("b.txt"));
    17. //读写数据
    18. String line = null;
    19. while((line = br.readLine())!=null){
    20. bw.write(line);
    21. bw.newLine(); //写换行符
    22. bw.flush();
    23. }
    24. //释放资源
    25. br.close();
    26. bw.close();
    27. }
    28. }

    Screenshot_2020-07-30-12-48-20.png
    IO(复制文件的5中方式)重点是:第五种

    1. package cn.test;
    2. import java.io.*;
    3. /**
    4. * 复制文本文件
    5. * 分析:
    6. * 1、复制数据用记事本打开兵并且可以读懂,就用字符流,否则用字节流,通过分析,使用字符流更方便
    7. * 而字符流有5种方式(掌握第5种)
    8. * 数据源: a.txt ---FileReader ---BufferedReader
    9. * 目的地: e:\\b.txt---FileWriter ---BufferedWriter
    10. *
    11. * */
    12. public class CopyFileDemo_03 {
    13. public static void main(String[] args) throws IOException {
    14. String srcString= "a.txt";
    15. String destString = "e:''b.txt";
    16. // method1(srcString,destString);
    17. // method2(srcString,destString);
    18. // method3(srcString,destString);
    19. // method4(srcString,destString);
    20. method5(srcString,destString);
    21. }
    22. //字符缓冲流一次读写一个字符串(掌握)
    23. private static void method5(String srcString, String destString) throws IOException {
    24. BufferedReader br = new BufferedReader(new FileReader(srcString));
    25. BufferedWriter bw = new BufferedWriter(new FileWriter(destString));
    26. String line = null;
    27. while ((line = br.readLine()) != null) {
    28. bw.write(line);
    29. bw.newLine(); //换行
    30. bw.flush();
    31. }
    32. bw.close();
    33. br.close();
    34. }
    35. //高效字符缓冲流(一次一个数组)
    36. private static void method4(String srcString, String destString) throws IOException {
    37. BufferedReader br = new BufferedReader(new FileReader(srcString));
    38. BufferedWriter bw = new BufferedWriter(new FileWriter(destString));
    39. char[] chars = new char[1024];
    40. int len = 0;
    41. while ((len = br.read(chars)) != -1) {
    42. bw.write(chars, 90, len);
    43. }
    44. bw.close();
    45. br.close();
    46. }
    47. //高效字符缓冲流(一次一个字符)
    48. private static void method3(String srcString, String destString) throws IOException {
    49. BufferedReader br = new BufferedReader(new FileReader(srcString));
    50. BufferedWriter bw = new BufferedWriter(new FileWriter(destString));
    51. int ch = 0;
    52. while ((ch = br.read()) != -1) {
    53. bw.write(ch);
    54. }
    55. br.close();
    56. bw.close();
    57. }
    58. private static void method2(String srcString, String destString) throws IOException {
    59. FileReader fr = new FileReader(srcString);
    60. FileWriter fw = new FileWriter(destString);
    61. //一次读写一个字符数组
    62. char[] chars = new char[1024];
    63. int len = 0;
    64. while ((len = fr.read(chars)) != -1) {
    65. fw.write(chars, 0, len);
    66. }
    67. fr.close();
    68. fw.close();
    69. }
    70. //基本字符流,一次读写一个
    71. private static void method1(String srcString, String destString) throws IOException {
    72. FileReader fr = new FileReader(srcString);
    73. FileWriter fw = new FileWriter(destString);
    74. int ch = 0;
    75. while ((ch = fr.read()) != -1) {
    76. fw.write(ch);
    77. }
    78. fr.close();
    79. fw.close();
    80. }
    81. }

    掌握第四种

    1. package cn.test;
    2. import java.io.*;
    3. /**
    4. * 复制图片:
    5. * 分析:
    6. * 复制数据用记事本打开可以读懂就是用字符流,而读不懂就使用字节流;
    7. * 而字节流有四种方式,掌握第四种
    8. *
    9. * 数据源:e:\\证件照.jpg ---FileInputStream---BufferedInputStream
    10. * 目的地:证件照。jpg ---FileOutputStream---BufferedOutputStrsam
    11. *
    12. * */
    13. public class CopyImageDemo {
    14. public static void main(String[] args) throws IOException {
    15. //使用字符串作为路径
    16. // String srcString="e:\\证件照.jpg";
    17. // String destString= "证件照.jpg";
    18. // method1(srcString,destString);
    19. // method2(srcString,destString);
    20. // method3(srcString,destString);
    21. // method4(srcString,destString);
    22. //使用File对象作为参数
    23. File srcfile = new File("e:\\证件照.jpg");
    24. File destfile = new File("证件照.jpg");
    25. //method1(srcfile,destfile);
    26. // method2(srcfile,destfile);
    27. // method3(srcfile,destfile);
    28. method4(srcfile,destfile);
    29. }
    30. //字节缓冲区,一次字符数组
    31. private static void method4(File srcfile, File destfile) throws IOException {
    32. BufferedInputStream bis = new BufferedInputStream(new FileInputStream(srcfile));
    33. BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(destfile));
    34. byte[] bytes = new byte[1024];
    35. int len = 0;
    36. while ((len = bis.read(bytes)) != -1) {
    37. bos.write(bytes, 0, len);
    38. }
    39. }
    40. //字节缓冲流,一次一个字节
    41. private static void method3(File srcfile, File destfile) throws IOException {
    42. BufferedInputStream bis = new BufferedInputStream(new FileInputStream(srcfile));
    43. BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(destfile));
    44. int by = 0;
    45. while ((by = bis.read()) != -1) {
    46. bos.write(by);
    47. }
    48. }
    49. //一次读写一个字符数组
    50. private static void method2(File srcfile, File destfile) throws IOException {
    51. FileInputStream fis = new FileInputStream(srcfile);
    52. FileOutputStream fos = new FileOutputStream(destfile);
    53. byte[] bytes = new byte[1024];
    54. int len = 0;
    55. while ((len = fis.read(bytes)) != -1) {
    56. fos.write(bytes, 0, len);
    57. }
    58. fis.close();
    59. fos.close();
    60. }
    61. //一次读写一个字节
    62. private static void method1(File srcfile, File destfile) throws IOException {
    63. FileInputStream fis = new FileInputStream(srcfile);
    64. FileOutputStream fos = new FileOutputStream(destfile);
    65. int by = 0;
    66. while ((by = fis.read()) != -1) {
    67. fos.write(by);
    68. }
    69. fis.close();
    70. fos.close();
    71. }
    72. }
    1. package cn.test;
    2. import java.io.BufferedWriter;
    3. import java.io.FileWriter;
    4. import java.io.IOException;
    5. import java.util.ArrayList;
    6. /**
    7. * 需求:把ArrayList集合中的字符串数据存储到文本文件
    8. *
    9. * 分析:
    10. * ArrayList集合里面存储的是字符串
    11. * 遍历ArrayList集合把数据获取到,然后存储到文本文件
    12. * 文本文件使用字符流
    13. *
    14. * 数据源 : ArrayList<String>-- 遍历得到每一个字符串数据
    15. * 目的地: a.txt---FileWriter ---BufferedWrite
    16. *
    17. * */
    18. public class ArrayListToFileDemo {
    19. public static void main(String[] args) throws IOException {
    20. //创建集合对象
    21. ArrayList<String> array = new ArrayList<>();
    22. array.add("hello");
    23. array.add("world");
    24. array.add("java");
    25. //封装数据源(目的地)
    26. BufferedWriter bw = new BufferedWriter(new FileWriter("a.txt"));
    27. //遍历集合
    28. for(String s : array){
    29. //写数据
    30. bw.write(s);
    31. bw.newLine();
    32. bw.flush();
    33. }
    34. bw.close();
    35. }
    36. }
    1. package cn.test;
    2. import java.io.BufferedReader;
    3. import java.io.FileReader;
    4. import java.io.IOException;
    5. import java.util.ArrayList;
    6. /**
    7. *
    8. * 需求:从文本文件读取数据(每一行为椅子字符串数据) 到集合总并遍历
    9. * 分析:
    10. * 数据源是一个文本文件
    11. * 目的地是一个集合,元素是字符串
    12. *
    13. * 数据源 b2.txt ---FileReader ---BufferedReader
    14. * 目的地 ArrayList<String>
    15. *
    16. *
    17. * */
    18. public class FileToAArrayListDemo {
    19. public static void main(String[] args) throws IOException {
    20. //封装数据源
    21. BufferedReader br =new BufferedReader(new FileReader("b2.txt"));
    22. //封装目的地(创建集合对象)
    23. ArrayList<String> array = new ArrayList<>();
    24. //读取数据,存到集合中
    25. String line = null;
    26. while((line = br.readLine())!=null){
    27. array.add(line);
    28. }
    29. br.close();
    30. //遍历集合
    31. for(String s: array){
    32. System.out.println("s = " + s);
    33. }
    34. }
    35. }
    1. package cn.test;
    2. import java.io.BufferedReader;
    3. import java.io.FileReader;
    4. import java.io.IOException;
    5. import java.util.ArrayList;
    6. import java.util.Random;
    7. /**
    8. * 需求:b2.txt文件存储了几个名称,写一个程序 实现随机获取一个人的名字
    9. * 分析:
    10. * 1、把文本文件的数据存储到集合中
    11. * 2、随机产生一个索引
    12. * 3.根据该索引获取一个值
    13. *
    14. * */
    15. public class GetName {
    16. public static void main(String[] args) throws IOException {
    17. //把文本文件的数据存到集合中(f封装数据源)
    18. BufferedReader br =new BufferedReader(new FileReader("b2.txt"));
    19. //创建集合对象(封装目的地)
    20. ArrayList<String> array = new ArrayList<>();
    21. //读取数据
    22. String line = null;
    23. while ((line = br.readLine())!=null){
    24. array.add(line);
    25. }
    26. //释放资源
    27. br.close();
    28. //随机产生一个索引
    29. Random r = new Random();
    30. int index = r.nextInt(array.size());
    31. //根据该索引获取一个值
    32. String name = array.get(index);
    33. System.out.println("幸运者是: " + name);
    34. }
    35. }
    1. package cn.IO;
    2. import java.io.FileReader;
    3. import java.io.IOException;
    4. import java.io.LineNumberReader;
    5. /**
    6. * BufferedReader
    7. * LineNumberReader
    8. * public int getLineNumber()获取当前行号
    9. * public void setLineNumber(int lineNumber)
    10. *
    11. * */
    12. public class LineNumberReaderDemo {
    13. public static void main(String[] args) throws IOException {
    14. LineNumberReader lnr = new LineNumberReader(new FileReader("a.txt"));
    15. lnr.setLineNumber(10);//行号从10以后不包括10
    16. String line = null;
    17. while ((line = lnr.readLine()) != null) {
    18. System.out.println(lnr.getLineNumber() + ":" + line);//1:hello2:world3:java
    19. }
    20. lnr.close();
    21. }
    22. }