黑马程序员---Java基础---递归及IO流



------- android培训java培训、期待与您交流! ----------

递归:
 
 1.我们知道:在一个方法内,可以调用另一个方法;
 2.另外:在一个方法内,也可以调用它自身,这种方法调用本身的方式,就叫:方法的递归调用;
 
  递归的注意事项:
 1.要有出口,否则就是死递归;
 2.次数不能太多,否则就内存溢出;
 3.构造方法不能递归使用;在编译时,就会编译错误;

例如:

 package cn.itcast.demo04_递归练习_递归输出指定目录下所有的java文件的绝对路径;

import java.io.File;

/*
 * 递归输出指定目录下所有的java文件的绝对路径
 * 
 * 题目:列出C:\\20150822\\
 *          目录下所有的.java文件;
 * 
 * 步骤:
 * 1.封装初始目录:File file = new File("C:\\20150822");
 * 2.列出目录下所有的文件和目录的数组:File[] fileArray = file.listFiles();
 * 3.遍历数组:
 *   1).判断是否是文件,并且以.java结尾:
 *    是:输出;
 *    否:判断是否是目录:
 *     是:回到第2步;(从第2步到这里,就可以作为一个方法,来递归调用)
 * 
 */
public class Demo {
 public static void main(String[] args) {
  File file = new File("C:\\20150822");
  listFiles(file);
  System.out.println("程序结束!");
 }

 private static void listFiles(File file){
  if(file == null){
   return;
  }
  File[] fileArray = file.listFiles();
  if(fileArray != null){
   for(File f : fileArray){
    if(f.isFile() && f.getName().endsWith(".java")){
     System.out.println(f.getAbsolutePath());
    }else if(f.isDirectory()){
     listFiles(f);
    }
   }
  }
 
 }
}

IO流:

 1.字节流:
  1).输出流:OutputStream:写入的方法:三种:写入一个字节;写入一个字节数组;写入一个字节数组的一部分
    |--FileOutputStream:
    |--FilterOutputStream(不学):
     |--BufferedOutputStream
  2).输入流:InputStream:读取的方法:两种:读取一个字节;读取一个字节数组;
    |--FileInputStream:
    |--FilterInputStream(不学):
     |--BufferedInputStream:
 2.字符流:
  1).输出流:Writer:写入的方法:五种:写入一个字符;写入一个字符数组;写入一个字符数组的一部分;写入一个字符串;写入一个字符串的一部分
    |--OutputStreamWriter(转换流):是字符流通向字节流的桥梁
     |-FileWriter:
    |--BufferedWriter:
     newLine():输出一个换行符;
  2).输入流:Reader:读取的方法:两种:读取一个字符;读取一个字符数组;
    |--InputStreamReader(转换流):是字节流通向字符流的桥梁
     |--FileReader:
    |--BufferedReader:
     readLine():读取一行数据;
 3.数据输入输出流:可以读写Java中基本数据类型,当写入文本时,是按各种数据类型相应的字节数写入的;
  DataInputStream:
  DataOutputStream:
 4..内存操作流(byte[]数组的缓存区流):它类似于StringBuffer
  ByteArrayOutputStream:
  ByteArrayInputStream:
 5.打印流:
  1.分类:
   1).字节流:PrintStream: (System.out)
   2).字符流:PrintWriter:
  2.特点:
   1).只能操作目的地,不能操作数据。
   2).可以操作任意类型的数据。
   3).如果启动了自动刷新,能够自动刷新。
   4).可以操作文件的流
 6.三种方式实现接收控制台数据:
  1.Scanner:
  2.main()方法形参;
  3.System.in: System.in --> 转换流 --> 带缓冲的字符流
 7.随机访问流:
  RandomAccessFile:
   1).获取文件指针:getFilePointer();
   2).设置文件指针:seek();
 8.序列化流:
  1.序列化流:ObjectOutputStream:
  2.反序列化流:ObjectInputStream:
  3.注意:需要被序列化的类,必须实现接口:Serializable
  4.为了控制版本号,建议定义成员变量:serialVersionUID设定版本号;
  5.使用transient关键字声明不需要序列化的成员变量;
 9.Properties类:
  1.它本质上是一个Map集合,直接继承自:Hashtable;
  2.它结合IO流,可以读写配置文件中的属性信息;
  3.读取配置文件:load(Reader reader):
  4.写入配置文件:store(Writer out,String str):
 10.JDK7的NIO:
  Path:与平台无关的路径。
  Paths:包含了返回Path的静态方法。
   public static Path get(URI uri):根据给定的URI来确定文件路径。
  Files:操作文件的工具类。提供了大量的方法,简单了解如下方法
   public static long copy(Path source, OutputStream out) :复制文件
   public static Path write(Path path, Iterable<? extends CharSequence> lines, Charset cs, OpenOption... options):
   把集合的数据写到文件。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值