- 递归
- 递归的弊端:不能调用次数过多,容易导致栈内存溢出
- 递归的好处:不用知道循环次数
- 构造方法是否可以递归调用?———–不可以
- 递归调用是否必须有返回值?———–不一定(可以有,也可以没有)
实例:从键盘输入接收一个文件夹路径,打印出该文件夹下所有的.java文件名
import java.io.File; import java.io.FileReader; import java.util.Scanner; public class Test { /** * 需求:从键盘输入接收一个文件夹路径,打印出该文件夹下所有的.java文件名 * * 分析: * 从键盘接收一个文件夹路径 * 1,如果录入的是不存在,给与提示 * 2,如果录入的是文件路径,给与提示 * 3,如果是文件夹路径,直接返回 * * 打印出该文件夹下所有的.java文件名 * 1,获取到该文件夹路径下的所有的文件和文件夹,存储在File数组中 * 2,遍历数组,对每一个文件或文件夹做判断 * 3,如果是文件,并且后缀是.java的,就打印 * 4,如果是文件夹,就递归调用 */ public static void main(String[] args) { File dir = getDir(); printJavaFile(dir); } /* * 获取键盘录入的文件夹路径 * 1,返回值类型File * 2,不需要有参数 */ public static File getDir() { Scanner sc = new Scanner(System.in); //创建键盘录入对象 System.out.println("请输入一个文件夹路径"); while(true) { String line = sc.nextLine(); //将键盘录入的文件夹路径存储 File dir = new File(line); //封装成File对象 if(!dir.exists()) { System.out.println("您录入的文件夹路径不存在,请重新录入"); }else if(dir.isFile()) { System.out.println("您录入的是文件路径,请重新录入文件夹路径"); }else { return dir; } } } /* * 获取文件夹路径下的所.java文件 * 1,返回值类型 void * 2,参数列表File dir */ public static void printJavaFile(File dir) { //1,获取到该文件夹路径下的所有的文件和文件夹,存储在File数组中 File[] subFiles = dir.listFiles(); //2,遍历数组,对每一个文件或文件夹做判断 for (File subFile : subFiles) { //3,如果是文件,并且后缀是.java的,就打印 if(subFile.isFile() && subFile.getName().endsWith(".java")) { System.out.println(subFile); //4,如果是文件夹,就递归调用 }else if (subFile.isDirectory()){ printJavaFile(subFile); } } } }
序列流
- 什么是序列流
- 序列流可以把多个字节输入流整合成一个, 从序列流中读取数据时, 将从被整合的第一个流开始读, 读完一个之后继续读第二个, 以此类推.
- 使用方式
- 整合两个: SequenceInputStream(InputStream, InputStream)
- 什么是序列流
内存输出流ByteArrayOutputStream
- 什么是内存输出流
- 向内存中写入数据,数据保存在内存中,再进行调用,内存输出流无法关闭,使用完以后内存会自动释放。
- 该输出流可以向内存中写数据, 把内存当作一个缓冲区, 写出之后可以一次性获取出所有数据
使用方式
- 创建对象: new ByteArrayOutputStream()
- 写出数据: write(int), write(byte[])
获取数据: toByteArray()
FileInputStream fis = new FileInputStream("a.txt"); ByteArrayOutputStream baos = new ByteArrayOutputStream(); int b; while((b = fis.read()) != -1) { baos.write(b); } //byte[] newArr = baos.toByteArray(); //将内存缓冲区中所有的字节存储在newArr中 //System.out.println(new String(newArr)); System.out.println(baos); fis.close();
- 什么是内存输出流
- 对象操作流ObjecOutputStream
该流可以将一个对象写出, 或者读取一个对象到程序中. 也就是执行了序列化(存档)和反序列化(读档)的操作。 - Java接口和抽象类的区别
- Add cast to ‘引用数据类型’—–>表示要强转
- 打印流的概述和特点)
- 什么是打印流
- 该流可以很方便的将对象的toString()结果输出, 并且自动加上换行, 而且可以使用自动刷出的模式
- System.out就是一个PrintStream, 其默认向控制台输出信息
PrintStream ps = System.out;
ps.println(97); //其实底层用的是Integer.toString(x),将x转换为数字字符串打印
ps.println("xxx");
ps.println(new Person("张三", 23));
Person p = null;
ps.println(p); //如果是null,就返回null,如果不是null,就调用对象的toString()
- 使用方式
- 打印: print(), println()
- 自动刷出: PrintWriter(OutputStream out, boolean autoFlush, String encoding)
- 打印流只操作数据目的
PrintWriter pw = new PrintWriter(new FileOutputStream("g.txt"), true);
pw.write(97);
pw.print("大家好");
pw.println("你好"); //自动刷出,只针对的是println方法
pw.close();
- JAVA中常用IO流类PrintStream和PrintWriter区别
- 什么是打印流
标准输入输出流概述和输出语句)
- 什么是标准输入输出流(掌握)
- System.in是InputStream, 标准输入流, 默认可以从键盘输入读取字节数据
- System.out是PrintStream, 标准输出流, 默认可以向Console中输出字符和字节数据
修改标准输入输出流(了解)
- 修改输入流: System.setIn(InputStream)
- 修改输出流: System.setOut(PrintStream)
System.setIn(new FileInputStream(“a.txt”)); //修改标准输入流
System.setOut(new PrintStream(“b.txt”)); //修改标准输出流InputStream in = System.in; //获取标准输入流
PrintStream ps = System.out; //获取标准输出流
int b;
while((b = in.read()) != -1) { //从a.txt上读取数据
ps.write(b); //将数据写到b.txt上
}in.close();
ps.close();
- 什么是标准输入输出流(掌握)
修改标准输入输出流拷贝图片
System.setIn(new FileInputStream("IO图片.png")); //改变标准输入流 System.setOut(new PrintStream("copy.png")); //改变标准输出流 InputStream is = System.in; //获取标准输入流 PrintStream ps = System.out; //获取标准输出流 int len; byte[] arr = new byte[1024 * 8]; while((len = is.read(arr)) != -1) { ps.write(arr, 0, len); } is.close(); ps.close();
学习日记45--java学习--递归和I/O流2
最新推荐文章于 2021-02-15 08:42:39 发布