对于程序设计者来说,设计一个很好的I/O系统是一件很艰难的事。–Thinking in Java
第一: File 类 (只涵盖了文件或者目录的一些情况,并没有读写具体文件的能力)
1. 一个File类的对象,表示了磁盘上的文件或者目录
2. File 类提供了与平台无关的方法来对磁盘上的文件或者目录进行操作
3. File类直接处理文件和文件系统
4. File类没有指定信息怎样从文件读取或者向文件写入
5. File 类描述了文件本身的属性
6. File对象用来获取或者处理与文件相关的信息,如权限,时间,日期,或者目录路径等,还可以浏览子目录层次结构
File 类中的一些重要的方法:
构造方法:
创建一个文件,目录存放位置和文件名以字符串的方式输入
window 上的文件目录表示G:\myfile\aa.txt, 但是在java中\ 表示的转义符,会把\后面的一个字符转义
所以 有三种方式在java中可以表示目录
1. G:\myfile\aa.txt (第一个\ 会把第二个\ 转成 )
2. G://myfile//aa.txt
3. G:/myfile/aa.txt (建议这样写,因为其他系统的文件表示路径也是这样写的,window比较特殊用的是\ ,如果不这样写,可能移植到其他系统不兼容)
当使用了 File file1 = new File(“G:/a1.txt”);之后,注意的是文件并没有被创建, 必须必须调用createNewFile(),文件才被创建
构造方法:
主要使用的是三种构造方法,
// 几种构造方式
File file1 = new File("G:/a1.txt");
// 后面的文件的路径最后加不加 / 都没有影响
File file2 = new File("G:", "a2.txt");
File file = new File("G:/");
File file3 = new File(file, "a3.txt");
File file6 = new File(File.separator); // 该文件当前路径下的盘符 G:
// 上面的只是指定了文件的路径和文件的名字,但是实际文件还没有创建,
//必须调用createNewFile(),文件才被创建
try {
file1.createNewFile();
file2.createNewFile();
file3.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
删除和判断语句:
file1.delete(); // 删除,如果删除的是目录,必须该目录下为空才能被删除
file1.isFile(); // 判断是文件
file1.isDirectory(); // 判断是目录
目录管理的一些方法
// 目录管理的一些方法:
File file4 = new File("G:/a/b/c");
file4.mkdirs(); // 如果路径不存在,系统会将这几个路径全部都创建好,
// 需要注意的一点是,File file4 = new File("G:/a/b/c/a.txt"); 此时它会认为a.txt也是一个目录,而不是一个文件
// file4.mkdir(); //如果路径不存在, 系统不会创建该路径
// 这个方法会将当前路径下存放的文件或者目录的名称全部获取,但是不会获取子目录的目录或者文件
String[] names = file4.list();
for (String name:names){
// System.out.println(name);
}
// 跟 list() 功能一样,只是返回的是一个File[] 数组
File[] filenames = file.listFiles();
获取指定文件名的几种方法:
第一种: 遍历,然后进行判断,主要是使用了这两种方法,任何一个都可以
这里讲解一下String的两个方法 :
endsWith(String s); // // 判断一个字符串是否以 s 结尾
lastIndexOf(String s): // 这个函数是从后往前查找字符串中是否存在 s 字段,如果没找到返回 -1
第二种: 使用FilenameFilter 文件名过滤器, 其实是使用了策略模式
FilenameFilter
// 寻找某个目录下的指定后缀名的文件
// 第一步: 定位到目录下
File file5 = new File("G:/a/b/c");
// 第一种办法,遍历,判断是否以.java 结尾
String[] namesss = file5.list();
for (String name: namesss){
if(name.endsWith(".java")){ // 判断是否以 .java结尾
System.out.println(name);
}
// if(name.lastIndexOf(".java") != -1){ // 判断是否以 .java结尾
// lastIndexOf(String str) 这个函数是从后往前查找字符串中是否存在 .java 字段,如果没找到返回 -1
// System.out.println();
// }
}
// 第二种方法 : 使用FilenameFilter, 文件名称过滤器 , 其实使用了策略模式
// String[] list(FilenameFilter nameFilter)
// 该形式中,nameFilter是一个实现了FilenameFilter接口的类的对象
// 该接口中只有一个方法 accept()
// 使用了匿名内部类 ,当然也可以专门写一个类,然后传该类的一个对象进去
namesss = file5.list( new FilenameFilter(){ //
@Override
// 两个参数,第一个是待测试的文件目录,另外一个是待测试的文件本身
public boolean accept(File dir, String name) {
// TODO Auto-generated method stub
if(name.endsWith(".java")){
return true;
}
return false;
}
});
//上面的匿名类的实现等价于下面的这一句, NameFilter是一个实现了FilenameFilter接口的类
// namesss = file5.list(new NameFilter());
for (String name: namesss){
System.out.println(name);
}
class NameFilter implements FilenameFilter{
@Override
public boolean accept(File dir, String name) {
// TODO Auto-generated method stub
if(name.endsWith(".java")){
return true;
}
return false;
}
}
// 递归实现删除一个目录下的所有文件, 在File类的delete()函数中,如果是文件可以直接删除,如果是目录,必须目录下面为空才可以删除。
public void deleteAll(File file){
// 首先要为递归函数选择一个出口
if(file.isFile() || 0 == file.list().length ){
file.delete();
}else{
// 要把该目录下的所有的文件都删除
File files = file.listFile();
for (File f: files){
deleteAll(f);
f.delete();
}
}
}