File
一、什么是File类?
File类就是Java中对文件这类事物的描述,Field类对象可以代表一个路径,该路径可以是文件也可以是文件夹,该类方法可以对这个路径进行各种操作
二、创建Field对象的格式
File f = new File(“file.txt”);
File对象的路径:
1、绝对路径:从 盘符开始,是一个固定路径
2、相对路径:不从盘符开始,相对于某个位置,在 Eclipse中如果使用相对路径,则相当于工程根目录,cmd中则相当于当前目录
常用方法:
创建:
*****createNewFile() 创建文件
*****mkdir(); 创建文件夹(仅一级)
*****mkdirs(); 创建文件夹(父级不存在也创建)
判断:
*****boolean exists() 判断是否存在
boolean isAbsolute(); 是否是绝对路径
*****boolean isDirectory(); 是否是文件夹
*****boolean isFile(); 是否是文件
boolean isHidden(); 是否是隐藏文件
canExecute(); 是否可执行
获取:
getAbsolutePath(); 获取绝对路径
*****getParent()); 获取父级路径
*****getName()); 获取文件或文件夹名
*****length() 文件大小
*****lastModified(); 获取文件的最后修改时间
getFreeSpace(); 获取当前盘符剩余空间
getTotalSpace(); 获取当前盘符总空间
getUsableSpace(); 获取当前盘符可用空间
删除:
*****delete(); 删除, 文件可以直接删除, 文件夹只能删空的
*****deleteOnexit(); 在程序退出时删除文件
剪切:
**renameTo(); 改名, 可以移动文件
比较特殊的方法:
File[] listRoots() 列出计算机中所有的盘符
String[] list() 返回指定目录下的所有文件及目录(文件须存在)
*****File[] listFiles() 返回指定目录下的所有文件及目录
练习:
递归使用:
注意限定条件,递归出口
注意递归次数,避免内存溢出
1.列出指定文件夹下的所有文件
public static void main(String[] args)
{
File file = new File("d:\\");
if(file.exists()){
if(file.isDirectory())
show(file);
}
}
public static void show(File file){
File [] files = file.listFiles();
System.out.println(file);
for(int i=0;i<files.length;i++){
if(files[i].isDirectory()){
show(files[i]);
} else
System.out.println(files[i]);
}
}
注:这里本人有个小疑惑,为什么会报空指针异常。别人考代码去运行没问题,有点崩溃。猜测是系统在使用目录下的文件,导致不可读。
问题解决:当遍历到的文件夹是空的话,files.lenth就会报空指针异常。只需要在 for(int i=0;i<files.length;i++)前加上判断语句(if(files!=null)).
2.将文件路径存放到一个文件中
/**将文件路径存放到一个文件中
* 思路:
* 1.遍历一个文件夹下的所有文件
* 2.将文件装入一个集合
* 3.遍历集合的元素一一写到一个文件中
*/
public static void main(String[] args) throws Exception {
File file = new File("d:\\jdk");
List<File> list = new ArrayList<File>();
show(file, list);
BufferedWriter bw = new BufferedWriter(new FileWriter("c:\\ab.txt"));
// char[] cbuf = new char[1024*2];
for(File f:list) {
bw.write(f.getAbsolutePath());
bw.newLine();
bw.flush();
}
}
public static void show(File file,List<File> list){
File [] files = file.listFiles();
//加入根目录
list.add(file);
System.out.println(file);
for(int i=0;i<files.length;i++){
if(files[i].isDirectory()){
show(files[i],list);
}
else
list.add(file);
}
}
3.删除一个非空的文件夹
/**
* 思路:删除文件夹需要先删除文件夹下面的文件
* 1.递归遍历文件夹下我文件,
* 2.删除文件
* 3.删除根文件夹
*/
public static void main(String[] args) {
File dir = new File("d:\\day01");
if(dir.exists()) {
if(dir.isDirectory())
delete(dir);
}
}
public static void delete(File dir) {
File[] files = dir.listFiles();
for(int i=0;i<files.length;i++) {
if(files[i].isDirectory())
delete(files[i]);
files[i].delete();
}
dir.delete();
}
4.将一个文件下的所有.java文件打印在在控制台
/** 思路:
* 1.遍历一个文件夹
* 2.使用Filefilter,实现其accept方法,过滤指定后缀文件
*/
public static void main(String[] args) throws Exception {
File dir = new File("E:\\黑马毕向东\\源代码\\day02");
String filtername = ".java";
if(dir.isDirectory())
fileFilter(dir, filtername);
}
public static void fileFilter(File dir,final String filterName) throws Exception {
File[] files = dir.listFiles(new FilenameFilter(){
public boolean accept(File dir, String name) {
return name.endsWith(filterName);
}} );
for(int i=0;i<files.length;i++) {
if(files[i].isDirectory())
fileFilter(files[i],filterName);
System.out.println(files[i]);
}
}
三、Properties概述:
Properties是HashTable的子类,用来存储键值对,可以用来作为配置文件(文件中必须是k=v)。是集合中和IO技术相结合的容器。
Properties的方法:
load(InputStream):通过流加载配置文件到集合中
Store(OutputStream,String):将内存对集合的改变写到配置文件中,将集合的数据写入到文件中,String使用来添加注释的,不会被解析
setPropertity(key,value),getProperty():
Set stringPropertyNames():
练习;
1.限制程序运行次数,当运行次数到达5次时,给出请您注册的提示。并不再让该程序执行。
public static void main(String[] args) throws Exception
{
File file = new File("count.properties");
//如果文件不存在,则新建文件
if(!file.exists())
file.createNewFile();
runNum(file);
}
public static void runNum(File file)throws Exception{
//定义一个持久属性集
Properties pro = new Properties();
BufferedReader bufr = null;
BufferedWriter bufw = null;
try
{
//定义读取流并与文件关联
bufr = new BufferedReader(new FileReader(file));
//定义输出流并与文件关联
bufw = new BufferedWriter(new FileWriter(file));
//将流中的数据加载进集合
pro.load(bufr);
//获取用户登录次数
String countValue = pro.getProperty("count");
int count = (countValue==null)?1:((Integer.parseInt(countValue)));
//判断
if(countValue==null){
System.out.println("首次使用本程序,信誉度+1");
}
else
if(count<5)
System.out.println("这是您第"+count+"次使用本程序,您还剩余"+(5-count)+"次机会");
else{
System.out.println("您的使用次数已达上限,请登录XXX重新注册");
return;
}
count++;
//根据键修改次数
pro.setProperty("count",count+"");
//把新数据写入文件
pro.store(bufw,"使用次数已更改");
}
catch (IOException e)
{
throw new RuntimeException();
}
finally{
try
{
if(bufr!=null)
bufr.close();
}
catch (IOException e)
{
throw new RuntimeException();
}
finally{
try
{
if(bufw!=null)
bufw.close();
}
catch (IOException e)
{
throw new RuntimeException();
}
}
}
}