黑马程序员---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(  );返回此抽象路径名父目录的路径名字符串,如果此路径名没有指定父目录,则返回null
lastModified(  );返回此抽象路径名表示的文件夹的最后一次被修改的时间
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()+""+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()+""+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: 
 

黑马程序员---IO流4(File类,Properties类)

上一篇:Magento站点优化方案


下一篇:ReactNative踩坑日志——如何实现删除scrollview中的视图