[递归]

  1、 在函数自身内部,调用函数本身的方式,称为递归。

   2、 注意: 递归包括递进去、归出来两步。
     首先,依次执行【函数调自身语句】上半部分的代码,直到最里层。 {递进去}
     然后,再从最里层开始,依次执行【函数调自身语句】下半部分的代码。 {归出来}
   3、 递归必须通过合适的语句,及时的跳出。 否则,容易造成死循环。

  1. public static int num=0;//
  2. public static void test(){
  3. System.out.println("这是一个函数");
  4. num++;
  5. if(num<=2){
  6. test();//if()不成立不再调用自己
  7. }//先执行三次
  8. System.out.println("hahah");//执行完num大于2,hahah在执行之前的三次
  9. }
  10.  
  11. //test类
  12. test();

结果:

练习:5的阶乘

方法1:

  1. /**
  2. * 用递归实现5的!
  3. */
  4. static int jie=1;
  5. public static long jiecheng(int n){
  6. jie*=n;
  7. n--;
  8. if(n>=1){
  9. jiecheng(5);
  10. }
  11. return jie;
  12. }
  13.  
  14. //Test类:
  15. System.out.println(jiecheng(5));

方法2:

  1. public static int test(int number){//
  2. if(number == 1){
  3. return 1;
  4. }else{
  5. return number * test(number - 1);
  6. }
  7.  
  8. }
  9.  
  10. //Test类:
  11. System.out.println(test(5));

1、[File类]

(1) 作用: 用于对磁盘文件进行操作。 删除、创建等。
 (2) 三种常用的构造函数:
   ① File file1 = new File("F:\\test");
   直接传入一个路径,拿到一个文件或者是文件夹。
   ② File file2 = new File("F:\\test","test.txt");
     第一个参数传入父路径、 第二个参数传入子路径或者文件。
   ③ File file3 = new File(file1,"test.txt");
  第一个参数传入一个父路径的file对象, 第二个参数传入子路径或者文件。
 (3) 路径的表示:
    文件夹的分隔,可以使用"/"(通常用于Linux系统,Windows也适用)
    也可以使用"\\"(通常用于Windows),注意一个\需要进行转义。
 (4)方法:

    1.检测文件是否可读。

    System.out.println(file1.canRead());

    2.检测文件是否可写。

    System.out.println(file2.canWrite());

    3. 比较两个对象是否相等。
    System.out.println(file2.equals(file3));
    4. 检测文件是否存在。
    System.out.println(file1.exists());
    5. 取到文件的绝对路径
    System.out.println(file1.getAbsolutePath());
    6. 取到文件名或者文件夹名
         System.out.println(file2.getName());
    7. 取到当前文件或文件夹的父路径
    System.out.println(file1.getParent());
    8. 检测当前文件是否是绝对路径
    System.out.println(file1.isAbsolute());
    9. 检测当前路径是否是目录
    System.out.println(file2.isDirectory());
   10. 检测当前路径是否是文件
    System.out.println(file1.isFile());
   11. 删除文件: 删除成功返回true,删除失败返回false
    如果删除的是文件夹,则只能删除空文件夹,否则删除失败!
    System.out.println(file1.delete());
   12.创建一个新文件。 创建失败返回false

  1. try {
  2. System.out.println(file3.createNewFile());
  3. } catch (IOException e) {
  4. // TODO Auto-generated catch block
  5. e.printStackTrace();
  6. }

  13. 创建一个文件夹。只有当文件夹不存在时,才能创建成功。
  ①mkdir: 只能创建一层目录,如果倒数第二层目录也不存在,将创建失败。
  ② mkdirs: 可以创建多层目录,无论有几层不存在,都可以依次创建。

  1. System.out.println(file1.mkdir());
  2. System.out.println(file1.mkdirs());

  14.获得文件所在分区的总大小和可用大小,以字节B为单位。

  1. System.out.println(file1.getTotalSpace());
  2. System.out.println(file1.getUsableSpace());

  15.返回当前文件或文件夹的大小。单位B
   System.out.println(file2.length());
   list(): 返回当前目录中的所有文件和文件夹的名字。 返回值类型为String数组
   可以在参数中,传入FilenameFilter接口的实现类对象,表示对列表中的所有文件进行遍历过滤。
   需要重写accept方法,如果保留当前文件return true ,如果不要当前文件,return false

  1. String[] list = file1.list(new FilenameFilter() {
  2. // dir: 表示包含当前文件的父路径;
  3. // name: 表示当前文件名
  4. public boolean accept(File dir, String name) {
  5. if(name.endsWith(".txt")){
  6. return true;
  7. }else{
  8. return false;
  9. }
  10. }
  11. });
  12. for (String item : list) {
  13. System.out.println(item);
  14. }

  16..listFiles(): 返回当前目录中所有的文件和文件夹的路径。 返回值类型为File数组。
  同样可以对文件进行过滤:
   ① 与list()一样,使用FilenameFilter进行过滤;
   ② 使用FileFilter接口的实现类,进行过滤。

  1. File[] files = file1.listFiles(new FileFilter() {
  2. // pathname 表示当前文件的全路径(包括路径名和文件名)。
  3. public boolean accept(File pathname) {
  4. if(pathname.getName().endsWith(".txt")){
  5. return true;
  6. }else{
  7. return false;
  8. }
  9. }
  10. });
  11. for (File file : files) {
  12. System.out.println(file.getParent()+"-----"+file.getName());
  13. }

  17. 重命名一个文件。 要求传入一个新文件名的file对象。
    File file4 = new File("F:\\test\\test08.txt");
    System.out.println(file1.renameTo(file4));
  18.只读。
    System.out.println(file1.setReadOnly());

  19.最后更新时间。
    System.out.println(file1.setLastModified(new Date().getTime()));

