黑马程序员_day24_File类、过滤器和递归、properties类
----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------
一、File类:
专门用于描述系统中文件或者文件夹的对象。
可以用于操作文件或者文件夹的属性信息。
1,获取文件信息。
获取名称,
获取路径。
获取大小。
获取时间。
...
2,判断。
是只读的不?
是隐藏的不?
3,文件的创建和删除以及该文件是否存在,文件对象自己最清楚。
具体创建,删除,是否存在等功能。
File中构造时,指定的路径可以是存在的,也可以是不存在的。
//将c盘下的demo.txt封装成file对象。
File f1 = new File("c:\\demo.txt");
//将c盘下的abc文件夹封装成file对象。
File f2 = new File("c:\\abc");
File f5 = new File("c:\\abc\\ahha\\a.txt");//windows上使用。
File f6 = new File("c:"+ File.separator+"abc"+ File.separator+"ahha"+ File.separator+"a.txt");//可以在任何平台都可以使用。 File.separator是名称分隔符,在windows系统上是双反斜杠\\
private static final String NAME_SEPARATOR = File.separator;也可以这样自定义。
二、file类方法
1、获取名称
File file = new File("abc");
String name = file.getName();//获取名称
String absPath = file.getAbsolutePath();//获取绝对路径。无论file中封 装的是什么,获取到的都是绝对的。全路径。
String path = file.getPath();//获取路径。获取的是file中封装的内容。
String dir = file.getParent();//获取父目录。
2、大小
long len = file.length();
long len2 = file.getTotalSpace();获取文件所在盘符的空间大小
3、获取最后一次修改的时间
long time = file.lastModified();
//为了知道具体的时间,需要进行转换。
//1,将time毫秒值转成Date对象。//2,对Date对象进行格式化。
Date d = new Date(time);
DateFormat format = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG);
String str_time = format.format(d);
System.out.println(str_time);
4、判断
isHidden()是不是隐藏的
isDirectory()是不是一个目录
5、创建和删除文件和文件夹
对于文件的创建和删除
File file = new File("c:\\2.txt");
//1,创建。
boolean b = file.createNewFile();
如果文件不存在,就创建。如果文件存在,就不创建。输出流流会覆盖,如果不覆盖,需要在构造函数中加入true参数。续写。
//2,删除。
boolean b = file.delete();
//3,是否存在。
boolean b = file.exists();
对于文件夹的创建和删除
创建文件夹。
File dir = new File("c:\\abc");
boolean b = dir.mkdir();创建一级文件夹
File dir = new File("c:\\abc\\a\\b\\c");
boolean b = dir.mkdirs();创建多级文件夹
删除文件夹
boolean b = dir.delete();从里往外删,删完内容才能删目录
要判断file中封装的是文件还是目录必须有前提,必须存在。用exists进行判断。
//if(file.exists() && file.isFile())
6、虚拟机退出时再删除deleteOnExit()
File f1 = new File("c:\\haha.jpg");
// file.deleteOnExit();虚拟机退出时会自动删除f1文件,因为如下
//流对象正在操作这个文件。。
//file.delete();//此时就会发生了异常
7、对文件进行重命名
File f1 = new File("c:\\haha.jpg");
File f2 = new File("d:\\xixi.jpg");
f1.renameTo(f2);将haha.jpg更名为xixi.jpg并从c盘移到d盘。 有一个剪切动作。
8、列出根目录 系统的盘符
File[] roots = File.listRoots();列出系统根
for(File root : roots){对盘符进行遍历
System.out.println(root);
}
三、过滤器
File类中的list()方法 返回的是字符串数组。
String[] names = file.list();//将指定目的下的文件或者文件夹的名称存储到字符串数组中,包含隐藏文件。
list(FilenameFilter filter)过滤出满足过滤器的文件和目录的路径字符串存储到字符串数组中并返回
FilenameFilter是一个接口。此接口的实例可用于文件名过滤器
代码如下:
public class FilterByJavaFile implements FilenameFilter {
public boolean accept(File dir, String name) {
return name.endsWith(".java");返回以.java结尾的文件名
}
}
而listFiles()方法 返回的是文件对象数组。将目录下的文件或文件夹都封装成文件对象。
listFiles(FileFilter filter)文件过滤器
将隐藏的文件过滤出来
File[] files = file.listFiles(new FilterByHidden());
for(File f : files){
System.out.println(f);
}
}
隐藏过滤器
public class FilterByHidden implements FileFilter {
public boolean accept(File pathname) {
return pathname.isHidden();
}
}
可以更改结尾条件的过滤器
public class FilterBySuffix implements FilenameFilter {
private String suffix;
public FilterBySuffix(String suffix) {
super();
this.suffix = suffix;
}
public boolean accept(File dir, String name) {
return name.endsWith(suffix);
}
}
四、递归
递归就是函数自身调用自身(直接或者间接)
1,一定要定义条件。 否则就是StackOverflowError栈内存溢出
2,一定要注意递归次数。不宜过多,否则也会栈内存溢出
什么时候用递归呢?
当一个功能被复用,每次这个功能需要的参数都是根据上一次该功能的元素得出的。
练习:删除一个带内容的文件夹。
思路:
1,删除一个带内容的目录,必须按照window的规则,从里往外删。
2,要删除最里面,如果做到的呢?可以使用递归。
public static void main(String[] args) {
File dir = new File("e:\\demodir");
removeDir(dir);
}
public static void removeDir(File dir){
File[] files = dir.listFiles();
for(File file : files){
if(file.isDirectory()){
removeDir(file);
}else{
System.out.println(file+":"+file.delete());
}
}
System.out.println(dir+":"+dir.delete());
}
}
五、properties类(重要)
Properties:
1, Map接口中Hashtable的子类。
2, 该类上没有泛型定义,因为它的键值都是固定的字符串类型。
3, 因为存储都是字符串数据,通常都作为属性信息存在。
4, 该集合最大的特点就是可以和IO技术相结合。也就是,该集合中的数据可以来自于流。也可以将集合中的数据写入到流中。
对Properties集合最基本演示。
public static void methodDemo_1(){
//1,创建Properties集合对象。
Properties prop = new Properties();
//2,存储元素。
prop.setProperty("wangwu", "28");
prop.setProperty("zhangsan", "20");
prop.setProperty("lisi", "34");
//取元素。所有。
Set<String> nameSet = prop.stringPropertyNames();
for(String name : nameSet){
String value = prop.getProperty(name);
System.out.println(name+":"+value);
}
}
}
//使用list方法将集合中的数据指定目的地。如指定目的地是显示器System.out
prop.list(System.out);//一般用于调试。
下面的方法很重要 开发时常用到
public static void methodDemo_3() throws IOException {
Properties prop = new Properties(); 集合
FileInputStream fis = new FileInputStream("info.txt");输入流
//将流中的数据存储到集合中。 使用集合的load方法。
prop.load(fis);
//想要对数据做修改。
prop.setProperty("wangcai", "37");其实是对文件中的键值对进行覆盖。
//想要将修改的数据保存到文件中。
// 使用store方法。
FileOutputStream fos = new FileOutputStream("info.txt");新创该文件对其覆盖。
prop.store(fos, "haha");haha部分是描述部分
fos.close();
fis.close();
prop.list(System.out);
}
六、对properties类的操作练习
练习:定义一个功能用于记录住软件运行的次数,如果运行次数大于5次。不要在运行
并给出提示:试用次数已到,请注册!给钱!
思路:
1,计数器。而且这个计数器必须软件运行结束后,持久化存储。
2,每次软件启动都要读取这个记录了计数器的数据的文件。并将计数器的值取出自增后,在重新存储。
3,数值需要名称标记,就有了键值对。这就是map集合,还要操作硬盘设备上的数据,就使用到了IO流。
map和io结合的对象正好有Properties.
代码如下:
public static void main(String[] args) throws IOException {
if(countDemo()){
//运行程序代码。
System.out.println("运行程序");
}else{
System.out.println("试用次数已到,请注册!给钱!");
}
}
public static boolean countDemo() throws IOException{
Properties prop = new Properties();集合
int count = 0;
//配置文件。
File confile = new File("config.txt");
if(!confile.exists())
confile.createNewFile();确认配置文件的存在以便读入流
FileInputStream fis = new FileInputStream(confile);
//将流中的数据加载到prop中。
prop.load(fis);
//获取配置文件中的次数。
String value = prop.getProperty("count");
if(value!=null){
count = Integer.parseInt(value);
if(count>=5){
// System.out.println("试用次数已到,请注册!给钱!");
return false;
}
}
count++;
System.out.println("运行"+count+"次");
//将具体的键和次数存储到集合中。
prop.setProperty("count", String.valueOf(count));//count+"";
//将集合中的数据写入到文件中持久化。
FileOutputStream fos = new FileOutputStream(confile);
prop.store(fos, "");
fos.close();
fis.close();
return true;
}
}
七、列出文件清单练习
思考题:
对指定目录中的所有(包含子目录)的Java文件的绝对路径写入到一个文本文件中。
这样查找某个java文件会比较便捷。建立指定文件的清单。
思路:
1,递归。
2,在递归过程需要过滤。
3,满足条件的文件很多,需要容器存储。
4,将存储的文件绝对路径写入到一个文件中。
定义功能对指定的目录进行递归。
在递归过程中需要过滤。
而且对过滤条件满足需要进行存储。
public static void listAllJavaFile(File dir, FilenameFilter filter,List<File> list){
File[] files = dir.listFiles();
if(files!=null){
for(File file : files){
if(file.isDirectory()){//如果是目录就递归。
listAllJavaFile(file, filter, list);
}else{
if(filter.accept(dir, file.getName())){//使用过滤器对指定的目的和文件名进行过滤。符合条件进行存储。
list.add(file);
}
}
}
}
}
对集合中存储的内容的信息写入到文件中。
public static void write2File(List<File> list,File dest) throws IOException{
BufferedWriter bufw = null;
try {
bufw = new BufferedWriter(new FileWriter(dest));
//遍历集合。
for (File file : list) {
bufw.write(list.getAbsolutePath());
bufw.newLine();
bufw.flush();
}
} finally{
if(bufw!=null)
try {
bufw.close();
} catch (IOException e) {
throw new RuntimeException("关闭失败");
}
}
}
----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------