一、IO流
1、IO流中的基本概念
IO流:用来处理设备之间的数据传输。 设备:各种存储设备
IO:用于处理设备上的数据的技术。设备:内存、硬盘、光盘等
流:系统资源,window系统本身就可以操作这些设备,各种语言只是使用系统平台上的这个资源。
并对外提供了各种语言自己的操作功能,这些功能最终调用的是系统资源。
流使用完一定要释放!
流的分类:
字节流与字符流 操作的数据
输入流与输出流 流的方向
输入输出相对于内存来讲
输入(input):外围设备---->内存
输出(output):内存------>外围设备
java语言中用于操作流的对象的包是java.io
二、File
java中描述文件或文件夹的类是File类
1、构造方法
(1),File(String pathname) 将一个具体的路径封装成File对象,可以封装存在的文件或目录,也可以封装不存在的文件和目录。
File f = new File("c:\\dev\\word.txt"); 封装的是word.txt这个文件
(2),File(String parent,String child) 文件目录和文件分别作为参数传递
(3),File(File parent,String child) 文件目录封装成对象,作为参数传递,child路径名字符串形式传递。
2、文件分隔符
不同的操作系统下的分隔符不同,为了使程序移植性更好,有时需要获取当前系统中的分隔符。
static String separator:与系统有关的默认名称分隔符。使用系统属性的file.separator来获取值。
static String pathSeparator:与系统有关的路径分隔符,为了方便,它被表示为一个字符串。
System.getProperty("file.separator");
3、File类中常用方法
(1)、获取封装对象的名称
getName() File file = new File("c:\\1.txt"); file.getName(); 获取的是1.txt
(2),获取文件的大小
length() 单位:字节 返回值类型:long
(3),获取文件所有目录
getParent() 返回值类型:String
返回此抽象路径名父目录的路径名字符串;如果此路径名没有指定父目录,则返回 null。
File file = new File("c:\\abc\\1.txt"); file.getName(); 获取的是c:\abc 封装的是1.txt c:\\abc是目录
(4),获取文件路径
String getAbsolutePath(); //获取文件对象的绝对路径,即使封装的是相对的,获取到的也是绝对的路径。
File getAbsoluteFile() //此抽象路径名表示相同的文件或目录
String getPath(); //获取的是file对象中的封装的路径,封装的是什么,获取到的就是什么。
(5),获取文件最后一次被修改的时间
long lastModified(); 返回与时间点(1970 年 1 月 1 日,00:00:00 GMT)之间的毫秒数
(6)、文件是否是隐藏的
boolean isHidden(); 隐藏返回true
(7),创建文件
boolean createNewFile(); 如果文件存在,则不创建返回false,不存在就创建,成功返回true
(8),删除文件或文件夹
boolean delete(); 删除后不放入回收站。文件存在就删除,成功删除返回true,文件不存在,则返回false
删除文件夹时,必须保证该文件夹没有内容,有内容,必须先把内容删除后,才可以删除当前文件夹
(9),判断文件是否存在。
boolean exists(); 测试此抽象路径名表示的文件或目录是否存在。封装的File对象是否存在
(10),创建文件夹
boolean mkdir() 创建目录 创建此抽象路径名指定的目录
boolean mkdirs() 创建多级目录 创建此抽象路径名指定的目录,包括所有必需但不存在的父目录。
(11),空间大小
long getFreeSpace() 空闲大小
long getTotalSpace() 总大小
long getUsableSpace() 分区上的可用字节数
4、获取目录下的文件
(1)、只获取文件名称
File dir = new File("c:\\");
String[] names = dir.list(); 列出当前目录下的所有文件和文件夹名称,包括隐藏文件
如果目录不存在,报空指针异常
如果目录存在,但目录中没有内容。返回长度为0的数组。
(2)、获取文件或目录对象
File[] files = dir.listFiles(); 抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件和目录
5、过滤器,用来筛选文件或文件夹
(1),文件名过滤器 FilenameFilter 接口,将过滤的条件和容器进行分离。进行解藕
1,创建一个过滤器对象
public class FilterBySuffix implements FilenameFilter{
private String suffix;
public FilterBySuffix(String suffix){
super();
this.suffix = suffix;
}
@Override
public boolean accept(File dir,String name){
return name.endsWith(suffix);
}
}
2,传入一个过滤器
dir.list(new FilterBySuffix(""));
获取指定目录下的特定类型的文件
File dir = new File("c:\\");
String[] names = dir.list();
for(String name : names){
if(name.endsWith(".java")){
}
}
(2),文件过滤器 FileFilter
File[] listFiles() 目录中的所有文件和目录
File[] listFiles(FileFilter filter) 满足过滤器的文件和目录
//1,自定义过滤器
public class FilterByFile implements FileFilter{
@Override
public boolean accept(File pathname){
return pathname.isFile();
}
}
//2,获取
FileFilter filter = new FilterByFile();
File[] files = dir.listFiles(filter);
应用:获取子目录中的内容
需求:遍历指定目录下的内容(包含子目录中的内容)
public static void getAllFiles(File dir){
//1,获取该目录的文件对象数组 文件对象
File[] files = dir.listFiles();
//2,对数组进行遍历
for(File file : files){
if(file.isDirectory()){
getAllFiles(file); 递归调用
}else{
}
}
}
6,递归
递归:函数自身调用自身。函数内部又使用到了该函数的功能
使用场景:当功能被重复使用,但是每次该功能使用参与运算的数据不同时,可以考虑使用递归方式解决
注意:
使用递归时一定要定义条件
递归次数过多,会出现栈内存溢出(java.lang.StackOverflowError)
public static int getSum(int num){
<span style="white-space:pre"> </span> if(num==1){
<span style="white-space:pre"> </span>return 1;
<span style="white-space:pre"> </span> }else{
<span style="white-space:pre"> </span>return num + getSum(num-1);
<span style="white-space:pre"> </span> }
<span style="white-space:pre"> </span>}
}
7、删除目录
public static void deleteDir(File dir){
//1,列出当前目录下所有的文件和文件夹
File[] files = dir.listFiles();
//2,对该数组进行遍历
for(File file : files){
//3,判断是否有目录,如果有,继续调用该功能遍历,递归,如果不是文件夹,直接删除
if(file.isDierectory){
deleteDir(file);
}else{
file.delete();
}
}
dir.delete();
}