[Java中的IO流]  

  1、 根据流的方向: 输入流和输出流。   

        根据读取文字的大小: 字节流和字符流。
     (字节流按字节读取,读取中文时容易乱码; 字符流按照字符读取,通常用于读取中文)
     根据读取的方式: 节点流和缓存流。

     fis = new FileInputStream("F:/test.txt");

  2.如果第二个参数省略,或传入false,则表示每次写入时将原文件清空,从文件头部开始写入。
    如果第二个参数传入true,则表示不清空原文件,在文件末尾处追加新内容。

  3.如果第二个参数省略,或传入false,则表示每次写入时将原文件清空,从文件头部开始写入。

   如果第二个参数传入true,则表示不清空原文件,在文件末尾处追加新内容。

  4.按照字节,一个一个字节读取文件。

  1.         int n = -1;
  2. while ((n = fis.read()) != -1) {
  3. sb.append((char)n);
  4. }
  5. System.out.println(sb);

  5.将byte数组直接声明为输入流的长度,一次性读出所有文字。

  1. byte[] bytes = new byte[fis.available()];
  2. fis.read(bytes);
  3. sb.append(new String(bytes));
  4. System.out.println(sb);

  6.一次读取1024个字节。

  1.   byte[] bytes = new byte[1024];
  2. int n = -1;
  3.   while ((n = fis.read(bytes)) != -1) {
  4. sb.append(new String(bytes));
  5. }
  6. System.out.println(sb);

  7.将字符串转为Byte数组,并通过输出流写入文件。

  1. fos.write("12345".getBytes());
  2. System.out.println(sb);

  8.finally 无论上述代码是否会出现异常,都会执行的一段代码; 

     通常用于关闭各种资源。

  1. finally {
    /**
  2. * finally 无论上述代码是否会出现异常,都会执行的一段代码;
  3. * 通常用于关闭各种资源。
  4. */
  5. try {
  6. fis.close();
  7. fos.close();
  8. } catch (IOException e) {
  9. // TODO Auto-generated catch block
  10. e.printStackTrace();
  11. }
    }

