IO流4(File类,Properties类)
File类:
File类是用来将文件或者文件夹封装成对象,方便对文件或者文件夹的属性信息进行操作。
1: public static void main(String[] args)
2: {
3: //将a.txt封装成File类对象,可以将已知的和未出现的文件或者文件夹封装成对象
4: File f1=new File("a.txt");
5: //将b.txt封装到abc文件夹下
6: File f2=new File("c:\\abc","b.txt");
7: //先将abc文件夹封装成一个对象,在作为参数,将c.txt封装到abc文件夹下
8: File d=new File("c:\\abc");
9: File f3=new File(d,"c.txt");
10:
11: //打印结果为a.txt,打印结果为被封装的路径
12: System.out.println("f1:"+f1);
13: //目录分隔符\\在Linux下不会被识别,跨平台性差,可以用separator来替换
14: File f4=new File("c:"+File.separator+"abc","b.txt");
15: }
File类的常见方法:
<1>创建
boolean creatNewFile( );在指定位置创建文件时,如果该文件已经存在,则不创建,返回false,和输出流不一样,输出流对象一建立就创建文件,如果文件已经存在,就覆盖掉。
boolean mkdir( );创建文件夹
boolean mkdirs( );创建多级文件夹
1: File f=new File("abc");
2: System.out.println("mkdir"+f.mkdir());
3:
4: File f1=new File("abc\\kkk\\dd");
5: System.out.println("mkdirs"+f1.mkdirs());
<2>删除
boolean delete( );void deleteOnExit( );在程序退出时,删除掉指定的文件
<3>判断
boolean canExecute( );是否可执行boolean canRead( );是否可读boolean canWrite( );是否可写boolean exists( );文件是否存在boolean isDirectory( );是否是目录boolean isFile( );是否是文件boolean isHidden( );是否为隐藏文件boolean isAbsolute( );是否为绝对路径,文件不存在,也可以进行判断
1: File f=new File("d:\\java1223\\day20\\file.txt");
2: System.out.println(f.isAbsolute());
3:
此时并未创建文件,但是打印结果依旧为true。<4>获取信息getPath( );获取路径,获取到的是被封装的路径getAbsolutePath( );获取绝对路径getName( );获取到文件名getParent( );返回此抽象路径名父目录的路径名字符串,如果此路径名没有指定父目录,则返回nulllastModified( );返回此抽象路径名表示的文件夹的最后一次被修改的时间length( );返回此抽象路径名表示的文件的长度renameTo( );重命名
1: File f1=new File("c:\\Test.java");
2: File f2=new File("D:\\hahah.java");
3:
4: System.out.println("rename:"+f1.renameTo(f2));
5:
作用是将C盘下的Test文件重命名为hahah,并且移动到D盘下去。list( );返回值为String[] ,是一个字符串数组,功能为打印所有文件名以及文件夹名
1: //将C盘下的所有文件以及文件夹的名称都打印出来,包括隐藏文件
2: File f=new File("c:\\");
3: String[] names=f.list();
4: for(String name:names)
5: {
6: System.out.println(name);
7: }
8:
调用list方法的File对象必须是封装了一个目录,而且该目录必须存在。
练习:将D:\\j\\day19下的所有的java文件列出来
1: public static void main(String[] args)
2: {
3: File f=new File("D:\\j\\day19");
4:
5: String[] names=f.list();
6:
7: for(int x=0;x<names.length;x++)
8: {
9: if(names[x].endsWith(".java"))
10: System.out.println(names[x]);
11: }
12: }
使用文件名过滤:
1: import java.io.*;
2:
3: class JavaFileList
4: {
5: public static void main(String[] args) throws IOException
6: {
7: FileWriter fw=new FileWriter("javalist.txt");
8:
9: BufferedWriter bufw=new BufferedWriter(fw);
10:
11: File dir=new File("d:\\j\\day19");
12: javaFileList(dir,bufw);
13:
14: bufw.close();
15: }
16:
17: public static void javaFileList(File dir,BufferedWriter bufw)throws IOException
18: {
19: File[] files=dir.listFiles();
20: for(int x=0;x<files.length;x++)
21: {
22: if(files[x].isDirectory())
23: javaFileList(files[x],bufw);
24: else if(files[x].getName().endsWith(".java"))
25: {
26: bufw.write(files[x].getName()+"----AbsolutePath----"+files[x].getAbsolutePath());
27:
28: bufw.newLine();
29: bufw.flush();
30: }
31: }
32: }
33:
34: }
35:
ListFiles( );返回值为File类型
1:
2: File dir=new File("c:\\");
3: File[] files=dir.listFiles();
4:
5: for(File f:files)
6: {
7: System.out.println(f.getName()+"....."+f.length());
8: }
9:
10: //使用list()方法或者listFiles()方法,都只可以取出来当前目录下的文件或者文件夹,
11: //不可以取出来子目录下的文件或者文件夹
列出来指定目录下的文件或者文件夹,包含子目录中的内容,即列出来指定目录下的所有内容。
1: class FileDemo3
2: {
3: public static void main(String[] args)
4: {
5: File dir=new File(d:\\java1223);
6: showDir(dir);
7:
8: }
9:
10: public static void showDir(File dir)
11: {
12: System.out.println(dir);
13: File[] files=dir.listFiles();
14: for(int x=0;x<files.length;x++)
15: {
16: if(files[x].isDirectory())
17: showDir(files[x]);//递归,函数自身调用自身
18: else
19: System.out.println(files[x]);
20: }
21: }
22: }
23: /*递归的注意事项:
24: 1.限定条件
25: 2.要注意递归次数,尽量避免内存溢出
26: */
需求:删除掉带内容的目录
分析:在window中,删除目录是从里面往外删除的,需要用到递归
1: class RemoveDirDemo
2: {
3: public static void main(String[] args)
4: {
5: File f=new File("c:\\j\\");
6: removeDir(f);
7: }
8:
9:
10: public static void removeDirDemo(File dir)
11: {
12: File[] files=dir.listFiles();
13: for(int x=0;x<files.length;x++)
14: {
15: if(files[x].isDirectory())
16: removeDir(files[x]);
17: else
18: //进行判断,如果是文件的话,就进行删除
19: files[x].delete();
20: }
21: //删除掉该目录下的所有文件以后,删除掉该目录
22: dir.delete();
23: }
24: }
25:
练习:将一个指定目录下的java文件的绝对路径存储到一个文本文件中去
1: import java.io.*;
2:
3: /*
4: 首先应该开辟一个新的文本文档,用来存储。
5: 然后遍历指定目录下的所有的文件,如果是java文件的话,则将名字和绝对路径写入到文本
6: 文档中去。
7: */
8: class JavaFileList
9: {
10: public static void main(String[] args) throws IOException
11: {
12: FileWriter fw=new FileWriter("javalist.txt");
13:
14: BufferedWriter bufw=new BufferedWriter(fw);
15:
16: File dir=new File("d:\\j\\day19");
17: javaFileList(dir,bufw);
18:
19: bufw.close();
20: }
21:
22: public static void javaFileList(File dir,BufferedWriter bufw)throws IOException
23: {
24: File[] files=dir.listFiles();
25: for(int x=0;x<files.length;x++)
26: {
27: if(files[x].isDirectory())
28: javaFileList(files[x],bufw);
29: else if(files[x].getName().endsWith(".java"))
30: {
31: bufw.write(files[x].getName()+"----AbsolutePath----"+files[x].getAbsolutePath());
32:
33: bufw.newLine();
34: bufw.flush();
35: }
36: }
37: }
38:
39: }
40:
41:
42:
Properties类:
Properties类是Hashtable的子类,也就是说,它具备Map集合的特点,而且它里面存储的键值对都是字符串,是集合中和IO技术相结合的集合容器。
该对象的特点是:可以用于键值对形式的配置文件
Properties类的常用方法:
<1>设置和获取元素setProperty(String key,String value); getProperty(String key)
1:
2:
3: public static void setAndGet()
4: {
5: Properties prop=new Properties();
6: prop.setProperty("zhangsan","30");
7: prop.setProperty("lisi","39");
8:
9: String value=prop.getProperty("lisi");
10: System.out.println(value);
11: }
12:
1: //获取到所有的元素
2: Set<String> names=prop.stringPropertyNames();
3: for(String s:names)
4: {
5: System.out.println(s+"....."+prop.getProperty(s));
6: }
stringPropertyNames 方法的返回值为Set类型,里面存储的是key值
<2>如何将流中的数据存储到集合中去呢?
例如:将info.txt中的键值对数据存储到集合中进行操作
思路:
1.首先需要用一个流和info.txt文件关联
2.读取一行数据,将该行数据用“=”进行切割
3.等号左边的作为键,等号右边的作为值,存储到Properties中去
1: import java.io.*;
2: import java.util.*;
3:
4: class PropertiesDemo
5: {
6: public static void method_1(Properties prop)
7: {
8: BufferedReader bufr=null;
9:
10: try
11: {
12: bufr=new BufferedReader(new FileReader("info.txt"));
13: String arr=null;
14: while((arr=bufr.readLine())!=null)
15: {
16: String[] s=arr.split("=");
17: prop.setProperty(s[0],s[1]);
18: }
19: }
20: catch (Exception e)
21: {
22: System.out.println("读取失败");
23: }
24: finally
25: {
26: try
27: {
28: bufr.close();
29: }
30: catch (Exception e)
31: {
32: System.out.println("关闭资源失败");
33: }
34:
35: }
36:
37: }
38:
39: public static void main(String[] args)
40: {
41: Properties prop=new Properties();
42: method_1(prop);
43: Set<String> names=prop.stringPropertyNames();
44: for(String s:names)
45: {
46: System.out.println(s+"-------"+prop.getProperty(s));
47: }
48: }
49: }
1:
2: /*
3: load(InputStream inStream),从输入流读取属性列表
4: load(Reader reader),用面向行的格式,从输入字符流中读取属性列表(键和元素对)
5:
6: */
7: public static void loadDemo()throws IOException
8: {
9: Properties prop=new Properties();
10: FileInputStream fis=new FileInputStream("info.txt");
11:
12: //将流中的数据加载进集合
13: prop.load(fis);
14:
15: //list(PrintStream ps) list(PrintWriter pw)将属性列表输出到指定的输出流
16: prop.list(System.out);
17: }
18:
19: /*
20: 此时如果prop.setProperty("wangwu","39");
21: 修改了王五的年龄,打印结果中的年龄改变了,但是info文件中的年龄没有发生改变
22: 使用store(OutputStream out,String comments)方法,将Properties表中的属性列表写入输出流
23:
24: FileOutputStream fos=new FileOutputStream("info.txt");
25: prop.store(fos,"haha");
26: 其中haha为注释信息,会以#haha的形式出现在info.txt文件中去
27: */
练习:用于记录应用程序运行次数,如果使用次数已到,则给出注册提示
1: class RunCount
2: {
3: public static void main(String[] args) throws IOException
4: {
5: Properties prop=new Properties();
6: File file=new File("count.ini");
7:
8: //如果文件不存在的话,则创建一个文件
9: if(!file.exists())
10: file.createNewFile();
11: FileInputStream fis=new FileInputStream(file);
12:
13: //将文件中的信息加载到集合中去,并进行操作
14: prop.load(fis);
15:
16: int count=0;
17: String value=prop.getProperty("time");
18: if(value!=null)
19: {
20: count=Integer.parseInt(value);
21: if(count>=5)
22: {
23: System.out.println("您好,使用次数已到");
24: return ;
25: }
26: }
27:
28: count++;
29: prop.setProperty("time",count+"");
30: FileOutputStream fos=new FileOutputStream(file);
31: prop.store(fos,"");
32: fos.close();
33: fis.close();
34:
35:
36: }
37: }
38: