Java IO流 一
Java IO流 (一)
一、File
1.1、File类的概述和构造方法
File:它是文件和目录路径名的抽象表示
- 文件和目录是可以通过File封装成对象的
- 对于File而言,其封装的并不是一个真正存在的文件,仅仅是一个路径名而已。它可以存在,也可以不存在。这可以通过将来的一些具体的操作把这个路径的内容转换为具体存在的
File(File parent, String child)
从父抽象路径名和子路径名字符串创建新的 File实例。
File(String pathname)
通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例。
File(String parent, String child)
从父路径名字符串和子路径名字符串创建新的 File实例。
import java.io.File;
public class Demo01 {
public static void main(String[] args) {
//File(String pathname):通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例。
File f1 = new File("D:\\test\\java.txt");
System.out.println(f1);
//File(String parent, String child):从父路径名字符串和子路径名字符串创建新的 File实例。
File f2 = new File("D:\\test","java.txt");
System.out.println(f2);
//File(File parent, String child):从父抽象路径名和子路径名字符串创建新的 File实例。
File f3 = new File("D:\\test");
File f4 = new File(f3,"java.txt");
System.out.println(f4);
}
}
1.2、File类创建功能
boolean createNewFile() : 当且仅当具有该名称的文件尚不存在时,原子地创建一个由该抽象路径名命名的新的空文件
//如果文件不存在,就创建文件并返回true;若存在,就不创建该文件并返回false
mkdir() : 创建由此抽象路径名命名的目录。
//如果目录不存在,就创建目录并返回true;若存在,就不创建该目录并返回false
mkdirs() :创建由此抽象路径名命名的目录,包括任何必需但不存在的父目录。
//该方法可以帮助创建多级目录;如果多级目录不存在,就创建多级目录并返回true;若存在,就不创建该多级目录并返回false
import java.io.File;
import java.io.IOException;
public class Demo02 {
public static void main(String[] args) throws IOException {
//createNewFile():当且仅当具有该名称的文件尚不存在时,原子地创建一个由该抽象路径名命名的新的空文件
File f1 = new File("D:\\test\\java.txt");
System.out.println(f1.createNewFile());//首次为true,创建成功;再次则为false
//mkdir() : 创建由此抽象路径名命名的目录。
File f2 = new File("D:\\test\\JavaSE");
System.out.println(f2.mkdir());//首次为true,创建成功;再次则为false
//mkdirs() :创建由此抽象路径名命名的目录,包括任何必需但不存在的父目录。
File f3 = new File("D:\\test\\JavaWEB\\HTML");
System.out.println(f3.mkdirs());//首次为true,创建成功;再次则为false
}
}
1.3、File类的判断和获取功能
public class Demo03 {
public static void main(String[] args) {
File file = new File("D:\\test\\java.txt");
//isDirectory():测试此抽象路径名表示的文件是否为目录。
System.out.println(file.isDirectory());//false
//isFile():测试此抽象路径名表示的文件是否为普通文件。
System.out.println(file.isFile());//true
//exists():测试此抽象路径名表示的文件或目录是否存在。
System.out.println(file.exists());//true
//getAbsolutePath():返回此抽象路径名的绝对路径名字符串。
System.out.println(file.getAbsolutePath());//D:\test\java.txt
//getPath():将此抽象路径名转换为路径名字符串。
System.out.println(file.getPath());//D:\test\java.txt
//getName():返回由此抽象路径名表示的文件或目录的名称。
System.out.println(file.getName());//java.txt
File file1 = new File("D:\\test");
//list():返回一个字符串数组,命名由此抽象路径名表示的目录中的文件和目录。
String[] list = file1.list();
for (String s:list){
System.out.println(s);//java.txt、JavaSE、JavaWEB
}
//listFiles():返回一个抽象路径名数组,表示由该抽象路径名表示的目录中的文件。
File[] files = file1.listFiles();
for (File f:files){
System.out.println(f);//D:\test\java.txt;D:\test\JavaSE;D:\test\JavaWEB
}
}
}
1.4、File类的删除功能
- 绝对路径和相对路径的区别
- 绝对路径:完整的路径名,不需要任何其他信息就可以定位它所表示的文件。例如:D:\test\java.txt
- 相对路径:必须使用取自其他路径名的信息进行解释。例如:myFile\java.txt
import java.io.File;
import java.io.IOException;
public class Demo04 {
public static void main(String[] args) throws IOException {
// //delete():删除由此抽象路径名表示的文件或目录
// File file = new File("D:\\test\\java.txt");
// System.out.println(file.delete());//true
//在当前模块目录下创建java.txt文件
File f1 = new File("Java基础语法\\java.txt");
// System.out.println(f1.createNewFile());//true
//在当前模块目录下删除java.txt文件
// System.out.println(f1.delete());//true
//在当前模块目录下test这个目录
File f2 = new File("Java基础语法\\test");
// System.out.println(f2.mkdir());//true
//在当前模块目录下删除test这个目录
// System.out.println(f2.delete());//true
//在当前目录下创建一个目录并在目录下创建一个文件
File f3 = new File("Java基础语法\\test");
// System.out.println(f3.mkdirs());
//如果创建之前只有下面这一句则会出现:java.io.IOException异常: 系统找不到指定的路径。
File f4 = new File("Java基础语法\\test\\java.txt");
// System.out.println(f4.createNewFile());
//删除当前模块下的test目录,要想删除目录必须先删除其下的内容后在删除其目录
System.out.println(f4.delete());//true
System.out.println(f3.delete());//true
}
}
二、递归
2.1、递归的概述和使用
- 递归概述:从编程角度来看,递归指的是方法定义中调用方法本身的现象
- 递归解决问题思路:
- 把一个复杂的问题层层转化为一个与原问题相似的规模较小的问题来解决
- 递归策略只需要少量的程序就可描述出解题过程所需要的多次重复计算
- 递归问题解决问题要找到两个内容:
- 递归出口:否则会出现内存溢出
- 递归规则:与原问题相似的规模较小的问题
//斐波那契数列(Fibonacci sequence)即:1,1,2,3,5,8...
public class demo01 {
public static void main(String[] args) {
//求前20个数的斐波那契数列值
int [] fise = new int[20];
fise[0] = 1;
fise[1] = 1;
for (int i = 2; i < fise.length; i++) {
fise[i]=fise[i-1]+fise[i-2];
}
System.out.println(fise[19]);//6765
System.out.println(f(20));//6765
}
/*
* 把上面该要求用递归方式解决
* 而解决一个递归问题,首先就是定义一个方法,再者需要一个出口来限制堆栈溢出问题
*
* StackOverflowError:当堆栈溢出发生时抛出一个应用程序递归太深。
* */
public static int f(int n){
if (n==1||n==2){
return 1;
}else {
return f(n - 1) + f(n - 2);
}
}
}
2.2、具体实例
//用递归法求5的阶乘
public class demo02 {
public static void main(String[] args) {
System.out.println(jc(5));
}
public static int jc(int n){
if (n==1){
return 1;
}else {
return n*jc(n-1);
}
}
}
2.3、结合File类和递归方法的案例
import java.io.File;
//给定一个路径D:\\test,利用递归遍历目录下所有内容,并输出绝对路径
public class demo03 {
public static void main(String[] args) {
//1、创建文件对象
File file = new File("D:\\test");
//7、调用递归方法
getFilePath(file);
}
//2、定义递归方法
public static void getFilePath(File file){
//3、创建一个所获取目标下的所有内容的数组
File[] files = file.listFiles();
//4、判断该文件是否为目录
if (files!=null){
for (File f:files){
//5、如果是,则继续调用递归方法
if (f.isDirectory()){
getFilePath(f);
}else{//6、如果不是,则输出该绝对路径
System.out.println(f.getAbsolutePath());
}
}
}
}
}