2.[BufferedInputStream、BufferedOutputStream] 

     继承自java.io.FilterOutputStream(此类是过滤输出流的所有类的超类)
  1、 作用: 在基本流的基础上进行包装,读取或者写入文件时,将通过缓存进行。
   即,先将内容写入到缓存区,缓存区满以后再进行读取或写入操作。
   可以大大减小文件的操作次数,提高写入效率。
  2、 缓存流的使用:
  在基本流的基础之上,进行包装:
  new BufferedInputStream(new FileInputStream("F:/test.txt"));
  这种写法,我们称之为IO链,IO关闭时只需要关闭最外层流,内层流将自动关闭。
  3、 BufferedOutputStream在关闭前,通常调用bos.flush();
  表示关闭前将缓存进行刷新,将缓存区剩余未满的内容写入文件。
  但是一般.close()方法,自带刷新功能。

  1. BufferedInputStream bis = null;
  2. BufferedOutputStream bos = null;
  3. try {
  4. bis = new BufferedInputStream(new FileInputStream("F:/test.txt"));
  5.  
  6. bos = new BufferedOutputStream(new FileOutputStream("F:/out.txt",false));
  7.  
  8. StringBuffer sb = new StringBuffer();
  9.  
  10. int n = -1;
  11. while ((n = bis.read()) != -1) {
  12. sb.append((char)n);
  13. }
  14. System.out.println(sb);
  15.  
  16. bos.write(sb.toString().getBytes());
  17.  
  18. } catch (FileNotFoundException e) {
  19. e.printStackTrace();
  20. } catch (IOException e) {
  21. e.printStackTrace();
  22. } finally {
  23. /**
  24. * finally 无论上述代码是否会出现异常,都会执行的一段代码;
  25. * 通常用于关闭各种资源。
  26. */
  27. try {
  28. // fis.close();
  29. bis.close();
  30. // fos.close();
  31.  
  32. /**
  33. * 在程序最后,刷新缓存流,将缓存流中未满的内容,写入到文件中。
  34. * 调用close()方法,将自动刷新。
  35. */
  36. bos.flush();
  37. bos.close();
  38. } catch (IOException e) {
  39. // TODO Auto-generated catch block
  40. e.printStackTrace();
  41. }
  42. }

3.[DataOutputStream/DataInputStream]   

  1.采用二进制对文件进行读写操作。
     与基本流相比,可以直接读写Java中的基本数据类型。
     另外,如果操作的文件是一个二进制文件,需要使用DataOutputStream替代FileOutputStream。
     同样,Data系列的流,也有read和write方法,操作与基本相同。
 注意: 使用DataOutputStream写入文件为二进制文件,只能使用DataInputStream进行读取。

  1. String name = "zhangsan";
  2. int age = 12;
  3. double height = 178.5;
  4. String ads = "山东烟台";
  5.  
  6. DataOutputStream dos = null;
  7. DataInputStream dis = null;
  8.  
  9. try {
  10. dos = new DataOutputStream(new FileOutputStream("F:\\zhangsan.txt"));
  11. dos.writeUTF(name);
  12. dos.writeInt(age);
  13. dos.writeDouble(height);
  14. dos.writeUTF(ads);
  15.  
  16. dis = new DataInputStream(new FileInputStream("F:\\zhangsan.txt"));
  17. String uname = dis.readUTF();
  18. int uage = dis.readInt();
  19. double uheight = dis.readDouble();
  20. String uads = dis.readUTF();
  21.  
  22. System.out.println(uname+"---"+uage+"---"+uheight+"---"+uads);
  23. } catch (FileNotFoundException e) {
  24. e.printStackTrace();
  25. } catch (IOException e) {
  26. e.printStackTrace();
  27. } finally{
  28. try {
  29. dis.close();
  30. dos.flush();
  31. dos.close();
  32. } catch (IOException e) {
  33. e.printStackTrace();
  34. }
  35. }

4.[ObjectOutputStream/ObjectInputStream]

  直接继承自:java.io.OutputStream 抽象类
   1、 与基本流相同,可以直接使用read、write方法进行读写。
   2、 与DateInputStream相同,可以对Java基本数据类型进行直接读写: readInt() writeDouble()
   3、 可以只用readObject() 和 writeObject() 直接对对象进行操作。
[对象的序列化和反序列]
  1、 对象的序列化: 将程序中的对象,持久化的保存在文件中的过程。 ObjectOutputStream
  2、 对象的反序列化: 将文件中保存的对象,重新读取到程序中的过程呢。ObjectInputStream
   如果,要将对象进行序列操作,那么实体类必须实现可序化接口:
   class Person implements Serializable{}
