第十二章 java流与文件操作 第四讲
四、文件操作-----File类
(1)File类可以用一些方法来操作文件和获取文件的信息包括:更改文件名、删除文件、列出目录下的文件以及文件对象属性的描述信息等。
File的构造方法
public File(String pathname);
File f1 = new File(“data.txt”);
public File(String path,String name);
File f2 = new File(“c:\\aa”,”data.txt”);
public File(File parent,String chile);
File file4=new File(“c:/example”,”demo.txt”);
注:pathname指路径名字符串,path指父类路径名,String 是文件名
(2) 静态常量
由于不同操作系统的文件分隔符以及路径分隔符不同,因此,如果要获取当前系统的文件和路径的分隔符,可使用以下两个静态常量。
public static final char separatorChar;
public static final String separator;
实例:File file = new File("c:"+File.separator+"abc"+File.separator+"a.txt");
注:这两个常量可以在两种操作系统下进行,如实例所写的一样,为:c:\\abc\\a
(3) 访问文件常用的方法
(1)访问文件对象
File f = new File(“res\aa.txt”);
public String getName() ------结果为: aa.txt
//返回文件对象名,不包含路径名
public String getPath() -------- res\aa.txt
//File对象中封装的路径是什么,获取的就是什么
public String getAbsolutePath()
//返回绝对路径名,包含文件名---------- D:\java\java\res\aa.txt
public String getParent()
//返回父文件对象的路径名,如果封装的是相对路径,返回null -------res
public File getParentFile()
//返回父文件对象 ------------- D:\java\java\res
(2)获得文件属性
public long length() //返回文件的字节长度
public boolean exists() //测试指定的文件是否存在
public long lastModified() //返回文件最后被修改的时间
(3)文件操作
public boolean renameTo(Filedest) //文件重命名
public boolean delete() //删除空目录或文件
(4)目录操作
public boolean mkdir () //创建目录,正常建立时返回true
补充:在创建目录时,可以加上if语句来判断是否存在,如果不存在在创建
(1)单级目录的创建
File f3 = new File("c:\\aa");
if(!f3.exists()){
f3.mkdir();
}
(2)多级目录的创建
File f4 = new File("c:\\bb\\cc\\dd");
if(!f4.exists()){
f4.mkdirs();
}
public String[] list() //返回目录中的所有文件名字符串
补充:
(1)显示当前文件夹里的所有东西------list() 只能显示文件名
String[] arr = f3.list();
for(String name:arr){
System.out.println(name);
}
(2)显示当前文件夹下的文件名和子文件夹-----listFiles()
File[] files = f3.listFiles();
for(int i=0;i<files.length;i++){ System.out.println(files[i].getName()+”/t”+files[i].lastModified()+”/t”+files[i].isFile()?”文件”:”目录”);}
(5) 利用子文件递归方法调用文件的子文件----使用递归时,一定要有递归的终止条件,并且调用次数也不要过多,否则会出现内存溢出.
第一种:
public void listDir(File dir){
//方法listDir()里的参数是File类的对象
System.out.println(dir.getName()+"以下是文件下的子文件:");
File[] files1 = dir.listFiles();
for(int i=0;i<files1.length;i++){
if(files1[i].isFile()){
System.out.println(files1[i].getName());
}else{
listDir(files1[i]);//递归的使用
}
}
第二种:
public void listDir1(File dir,int level){
System.out.println(getLevel(level)+dir.getName());
level++;
File[] files = dir.listFiles();
for(int x =0; x<files.length; x++){
if(files[x].isDirectory())//如果遍历到的是目录。
listDir1(files[x],level);//递归。
else
System.out.println(getLevel(level)+files[x].getName());
}
}
//增加目录层次
public String getLevel(int level){
StringBuilder sb = new StringBuilder();
注:是缓冲的字符串,和StringBuffered 一样
sb.append("|--");
for(int x=0; x<level; x++){
sb.insert(0,"| "); //插入---从第0个开始,
}
return sb.toString();
}
}
输出的结果大概为:
|--aa
| |--rr
(6) 过滤器的应用------FileFilter---是接口,所有要想实现必须实例化类,根据继承
public class MyFileFilter implements FileFilter{
String externName;//设置过滤条件----即是过滤那个文件结尾的文件
public MyFileFilter(String externName){
this.externName=externName;
}
//以上构造函数时为了让用户自己输入过滤条件,并调用
//显示验证的文件是否符合过滤条件
public boolean accept(File pathname){
if(pathname.isDirectory()){
return false;
}
//查找 . 并用条件判断
String filename = pathname.getName();
int n = filename.indexOf(".");
if(n==-1 || n==filename.length()-1){
return false;
}
//文件截取从.之后
if(filename.substring(n+1).equals(externName)){
return true;
}
return false;
}
(7)随机文件操作--------- RandomAccessFile
RandomAccessFile raf = new RandomAccessFile(“dome.txt”,”rw”);
raf.writeInt(1234); 向文件中写入
raf.seek(0); //定位到最开头
int n = raf.readInt(); 读取文件