递归:
概述: 就是方法定义中调用方法本身的现象 ;
注意事项:
a: 递归一定要有出口
b: 递归的次数不宜过多
递归体现的思想: 拆分思想和合并思想
第一个练习题: 求5的阶乘
public static int jieCheng(int n) {
if(n == 1 ){
return 1 ;
}else {
return n * jieCheng(n - 1);
}
}
第二个练习题: 不死神兔
public static int getCount(int n){
if(n == 1 || n == 2 ){
return 1 ;
}else {
return getCount(n - 1) + getCount(n -2) ;
}
}
第三个练习题: 输出指定目录下所有的以.java结尾的文件的绝对路径
public static void printFilePathName(File file) {
// 获取指定的路径下所有的文件或者文件夹对应的File数组
File[] files = file.listFiles() ;
// 遍历
for(File f : files) {
// 判断
if(f.isFile()){
if(f.getName().endsWith(".java")){
System.out.println(f.getAbsolutePath()) ;
}
}else {
printFilePathName(f) ;
}
}
}
第四个练习题: 删除文件夹
public static void deleteFolder(File file){
// 获取指定的路径下所有的文件或者文件夹对应的File数组
File[] files = file.listFiles() ;
// 遍历
for(File f : files) {
// 判断
if(f.isFile()) {
System.out.prinltn(f.getAbsolutePath() + "----" + f.delete()) ;
}else {
deleteFolder(f) ;
}
}
// 删除文件夹
System.out.println(file.getAbsolutePath() + "---" + file.delete()) ;
}
IO流 :
I: 输入
O: 输出
什么是输入和输出: 说这个输入和输出问题是相对于内存而言的.
分类:
a: 按照流向进行划分
输入流
输出流
b: 按照操作数据的类型
字节流
字符流
在以后的开发过程中我们到底使用的是字节流还是字符流?
如果我们操作的是文本文件,那么我们优先考虑字符流.
字节流
字节输入流 InputStream 读
字节输出流 OutputStream 写
字符流
字符输入流 Reader 读
字符输出流 Writer 写
上边的这四个类都是抽象类,不能直接使用,我们只能使用它的子类.并且通过查看API我们可以发现他们的子类都有一个特点: 子类的名称都是一个父类为后缀的
IO流的操作步骤:
a: 创建io流对象
b: 调用方法进行读或者写
c: 释放资源
使用字节输出流写数据:
FileOutputStream
构造方法:
public FileOutputStream(File file) ;
public FileOutputStream(String name) ;
public FileOutputStream(String name , boolean append) ; // 实现追加写
public FileOutputStream(File file , boolean append) ; // 实现追加写
写的成员方法:
public void write(int by) : 一次写一个字节
public void write(byte[] bytes) : 一次写一个字节数组
public void write(byte[] bytes , int off , int len ): 一次写一个字节数组中的一部分
在windows操作系统中的换行符是: "\r\n"
在linux操作系统中的换行是: "\n"
在mac操作系统中的换行是: "\r"
FileInputStream
构造方法:
public FileInputStream(File file) ;
public FileInputStream(String name) ;
读取数据的方法:
public int read(): 一次读取一个字节
public int read(byte[] bytes) : 一次读取一个字节数组 , 返回值表示的意思是: 读取到的有效的字节个数
复制文件:
步骤:
a: 创建字节输入流和字节输出流对象
b: 频繁的读写操作
一次读取一个字节复制文件
一次读取一个字节数组复制文件
c: 释放资源
public static void copyFile() {
// 创建字节输入流和字节输出流对象
FileInputStream fis = new FileInputStream("a.txt") ;
FileOutputStream fos = new FileOutputStream("b.txt");
// 一次读取一个字节复制文件
int by = 0 ;
while((by = fis.read()) != -1){
fos.write(by) ;
}
// 释放资源
fos.close() ;
fis.close() ;
}
public static void copyFile() {
// 创建字节输入流和字节输出流对象
FileInputStream fis = new FileInputStream("a.txt") ;
FileOutputStream fos = new FileOutputStream("b.txt");
// 一次读取一个字节数组复制文件
byte[] bytes = new byte[1024] ;
int len = 0 ;
while((len = fis.read(bytes)) != -1){
fos.write(bytes , 0 , len) ;
}
// 释放资源
fos.close() ;
fis.close() ;
}
高效的字节输入流和高效的字节输出流:
高效的字节输出流: BufferedOutputStream
构造方法: public BufferedOutputStream(OutputStream os) ;
高效的字节输入流: BufferedInputStream
构造方法: public BufferedInputStream(InputStream is) ;
复制文件使用高效的字节输入流和字节输出流:
public static void copyFile() {
// 创建高效的字节输入流和字节输出流对象
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("a.txt")) ;
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("b.txt")) ;
// 一次读取一个字节复制文件
int by = 0 ;
while((by = bis.read()) != -1){
bos.write(by) ;
}
// 释放资源
bos.close() ;
bis.close() ;
}
public static void copyFile() {
// 创建高效的字节输入流和字节输出流对象
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("a.txt")) ;
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("b.txt")) ;
// 一次读取一个字节数组复制文件
byte[] bytes = new byte[1024] ;
int len = 0 ;
while((len = bis.read(bytes)) != -1){
bos.write(byte, 0 , len) ;
}
// 释放资源
bos.close() ;
bis.close() ;
}
|
|