注意: 当一个实体类,实现可序化接口后,可以添加一个序列化版本号ID。
 (实现序列化接口后,根据警告提示,选择:Adds a generated serial version ID)
  会自动生成一个静态属性:
   private static final long serialVersionUID = -1954048587316264652L;
  添加以后,可以用ID表示序列化和反序列时操作的对象,是同一个对象。
  如果不添加版本ID,当序列化一个对象后,如果实体类属性有增删,再进行反序列化时,会造成错误。
  因为系统认为这已经不是一个类。

  1. Person zhangsan = new Person("张三", 12, 178.4, "山东烟台杰瑞教育");
  2.  
  3. ObjectOutputStream oos = null;
  4. ObjectInputStream ois = null;
  5.  
  6. try {
  7. // 对象的序列化
  8. oos = new ObjectOutputStream(new FileOutputStream("F:/user.txt"));
  9. oos.writeObject(zhangsan);
  10.  
  11. // 对象的反序列化
  12. ois = new ObjectInputStream(new FileInputStream("F:/user.txt"));
  13. Person p = (Person)ois.readObject();
  14. System.out.println(p);
  15.  
  16. } catch (FileNotFoundException e) {
  17. e.printStackTrace();
  18. } catch (IOException e) {
  19. e.printStackTrace();
  20. } catch (ClassNotFoundException e) {
  21. e.printStackTrace();
  22. } finally{
  23. try {
  24. // ois.close();
  25. oos.close();
  26. } catch (IOException e) {
  27. e.printStackTrace();
  28. }
  29. }
  1. class Person implements Serializable{
  2.  
  3. // private static final long serialVersionUID = -1954048587316264652L;
  4. private String name;
  5. private int age;
  6. private double height;
  7. private String ads;
  8. private double weight;
  9.  
  10. public Person(String name, int age, double height, String ads) {
  11. super();
  12. this.name = name;
  13. this.age = age;
  14. this.height = height;
  15. this.ads = ads;
  16. }
  17. public String getName() {
  18. return name;
  19. }
  20. public void setName(String name) {
  21. this.name = name;
  22. }
  23. public int getAge() {
  24. return age;
  25. }
  26. public void setAge(int age) {
  27. this.age = age;
  28. }
  29. public double getHeight() {
  30. return height;
  31. }
  32. public void setHeight(double height) {
  33. this.height = height;
  34. }
  35. public String getAds() {
  36. return ads;
  37. }
  38. public void setAds(String ads) {
  39. this.ads = ads;
  40. }
  41. @Override
  42. public String toString() {
  43. return "Person [name=" + name + ", age=" + age + ", height=" + height
  44. + ", ads=" + ads + "]";
  45. }
  46. }

