java笔记25 File类、递归、Properties
2015-06-20 23:56
686 查看
1. File类
File类用来将文件或者文件夹封装成对象,方便对文件与文件夹的属性信息进行操作。File对象可以作为参数传递给流的构造函数。
常用方法
1、创建
boolean createNewFile()
如果没有文件,创建成功返回true
再次创建返回false,即没有覆盖。
创建文件夹
f.mkdir();//只能创建一级目录,会创建一个名为file.txt的文件夹
f.mkdirs();//可以创建多级目录
2、删除
boolean delete();
void deleteOnExit();在程序退出时删除
3、判断
boolean exists()
isFile()
isDirectory()
isHidden() :是否隐藏,通常不要读取系统隐藏文件
isAbsoulute():是否是绝对路径
4、获取
getName();返回此抽象路径名表示的文件或目录的名称
getPath();将此抽象路径名转换成一个路径名字符串
getParent(); 获取父目录路径
//该方法返回的是绝对路径中的父目录,因为定义时使用的是file.txt,所以父目录是null
//如果相对路径中有上一级目录,则返回该上一级目录
getAbsouluteFile()
getAbsoulutePath()
lastModified():最后一次被修改的时间
length(); 文件大小 返回类型是long
f.renameTo(f1);//将f的文件名重命名为f1的文件名
public static void method_5() throws IOException { File f=new File("file.txt"); File f1=new File("file2.txt"); f.renameTo(f1);//将f的文件名重命名为f1的文件名 } public static void method_4() throws IOException { File f=new File("file.txt"); f.createNewFile(); sop("abspath"+f.getAbsolutePath());//D:\shakespace\workspace\Heima\file.txt sop("path"+f.getPath());//和new File一样 file.txt sop("parent"+f.getParent());//null //该方法返回的是绝对路径中的父目录,因为定义时使用的是file.txt,所以父目录是null //如果相对路径中有上一级目录,则返回该上一级目录 } public static void method_3() throws IOException { File f=new File("file.txt"); sop(f.exists());//测试是否存在 f.mkdir();//只能创建一级目录,会创建一个名为file.txt的文件夹 //f.mkdirs();//可以创建多级目录 sop(f.isDirectory());//结果为true sop(f.isFile());//结果为false } public static void method_2() throws IOException { File f=new File("H05_10ThisDemo.java"); sop(f.canExecute());//测试是否可执行 true } public static void method_1() throws IOException { File f=new File("file.txt"); sop(f.createNewFile());//true sop(f.delete());//true f.deleteOnExit();//运行结束时删除 }
public static void consMethod()
{
//将a.txt封装成file对象,可以将已有和未出现的文件或者文件夹封装成对象
File f1=new File("D:\\workspace\\a.txt");
File f2=new File("D:\\workspace\\Heima","b.txt");
File f3=new File("D:"+File.separator+"workspace"+File.separator+"Heima","b.txt");
//+File.separator+ 具有跨平台性
}
5、 list():返回目录下的文件和文件夹,包含隐藏文件
import java.io.*;public class H_05FileDemo2 { public static void main(String[] args) { listDemo();//获取文件,包含隐藏文件 listRootsDemo();//得到根目录(CDEF…) } public static void listDemo() { File f=new File("d:\\");//如果是文件,内部没有内容,会报错。 String [] names=f.list(); for(String name: names) { sop(name); } } public static void listRootsDemo() { File[] files=File.listRoots(); for(File f:files) { sop(f);//不能直接获得盘符的大小 } } public static void sop(Object obj) { System.out.println(obj); }}
2. 递归
需求
列出指定目录下的文件或者文件夹,包含子目录中的内容
也就是列出指定目录下的所有内容
遍历→遇到文件夹→继续遍历
1、因为目录中还有目录,只要使用同一个列出目录功能的函数完成即可
在列出过程中出现的还是目录的话,还可以再次调用本功能
也就是函数自身调用自身
这种表现形式或者变成手法,成为递归
关键:函数中调用函数自身。
2、递归的注意点
2.1 限制循环条件
2.2 注意递归的次数,防止内存溢出
示例
public static void toBin(int num)
{
if(num>0)
{
toBin(num/2);
sop(num%2);
}
}
传入6,输出结果是110
不是011
因为递归的时候不断在栈内存开辟空间,从最后满足条件的地方开始
//sum(50000)发生Exception in thread "main" java.lang.StackOverflowError
示例2 显示文件夹中的所有文件
public static void showDir(File dir) { System.out.println(dir); File[] files=dir.listFiles(); for(File s:files) { if(s.isDirectory()) showDir(s); else sop(s); } }
3. 创建java文件列表文件
/*
建立一个java文件列表文件
思路
1、对指定的目录进行递归
2、获取递归过程所有的java文件的路径
public static void fileToList(File dir,List<File> list)
{
File[] files=dir.listFiles();
for(File file:files)//循环file数组
{
if(file.isDirectory())//是目录 递归判断
fileToList(file,list);
else
{
if(file.getName().endsWith("java"))//是文件 判断扩展名
list.add(file);//符合添加到list集合中
}
}
}
3、将这些路径存储到集合中
4、将集合中的数据写入到一个文件中
存入到硬盘中
文件来源:内存
写入目的:硬盘
写入流:
*/
package day20;
import java.io.*;
import java.util.*;
public class H_10JavaFileList {
public static void main(String[] args)
{
File dir=new File("D:\\shakespace\\workspace");
List<File> list=new ArrayList<File>();
fileToList(dir,list);
System.out.println(list.size());//获得文件数量
writeToFile(list);
}
public static void fileToList(File dir,List<File> list)
{
File[] files=dir.listFiles();
for(File file:files)//循环file数组
{
if(file.isDirectory())//是目录 递归判断
fileToList(file,list);
else
{
if(file.getName().endsWith("java"))//是文件 判断扩展名
list.add(file);//符合添加到list集合中
}
}
}
public static void writeToFile(List<File> list)
{
BufferedWriter bufw=null;
try
{
bufw=new BufferedWriter(new FileWriter("D:\\shakespace\\workspace\\Heima\\java.txt"));
for(File f:list)
{
String path=f.getAbsolutePath();
bufw.write(path);
bufw.newLine();
bufw.flush();
}
} catch (IOException e) {
e.printStackTrace();
}
finally
{
if(bufw!=null)
try {
bufw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
4. Properties集合
Properties是hashtable的子类
也就是说它具备map集合的特点,而且它里面存储的都是字符串,不需要加泛型
是集合中和IO技术相结合的集合容器
该对象的特点:可以用于键值对形式的配置文件。
/*
演示 如何将流中的数据存储到集合中
将info.txt中键值存到集合中进行操作
1、用一个流和info.txt文件关联
2、读取一行数据,将该行数据用“=”切割
3、等号左边作为键,右边作为值,存入到Properties集合中即可
*/
package day20;
import java.io.*;
import java.util.*;
public class H_11Properties {
public static void main(String[] args) throws IOException {
//setAndGet();
method_1();
loadDemo();
}
public static void loadDemo() throws IOException
{
Properties prop=new Properties();
FileInputStream fis=new FileInputStream("info.txt");
//将流中的数据加载进集合
prop.load(fis);
prop.setProperty("zhangsan", "23");
//prop.store(new FileOutputStream("info.txt"), "haha");
sop(prop);
prop.list(System.out);
fis.close();
}
public static void method_1() throws IOException
{
BufferedReader bufr=new BufferedReader(new FileReader("info.txt"));
String line=null;
Properties prop=new Properties();
while((line=bufr.readLine())!=null)
{
//sop(line);
String[] arr=line.split("=");
//sop(arr[0]+" "+arr[1]);
prop.setProperty(arr[0], arr[1]);
//顺序按照哈希表
}
bufr.close();
sop(prop);
}
//设置和获取对象
public static void setAndGet()
{
Properties prop=new Properties();
prop.setProperty("zhangsan", "30");
prop.setProperty("lisi", "39");
//System.out.println(prop);
String value=prop.getProperty("zhangsan");
sop(value);
Set<String> names=prop.stringPropertyNames();
for(String s:names)
{
sop(s);
}
}
public static void sop(Object obj)
{
System.out.println(obj);
}
}
需求:获取一个应用程序运行的次数,如果超过5次,给出使用次数已到请注册的提示,并不要再运行程序。
思路:
1、应该有计数器
每次程序启动都需要计数一次,并且是在原有的次数上进行计数。
2、计数器就是一个变量。程序启动时进行计数,计数器必须存在于内存并进行运算。
可是程序一结束,计数器消失了。那么再次启动该程序,计数器又重新被初始化了。
而我们需要多次启动同一个应用程序,使用的是同一个计数器。
这就需要计数器的生命周期边长,从内存存储到硬盘文件中。
3、如何使用这个计数器呢?
首先,程序启动时,应该先读取这个用于记录计数器信息的配置文件。
获取上一次计数器次数。并进行使用次数的判断。
其次,对该次数进行自增,并自增后的次数重新存储到配置文件中。
4、文件中的信息该如何进行存储并体现。
直接存储次数值可以,但是不明确该数据的含义。所以起名字就变得很重要。
这就有了名字和值的对应,所以可以使用键值对。
可是映射关系map集合搞定,又需要读取硬盘上的数据,所以map+io=properties。
import java.io.*;import java.util.*;public class H_14Properties { public static void main(String[] args) throws IOException { Properties prop=new Properties(); File file=new File("count.ini"); if(!file.exists()) file.createNewFile();//不存在则创建 FileInputStream fis=new FileInputStream(file);//创建读取流 prop.load(fis);//从fis中读取键值对 int count=0; String value=prop.getProperty("time");//或者time对应的值 if(value!=null) { count=Integer.parseInt(value); if(count>=5) { System.out.println("试用次数已到,请注册"); return; } } count++;//每次调用时自增 prop.setProperty("time", count+"");//并写入配置文件 FileOutputStream fos=new FileOutputStream(file); prop.store(fos, "");//写入文件 fos.close(); fis.close(); }}
File类用来将文件或者文件夹封装成对象,方便对文件与文件夹的属性信息进行操作。File对象可以作为参数传递给流的构造函数。
常用方法
1、创建
boolean createNewFile()
如果没有文件,创建成功返回true
再次创建返回false,即没有覆盖。
创建文件夹
f.mkdir();//只能创建一级目录,会创建一个名为file.txt的文件夹
f.mkdirs();//可以创建多级目录
2、删除
boolean delete();
void deleteOnExit();在程序退出时删除
3、判断
boolean exists()
isFile()
isDirectory()
isHidden() :是否隐藏,通常不要读取系统隐藏文件
isAbsoulute():是否是绝对路径
4、获取
getName();返回此抽象路径名表示的文件或目录的名称
getPath();将此抽象路径名转换成一个路径名字符串
getParent(); 获取父目录路径
//该方法返回的是绝对路径中的父目录,因为定义时使用的是file.txt,所以父目录是null
//如果相对路径中有上一级目录,则返回该上一级目录
getAbsouluteFile()
getAbsoulutePath()
lastModified():最后一次被修改的时间
length(); 文件大小 返回类型是long
f.renameTo(f1);//将f的文件名重命名为f1的文件名
public static void method_5() throws IOException { File f=new File("file.txt"); File f1=new File("file2.txt"); f.renameTo(f1);//将f的文件名重命名为f1的文件名 } public static void method_4() throws IOException { File f=new File("file.txt"); f.createNewFile(); sop("abspath"+f.getAbsolutePath());//D:\shakespace\workspace\Heima\file.txt sop("path"+f.getPath());//和new File一样 file.txt sop("parent"+f.getParent());//null //该方法返回的是绝对路径中的父目录,因为定义时使用的是file.txt,所以父目录是null //如果相对路径中有上一级目录,则返回该上一级目录 } public static void method_3() throws IOException { File f=new File("file.txt"); sop(f.exists());//测试是否存在 f.mkdir();//只能创建一级目录,会创建一个名为file.txt的文件夹 //f.mkdirs();//可以创建多级目录 sop(f.isDirectory());//结果为true sop(f.isFile());//结果为false } public static void method_2() throws IOException { File f=new File("H05_10ThisDemo.java"); sop(f.canExecute());//测试是否可执行 true } public static void method_1() throws IOException { File f=new File("file.txt"); sop(f.createNewFile());//true sop(f.delete());//true f.deleteOnExit();//运行结束时删除 }
public static void consMethod()
{
//将a.txt封装成file对象,可以将已有和未出现的文件或者文件夹封装成对象
File f1=new File("D:\\workspace\\a.txt");
File f2=new File("D:\\workspace\\Heima","b.txt");
File f3=new File("D:"+File.separator+"workspace"+File.separator+"Heima","b.txt");
//+File.separator+ 具有跨平台性
}
5、 list():返回目录下的文件和文件夹,包含隐藏文件
import java.io.*;public class H_05FileDemo2 { public static void main(String[] args) { listDemo();//获取文件,包含隐藏文件 listRootsDemo();//得到根目录(CDEF…) } public static void listDemo() { File f=new File("d:\\");//如果是文件,内部没有内容,会报错。 String [] names=f.list(); for(String name: names) { sop(name); } } public static void listRootsDemo() { File[] files=File.listRoots(); for(File f:files) { sop(f);//不能直接获得盘符的大小 } } public static void sop(Object obj) { System.out.println(obj); }}
2. 递归
需求
列出指定目录下的文件或者文件夹,包含子目录中的内容
也就是列出指定目录下的所有内容
遍历→遇到文件夹→继续遍历
1、因为目录中还有目录,只要使用同一个列出目录功能的函数完成即可
在列出过程中出现的还是目录的话,还可以再次调用本功能
也就是函数自身调用自身
这种表现形式或者变成手法,成为递归
关键:函数中调用函数自身。
2、递归的注意点
2.1 限制循环条件
2.2 注意递归的次数,防止内存溢出
示例
public static void toBin(int num)
{
if(num>0)
{
toBin(num/2);
sop(num%2);
}
}
传入6,输出结果是110
不是011
因为递归的时候不断在栈内存开辟空间,从最后满足条件的地方开始
//sum(50000)发生Exception in thread "main" java.lang.StackOverflowError
示例2 显示文件夹中的所有文件
public static void showDir(File dir) { System.out.println(dir); File[] files=dir.listFiles(); for(File s:files) { if(s.isDirectory()) showDir(s); else sop(s); } }
3. 创建java文件列表文件
/*
建立一个java文件列表文件
思路
1、对指定的目录进行递归
2、获取递归过程所有的java文件的路径
public static void fileToList(File dir,List<File> list)
{
File[] files=dir.listFiles();
for(File file:files)//循环file数组
{
if(file.isDirectory())//是目录 递归判断
fileToList(file,list);
else
{
if(file.getName().endsWith("java"))//是文件 判断扩展名
list.add(file);//符合添加到list集合中
}
}
}
3、将这些路径存储到集合中
4、将集合中的数据写入到一个文件中
存入到硬盘中
文件来源:内存
写入目的:硬盘
写入流:
*/
package day20;
import java.io.*;
import java.util.*;
public class H_10JavaFileList {
public static void main(String[] args)
{
File dir=new File("D:\\shakespace\\workspace");
List<File> list=new ArrayList<File>();
fileToList(dir,list);
System.out.println(list.size());//获得文件数量
writeToFile(list);
}
public static void fileToList(File dir,List<File> list)
{
File[] files=dir.listFiles();
for(File file:files)//循环file数组
{
if(file.isDirectory())//是目录 递归判断
fileToList(file,list);
else
{
if(file.getName().endsWith("java"))//是文件 判断扩展名
list.add(file);//符合添加到list集合中
}
}
}
public static void writeToFile(List<File> list)
{
BufferedWriter bufw=null;
try
{
bufw=new BufferedWriter(new FileWriter("D:\\shakespace\\workspace\\Heima\\java.txt"));
for(File f:list)
{
String path=f.getAbsolutePath();
bufw.write(path);
bufw.newLine();
bufw.flush();
}
} catch (IOException e) {
e.printStackTrace();
}
finally
{
if(bufw!=null)
try {
bufw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
4. Properties集合
Properties是hashtable的子类
也就是说它具备map集合的特点,而且它里面存储的都是字符串,不需要加泛型
是集合中和IO技术相结合的集合容器
该对象的特点:可以用于键值对形式的配置文件。
/*
演示 如何将流中的数据存储到集合中
将info.txt中键值存到集合中进行操作
1、用一个流和info.txt文件关联
2、读取一行数据,将该行数据用“=”切割
3、等号左边作为键,右边作为值,存入到Properties集合中即可
*/
package day20;
import java.io.*;
import java.util.*;
public class H_11Properties {
public static void main(String[] args) throws IOException {
//setAndGet();
method_1();
loadDemo();
}
public static void loadDemo() throws IOException
{
Properties prop=new Properties();
FileInputStream fis=new FileInputStream("info.txt");
//将流中的数据加载进集合
prop.load(fis);
prop.setProperty("zhangsan", "23");
//prop.store(new FileOutputStream("info.txt"), "haha");
sop(prop);
prop.list(System.out);
fis.close();
}
public static void method_1() throws IOException
{
BufferedReader bufr=new BufferedReader(new FileReader("info.txt"));
String line=null;
Properties prop=new Properties();
while((line=bufr.readLine())!=null)
{
//sop(line);
String[] arr=line.split("=");
//sop(arr[0]+" "+arr[1]);
prop.setProperty(arr[0], arr[1]);
//顺序按照哈希表
}
bufr.close();
sop(prop);
}
//设置和获取对象
public static void setAndGet()
{
Properties prop=new Properties();
prop.setProperty("zhangsan", "30");
prop.setProperty("lisi", "39");
//System.out.println(prop);
String value=prop.getProperty("zhangsan");
sop(value);
Set<String> names=prop.stringPropertyNames();
for(String s:names)
{
sop(s);
}
}
public static void sop(Object obj)
{
System.out.println(obj);
}
}
需求:获取一个应用程序运行的次数,如果超过5次,给出使用次数已到请注册的提示,并不要再运行程序。
思路:
1、应该有计数器
每次程序启动都需要计数一次,并且是在原有的次数上进行计数。
2、计数器就是一个变量。程序启动时进行计数,计数器必须存在于内存并进行运算。
可是程序一结束,计数器消失了。那么再次启动该程序,计数器又重新被初始化了。
而我们需要多次启动同一个应用程序,使用的是同一个计数器。
这就需要计数器的生命周期边长,从内存存储到硬盘文件中。
3、如何使用这个计数器呢?
首先,程序启动时,应该先读取这个用于记录计数器信息的配置文件。
获取上一次计数器次数。并进行使用次数的判断。
其次,对该次数进行自增,并自增后的次数重新存储到配置文件中。
4、文件中的信息该如何进行存储并体现。
直接存储次数值可以,但是不明确该数据的含义。所以起名字就变得很重要。
这就有了名字和值的对应,所以可以使用键值对。
可是映射关系map集合搞定,又需要读取硬盘上的数据,所以map+io=properties。
import java.io.*;import java.util.*;public class H_14Properties { public static void main(String[] args) throws IOException { Properties prop=new Properties(); File file=new File("count.ini"); if(!file.exists()) file.createNewFile();//不存在则创建 FileInputStream fis=new FileInputStream(file);//创建读取流 prop.load(fis);//从fis中读取键值对 int count=0; String value=prop.getProperty("time");//或者time对应的值 if(value!=null) { count=Integer.parseInt(value); if(count>=5) { System.out.println("试用次数已到,请注册"); return; } } count++;//每次调用时自增 prop.setProperty("time", count+"");//并写入配置文件 FileOutputStream fos=new FileOutputStream(file); prop.store(fos, "");//写入文件 fos.close(); fis.close(); }}
相关文章推荐
- java程序中数据类型转换
- 重新定向输出流,实现java程序日志功能。
- java中的三种排序方法使用:选择排序,冒泡排序,sort方法排序。
- 黑马程序员-Java 字符流的使用简明
- java编程思想复用,多态,以及设计模式-复用篇
- java笔记06 数组
- java笔记07 面向对象
- java笔记08 设计模式与单例设计模式
- java笔记09 继承
- java笔记10 多态 Object类
- java笔记11 模板设计模式
- java笔记12 内部类
- java笔记13 异常
- java笔记14 包
- java笔记15 多线程1
- java笔记15 多线程2(线程通信、Lock)
- java笔记16 String类
- java笔记17 集合框架 List Set 泛型
- java笔记18 Map集合
- java笔记19 Collections和Arrays