IO流–FIle类和路径分隔符
1 File类
1.1 File类概述
我们想要操作IO,就必须知道硬盘上文件的表现形式。File类:IO类包中唯一代表文件本身的对象,文件和目录(文件夹)路径名的抽象表示形式。File类提供各种方法,我们可以创建、删除、重命名文件,判断文件的读写权限,是否存在,设置和查询文件的最近修改时间。File类不能访问文件的内容,不能够从文件中读取数据或往文件里写数据,它只能对文件本身的属性进行操作。
1.2 File类的构造方法
File(String pathname):根据一个路径得到File对象。
File(String parent, String child):根据一个目录和一个子文件/目录得到File对象
File(File parent, String child):根据一个父File对象和一个子文件/目录得到File对象。
1.3 创建File对象
【要注意区分你所创建的是文件夹,还是文件】
public boolean createNewFile():创建文件,创建成功返回true, 如果存在这样的文件,就不创建了,返回false。
public boolean mkdir():创建文件夹【父目录必须存在】,如果存在这样的文件夹,就不创建了。
public boolean mkdirs():创建文件夹,如果父文件夹不存在,会帮你创建出来。
1.4 删除File对象
public boolean delete():删除此抽象路径名表示的文件或目录。
如果要删除一个文件夹,则所给文件夹必须为空才可删除【即该文件夹内不能包括文件或文件夹】。
在Eclipse中创建文件或文件夹时,如果忘记写盘符,在默认是在项目路径下创建。
Java中File对象的删除不走回收站,直接删除。
1.5 重命名
public boolean renameTo(File dest)
如果路径名相同,就是改名;如果路径名不同,就是改名并剪切。
绝对路径:路径以盘符开始。
相对路径:路径不以盘符开始。
1.6 判断类方法
public boolean isDirectory():判断是否是目录
public boolean isFile():判断是否是文件
public boolean exists():判断是否存在
public boolean canRead():判断是否可读
public boolean canWrite():判断是否可写
public boolean isHidden():判断是否隐藏
1.7 获取文件信息
public String getAbsolutePath():获取绝对路径
public String getPath():获取相对路径
public String getName():获取名称
public long length():获取长度。字节数
public long lastModified():获取最后一次的修改时间,毫秒值
1.8 案例一:输出D盘目录下,后缀名以.txt结尾的文件名称
方法一:直接使用File类的基本方法解决
分析:
A:封装e判断目录
B:获取该目录下所有文件或者文件夹的File数组
C:遍历该File数组,得到每一个File对象,然后判断
D:是否是文件
是:继续判断是否以.txt结尾
是:就输出该文件名称
否:不处理
否:不处理
public class FileDemo {
public static void main(String[] args) {
File file = new File("D:\\");
File[] fileArray = file.listFiles();
for(File f : fileArray){
if(f.isFile() && f.getName().endsWith(".txt")){
System.out.println(f.getName());
}
}
}
}
/*运行结果:
* 摸金天师.txt
* 盗墓笔记.txt
* 鬼吹灯.txt
* */
方法二:使用文件过滤器作为参数,调用list(filter)或者listFiles(filter)方法。
public String[] list(FilenameFilter filter)
public File[] listFiles(FilenameFilter filter)
调用List()方法,并且传入FilenameFilter 对象作为参数。
FilenameFilter接口的源码如下:
public
interface FilenameFilter {
//测试指定文件是否应该包含在某一文件列表中。
//参数:File被找到的文件所在的目录,name文件的名称。
boolean accept(File dir, String name);
}
public String[] list(FilenameFilter filter)源码如下:
public String[] list(FilenameFilter filter) {
String names[] = list();
if ((names == null) || (filter == null)) {
return names;
}
ArrayList v = new ArrayList();
for (int i = 0 ; i < names.length ; i++) {
if (filter.accept(this, names[i])) {
v.add(names[i]);
}
}
return (String[])(v.toArray(new String[v.size()]));
}
代码案例:
public class FilenameFilterDemo {
public static void main(String[] args) {
File file = new File("D:\\");
//将实现FilenameFilter接口的匿名类作为list()的参数
String[] strArray = file.list(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
return new File(dir, name).isFile() && name.endsWith(".txt");
}
});
for (String s : strArray) {
System.out.println(s);
}
}
}
/*运行结果:
* 摸金天师.txt
* 盗墓笔记.txt
* 鬼吹灯.txt
* */
1.9 案例二:将D盘下的文件名称批量重命名
E:\电视剧\汉武大帝\汉武大帝001[电视剧迅雷下载电影天堂]_汉景帝削藩.avi,
改为:E:\评书\三国演义\001_汉景帝削藩.avi
public class FileRenameDemo {
public static void main(String[] args) {
//E:\电视剧\汉武大帝\汉武大帝_001_[电视剧_迅雷下载_电影天堂]_汉景帝削藩.avi
File srcFolder = new File("E:\\电视剧\\汉武大帝");
File[] fileArray = srcFolder.listFiles();
for (File file : fileArray) {
String name = file.getName();
int index = name.indexOf("_");
String numberString = name.substring(index + 1, index + 4);
int endIndex = name.lastIndexOf('_');
String nameString = name.substring(endIndex);
String newName = numberString.concat(nameString);//001_汉景帝削藩.avi
//System.out.println(newName);
File newFile = new File(srcFolder, newName);
file.renameTo(newFile);
//修改后:E:\评书\三国演义\001_汉景帝削藩.avi
}
}
}
2 路径分隔符需要注意的问题
2.1 各系统的路径分隔表示
Unix和Mac下的路径分隔符为:【/ 】
DOS下的路径分隔符为:【\】
Java可以正确处理Unix和Dos的路径分隔符:
即使我们在Windows下使用(/)作为路径分隔符,Java仍然能够正确处理。
由于反斜线用来表示转义字符,因此,表示路径分隔符需用两个反斜线。
在Java程序中我们使用\表示单反斜线(),使用\\表示双反斜线(\).
2.2 编程中如何处理路径分隔符
路径分割符号问题,不同的操作系统不同,在程序中不要硬性编码与平台相关的任何常量.
可以使用File.separator得到不同系统下的路径分隔符。
String sep = File.separator;
file = new File(“d:”+sep+”develop”, “data.txt”);
public class SeparatorDemo {
public static void main(String[] args) {
String sep = File.separator;
File file =new File("E:"+sep+"E-Book"+sep+"leetcode-cpp刷题.pdf");
System.out.println(file.getAbsolutePath());
}
}
/*
* E:\E-Book\leetcode-cpp刷题.pdf
* */