5.【字符流】  1. 在处理数据单元时,以一个字符作为单位。而字节流,是以一个字节为单位。
  2.字符流的基类:
   Reader和Writer,这两个类是抽象类。
  FileReader和FileWriter是直接继承自抽象类的两个字符基本流。
  3.FileReader和FileWriter在读写文件的时候,只能使用系统默认的编码模式,无法指定编码。
  如果文件格式与系统默认格式不一致,那使用这俩个方法编写会造成中文乱码。

  1. FileWriter fw=null;
  2. FileReader fr=null;
  3. try {
  4. fw=new FileWriter("D:/Test/test01.txt");
  5. String s="帅帅:shuaishuai";
  6. fw.write(s);//可以直接写字符串
  7. // for(int i=0;i<s.length();i++){
  8. // fw.write(s.charAt(i));
  9. // }
  10. fw.flush();
  11. fr=new FileReader("D:/Test/test01.txt");
  12. int n=0;
  13. StringBuffer sb=new StringBuffer();
  14. while((n=fr.read())!=-1){
  15. sb.append((char)n);
  16.  
  17. }
  18. System.out.println(sb.toString());
  19. }
  20. catch (IOException e) {
  21. // TODO Auto-generated catch block
  22. e.printStackTrace();
  23. }finally{
  24. try {
  25. fw.close();
  26. } catch (IOException e) {
  27. // TODO Auto-generated catch block
  28. e.printStackTrace();
  29. }

6.【InputSteamReader/OutputStreamWriter】 

 1.将字符转为字符串,同时支持自定义读写的编码格式。
  2.常见编码格式:
  ASCII:美国标准信息码
   ISO8859-1:欧洲码
  ANSI编码:可以分为很多种。
   简体中文:
   GB2312
   GBK
   繁体中文:big-5
   Unicode编码:国际标准码,兼容绝大部分国家的编码格式。
   可以分为UTF-6,UTF-8,UTF-16

  1. InputStreamReader isr=null;
  2. OutputStreamWriter osw=null;
  3. try {
  4. isr= new InputStreamReader(new FileInputStream("D:/Test/test001.txt"),"UTF-8" );
  5. int n=0;
  6. StringBuffer sb=new StringBuffer();
  7. while((n=isr.read())!=-1){
  8. sb.append((char)n);
  9. }
  10. System.out.println(sb);
  11. osw=new OutputStreamWriter(new FileOutputStream("D:/Test/test001.txt"),"UTF-8");
  12. String s="shuai真帅";
  13. osw.write(s);
  14. osw.flush();
  15. } catch (UnsupportedEncodingException e) {
  16. // TODO Auto-generated catch block
  17. e.printStackTrace();
  18. } catch (FileNotFoundException e) {
  19. // TODO Auto-generated catch block
  20. e.printStackTrace();
  21. } finally{
  22. try {
  23. isr.close();
  24. } catch (IOException e) {
  25. // TODO Auto-generated catch block
  26. e.printStackTrace();
  27. }
  28. }

7.【BufferedReader/BufferedWriter】

   原来的字符串s是UTF-8的编码格式。
   使用 s.getBytes("UTF-8") ,表示用UTF-8对字符串进行解码为字节数组。
   s=new String(s.getBytes("UTF-8"),"GBK");
   表示将解码后的字节数组,重新使用GBK的编码,组合成字符串。
   最终:一个UTF-8的字符串,通过解析编码解析成GBK的编码形式。

  1. BufferedReader br=null;
  2. BufferedWriter bw=null;
  3. try{
  4. br= new BufferedReader(new InputStreamReader(new FileInputStream("D:/Test/test001.txt")));
  5. int n=0;
  6. StringBuffer sb=new StringBuffer();
  7. while((n=br.read())!=-1){
  8. sb.append((char)n);
  9. }
  10. System.out.println(sb);
  11.  
  12. bw= new BufferedWriter(new OutputStreamWriter(new FileOutputStream("D:/Test/test001.txt")));
  13.  
  14. String s=sb.toString()+"hahahaha呵呵呵";
  15. s=new String(s.getBytes("UTF-8"),"GBK");
  16.  
  17. }catch (UnsupportedEncodingException e) {
  18. // TODO Auto-generated catch block
  19. e.printStackTrace();
  20. } catch (FileNotFoundException e) {
  21. // TODO Auto-generated catch block
  22. e.printStackTrace();
  23. }

Java的递归、IO流的更多相关文章

  1. 第55节:Java当中的IO流-时间api(下)-上

    Java当中的IO流(下)-上 日期和时间 日期类:java.util.Date 系统时间: long time = System.currentTimeMillis(); public class ...

  2. 第54节:Java当中的IO流(中)

    Java当中的IO流(中) 删除目录 // 简书作者:达叔小生 import java.io.File; public class Demo{ public static void main(Stri ...

  3. 第53节:Java当中的IO流(上)

    Java当中的IO流 在Java中,字符串string可以用来操作文本数据内容,字符串缓冲区是什么呢?其实就是个容器,也是用来存储很多的数据类型的字符串,基本数据类型包装类的出现可以用来解决字符串和基 ...

  4. Java中的IO流(三)

    上一篇<Java中的IO流(二)>把学习Java的字符流以及转换流作了一下记录,从本篇开始将把IO流中对文件或文件夹操作的对象File类的学习进行一下记录. 一,File类的构造函数及字段 ...

  5. Java当中的IO流-时间api(下)-上

    Java当中的IO流(下)-上 日期和时间 日期类:java.util.Date 系统时间: long time = System.currentTimeMillis(); public class ...

  6. Java当中的IO流(中)

    Java当中的IO流(中) 删除目录 import java.io.File; public class Demo{ public static void main(String[] args){ / ...

  7. Java当中的IO流(上)

    Java当中的IO流 在Java中,字符串string可以用来操作文本数据内容,字符串缓冲区是什么呢?其实就是个容器,也是用来存储很多的数据类型的字符串,基本数据类型包装类的出现可以用来解决字符串和基 ...

  8. java中的IO流

    Java中的IO流 在之前的时候我已经接触过C#中的IO流,也就是说集中数据固化的方式之一,那么我们今天来说一下java中的IO流. 首先,我们学习IO流就是要对文件或目录进行一系列的操作,那么怎样操 ...

  9. Java中的IO流总结

    Java中的IO流总结 1. 流的继承关系,以及字节流和字符流. 2. 节点流FileOutputStream和FileInputStream和处理流BufferedInputStream和Buffe ...

  10. Java中的IO流大体介绍

    由于Java中的IO流是在是知识点繁多,所以我大约花了1周的时间将其整理起来.但是整理起来后并不是将完事了,我还是要分字节流和字符流来讲述.然后字节流和字符流中还有是否带有缓冲流. 讲述完IO流后我将 ...

随机推荐

  1. JaveScript对象(JS知识点归纳七)

    1.JS中的对象表示的是一个具体的事物. a)静态的特征=>对象的属性 b)动态的行为=>对象的方法=>保存的值==>函数 2.对象的创建方式 a)构造函数的创建方式 ``` ...

  2. 【R语言系列】作图入门示例一

    假设有如下数据,我们使用plot函数作图 月龄 体重 月龄 体重  1 4.4 9 7.3 3 5.3 3 6.0 5 7.2 9 10.4 2 5.2 12 10.2 11 8.5 3 6.1 R语 ...

  3. JAVA多线程中start方法与run方法区别

    start()方法告诉jvm该线程准备运行,jvm通过调用任务的run()方法执行任务. 一个任务类必须实现Runnable接口,而任务必须从线程运行. 实现Runnable接口后必须重写run()方 ...

  4. 第十四周实验报告:实验四 Android程序设计

    20162317袁逸灏 第十四周实验报告:实验四 Android程序设计 实验内容 Android Studio 实验要求 学会使用Android Studio 学习 活动 以及相关知识内容 学习 U ...

  5. UI事务重叠引发的crash

    在ios开发的世界里,通过动画来切换界面使我们早就习以为常的事情,但动画将一个原本同步执行的事务,变成一个异步事务,并由此引发了一系列的陷阱. 最近对公司产品的crashlytics报告进行了一些分析 ...

  6. Twisted UDP编程技术

    实战演练1:普通UDP UDP是一种无连接对等通信协议,没有服务器和客户端概念,通信的任何一方均可通过通信原语直接和其他方通信 1.相对于TCP,UDP编程只需定义DatagramProtocol子类 ...

  7. 基于Unity·UGUI实现的RecycleList循环列表UI容器

    在UI功能开发实践中,列表UI容器是我们经常使用一种UI容器组件.这种组件就根据输入的数据集合生成对应数据项目.从显示的方向来说,一般就分为水平排布和垂直排布的列表容器两种.列表容器为了在有限的界面空 ...

  8. 从源码角度看LinkedList一些基本操作(jdk1.7)

    介绍 LinkedList是一个双向链表,就像下图展示那样,每个节点有个指向上个元素和一个指向下个元素的指针. 接下来我会对我们经常使用的方法进行介绍,代码如下 @Test public void t ...

  9. 前端面试之angular JS

    1. angular的数据绑定采用什么机制?详述原理 angularjs的双向数据绑定,采用脏检查(dirty-checking)机制.ng只有在指定事件触发后,才进入 $digest cycle : ...

  10. mint-ui在vue中的使用。

    首先放上mint-ui中文文档 近来在使用mint-ui,发现部分插件在讲解上并不是很详细,部分实例找不到使用的代码.github上面的分享,里面都是markdown文件,内容就是网上的文档 刚好自己 ...