黑马程序员 java基础之IO流二



------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------


一、概述

1File类:文件和目录路径名的抽象表现形式

2、特点:

        1)用来将文件或文件夹封装成对象

        2)方便于对文件与文件夹的属性信息进行操作

        3File类的实例是不可变的;也就是说,一旦创建,File 对象表示的抽象路径名将永不改变

        4File对象可以作为参数传递给流的构造函数

 

二、File对象创建

方式一:      

             File f =new File("a.txt");

        将a.txt封装成File对象。可以将已有的和未出现的文件或者文件夹封装成对象。

 方式二:

            File f2=newFile("c:\\abc","b.txt");

        将文件所在目录路径和文件一起传入,指定文件路径。

 方式三:

            File d=new File("c:\\abc");

             File f3=new File(d,"c.txt");

        将文件目录路径封装成对象。再创建文件对象。降低了文件于父目录的关联性。

小知识:

        File.separator表示目录分隔符,可以跨平台使用。相当于路径中的“\”(双斜杠\\windows中表示表示转义后的分隔符,但是在linux系统中就不是)。

 

三、File类的常见方法

1、创建

        booleancreateNewFile();

        //在指定位置创建文件,如果该文件已经存在,则不创建,返回false。和输出流不一样,输出流对象一建立就创建文件。而且文件已经存在,会覆盖。

        boolean mkdir();//创建文件夹,只能创建一级文件夹

例:

        File dir=new File("abc");

        dir.mkdir();//创建abc这个文件夹

        boolean mkdirs();//创建多级文件夹

2、删除

        boolean delete();

        //删除文件或目录。文件存在,返回true;文件不存在或者正在被执行,返回false    

        void deleteOnExit();//在程序退出时删除指定文件

3、判断

        boolean canExecute();//是否是可执行文件

        boolean exists();//文件是否存在

        boolean isFile();//是否是文件

        boolean isDirectory();//是否是文件夹

        boolean isHidden();//是否是隐藏文件

        boolean isAbsolute();//文件是否是绝对路径

记住:在判断文件对象是否是文件或者目录时,必须要判断该文件对象封装的内容是否存在。通过exists判断。

4、获取信息

        String getName();//获取文件名

        String getPath();

        //获取文件的相对路径(即创建的对象传入的参数是什么就获取到什么)

        String getParent();

        //获取文件父目录。返回的是绝对路径中的父目录。如果获取的是相对路径,返回null。如果相对路径中有上一层目录,那么该目录就是返回结果。

        String getAbsolutePath();//获取文件的绝对路径      

        long lastModified();//返回文件最后一次被修改的时间

        long length();//返回文件长度

5、列出文件及文件过滤

        static File[] listRoots();//列出可用的文件系统根目录,即系统盘符

        String[] list();

        //列出当前目录下所有文件,包括隐藏。调用list方法的file对象必须是封装了一个目录。该目录还必须存在。

        String[]list(FilenameFilter filter);

        //返回一个字符串数组,获取目录中满足指定过滤器的文件或目录。

        //FilenameFilter:文件名过滤器,是一个接口,其中包含一个方法,accept(Filedir,String name),返回的是boolean型,对不符合条件的文件过滤掉。

        File[] listFiles();//返回一个抽象路径名数组,获取当前文件夹下的所有文件和文件夹

        File[] ListFiles(FilenameFilterfilter);//返回抽象路径名数组,获取目录中满足指定过滤器的文件或目录。


/*
练习:用String[] list(FilenameFilter filter)方法获取一个目录下所有的.java文件,其他文件不要。
思路:1、FilenameFilter是一个过滤器接口,用匿名内部类传入filter对象
	  2、复写FilenameFilter接口的accept(File file,String name)方法,并判断name是否是java文件
	  3、遍历String类型数组
*/

import java.io.*;
class  GetJavaFile
{
	public static void main(String[] args) 
	{
		File file=new File("E:\\Java Study\\Practice\\day07");
		getJavaFile(file);
	}
	//获取一个目录下所有的.java文件方法
	public static void getJavaFile(File dir)
	{
		//传入FilenameFilter匿名内部类子类对象,并复写accept方法
		String[] javaFile=dir.list(new FilenameFilter()
		{
			public boolean accept(File dir,String name)
			{
				return name.endsWith(".java");//判断文件名是否是以.java结尾
			}
		});

		System.out.println("len:"+javaFile.length);
		//遍历数组
		for (String s : javaFile )
		{
			System.out.println(s);
		}
	}
}
递归

1、定义

       当函数内每一次循环还可以调用本功能来实现,也就是函数自身调用自身。这种表现形式,或者编程手法,称为递归。

2、递归注意事项

        a、限定条件。是来结束循环调用,否则是死循环。

        b、注意递归的次数,尽量避免内存溢出。因为每次调用自身的时候都会先执行下一次调用自己的方法,所以会不断在栈内存中开辟新空间,次数过多,会导致内存溢出。

/*
需求:列出指定目录下文件或文件夹,包含子目录,即列出指定目录下所有内容(带层次的)。

分析,因为目录中还有目录,只有使用同一个列出目录功能的函数完成即可,在列出过程中出现的还是目录的话,还可以再调用本功能,这就是利用递归原理。

*/
import java.io.*;
class  RecursionDemo
{
	public static void main(String[] args) 
	{
		//关联指定路径
		File dir=new File("e:\\Java Study\\Practice");
		
        //列出关联路径中所有的.java文件
		allFileList(dir,0);
	}

	//列出指定目录下的所以内容
	public static void allFileList(File dir,int level)
	{
		//有层次的输出
		System.out.println(getLevel(level)+dir);
		level++;
		File[] fileArr=dir.listFiles();//获取本目录下的所以文件和目录的抽象路径
		
        //遍历
		for (File file : fileArr)
		{
			if(file.isDirectory())
			{
				//如果目录下还是目录,则继续调用本函数
				allFileList(file,level);
			}
			else
				System.out.println(getLevel(level)+file);//显示(列出)文件
		}	
	}

	//带层次的列表
	public static String getLevel(int level)
	{
		StringBuilder sb=new StringBuilder();
		sb.append("|--");
		//每多一级目录,就多输出指定字符
		for (int x=level;x>0 ; x--)
		{
			//sb.append("|--");
			sb.insert(0,"|  ");
		}
		return sb.toString();
	}
}

/*
删除一个带内容的目录。
删除原理:
在windows中,删除目录从里面往外面删除的。
既然是从里往外删除。就需要用到递归。

*/
import java.io.*;
class RemoveDir 
{
	public static void main(String[] args) 
	{
		//指定目录
		File dir=new File("e:\\1");
		//删除目录
        removeDir(dir);

	}

	//删除传入目录
	public static void removeDir(File dir)
	{
		File[] files=dir.listFiles();//列出目录下的所以文件和文件夹
		//遍历
        for (File file : files )
		{
			//如果还是目录且非隐藏
			if(!file.isHidden()&&file.isDirectory())
				removeDir(file);//继续删除目录里的内容
			else
				System.out.println(file.toString()+":-file-:"+file.delete());//删除文件
		}
		System.out.println(dir+":::dir:::"+dir.delete());//删除目录
	}
}

/*
练习:
将一个指定目录下的java文件的绝对路径,存储到一个文本文件中。建立一个java文件列表的文件。
思路:
     1、对指定的目录进行递归。
     2、获取递归过程所有的java文件的路径。
     3、将这些路径存储到集合中。
     4、将集合中的数据写入到一个文件中。
*/
import java.util.*;
import java.io.*;

class  JavaFileList
{
	public static void main(String[] args) 
	{
		//指定目录
		File dir=new File("e:/Java Study/Practice");
		
		//定义一个List集合,用于存储.java文件的File对象
		List list =new ArrayList();
		
		//调用获取文件路径方法
		fileToList(dir,list);
		
		//指定写入文件
		File file=new File(dir,"javafilelist.txt");
		//调用写入文件方法
        writeToFile(list,file);
	
	}
	//获取指定文件夹内的所有java文件的绝对路径,并存入集合中
	public static void fileToList(File dir,List list)
	{
		File[] files=dir.listFiles();//列出dir路径下的所以文件和目录,
		//遍历
		for (File file : files)
		{
			//如果是目录,则继续获取
			if(file.isDirectory())
			{
				list.add(file.getAbsoluteFile());//把父目录路径也存入
				fileToList(file,list);
			}
			//将是.java文件的绝对路径存入
			else if(file.getName().endsWith(".java"))
				list.add(file);
		}
	}

	//将集合中元素写入到一个文本文件中
	public static void writeToFile(List list,File file)
	{
		
		BufferedWriter bw=null;
			
		try
		{	//使用字符流缓冲区对象关联写入的文件
			bw=new BufferedWriter(new FileWriter(file));
			for (File file0 : list )
			{
				bw.write(file0.getAbsolutePath());//写入
				bw.newLine();//换行
				bw.flush();//刷新
			}
		}
		catch (IOException e)
		{
			throw new RuntimeException("写入文件失败");
		}
		finally
		{
			try
			{
				if(bw!=null)
					bw.close();//关流
			}
			catch (IOException e)
			{
				throw new RuntimeException("流资源关闭失败");
			}
		}
	}
}

Properties

一、概述

1PropertiesHashtable的子类,它具备Map集合的特点。而且它里面还有存储的键值对,都是字符串,无泛型定义。是集合中和IO技术想结合的集合容器。

2、特点:

        1)可用于键值对形式的配置文件

        2)在加载时,需要数据有固定的格式,常用的是:键=

 

二、特有方法

1、设置

        Object setProperty(String key,String value);

        //设置键和值,调用Hashtable的方法put

2、获取

        String getProperty(String key);

        //指定key搜索value

        Set stringPropertyName();

        //返回属性列表的键集,存入Set集合

3、加载流和存入流

        void load(InputStream ism);

        //从输入字节流中读取属性列表(键和元素对)。又称将流中的数据加载进集合。

        void load(Readerreader);

        //从输入字符流中读取属性列表(键和元素对)。又称将流中的数据加载进集合。

        voidlist(PrintStream out);//将属性列表输出到指定的输出流

        void store(OutputStreamout,String comments);

        //对应load(InputStream )将属性列表(键值对)写入输出流。comments属性列表的描述。

        void store(Writerwriter, String comments);

        //对应load(Reader)将属性列表(键值对)写入输出流。comments属性列表的描述

//演示,如何将流中的数据存储到集合中。
	//想要将info.txt中键值数据存到集合中进行操作。
	/*
		1,用一个流和info.txt文件关联。
		2,读取一行数据,将该行数据用"="进行切割。
		3,等号左边作为键,右边作为值。存入到Properties集合中即可。

	*/
		//将文件数据存储进Properties集合方法
	public static void method()throws IOException
	{
		//使用字符读取缓冲流关联文件
		BufferedReader bufr = new BufferedReader(new FileReader("info.txt"));

		String line = null;
		//定义Properties集合
		Properties prop = new Properties();

		   	while((line=bufr.readLine())!=null)
		{
			String[] arr = line.split("=");//将一行数据以“=”号进行分割
			//将=左边作为键存入,将=右边作为值存入
			prop.setProperty(arr[0],arr[1]);
		}

		bufr.close();//关流

		System.out.println(prop);
	}

/*
练习:用于记录应用程序运行次数。如果使用次数已到,那么给出注册提示。
	
分析:
很容易想到的是:计数器。可是该计数器定义在程序中,随着该应用程序的退出,该计数器也在内存中消失了。
所以要建立一个配置文件,用于记录该软件的使用次数。该配置文件使用键值对的形式。键值对数据是map集合。数据是以文件形式存储。使用io技术。那么map+io——>Properties。

思路:1、用读取流关联文本信息文件。如果存在则读取,如果不存在,则创建
	  2、每次运行,将文件数据存入集合中,读取值,判断次数,如果小于等于5次,则次数增加1次,如果大于则输出提示信息。
	  3、将值小于等于5次的信息数据存入文件中
*/
import java.util.*;
import java.io.*;

class  RunCount
{
	public static void main(String[] args)throws IOException 
	{
		int count=runCount();
		if(count>5)//如果程序被使用了超过5次,则终止使用,并提示
		{
			System.out.println("次数到了,交钱!!!!!");
			return ;
		}
		else
			System.out.println("程序第"+count+"次Run!");
	}
	//获取程序运行的次数
	public static int runCount()throws IOException
	{
		Properties ps=new Properties();//创建集合对象

		File file=new File("info.ini");//将文件进行封装
		if(!file.exists())//判断是否存在
			file.createNewFile();
		FileReader fr=new FileReader(file);//将文件于读取流进行关联
		
		ps.load(fr);//加载流中的文件数据到集合中

		int count=0;//定义计数器
		String value=ps.getProperty("time");//获取次数值
		
		if(value!=null)//如过值不等于null,则将其赋值给count
		{
			count=Integer.parseInt(value);
		}
		count++;//每启动一次自增
		ps.setProperty("time",count+"");//将次数记录住集合

		FileWriter fw=new FileWriter(file);
		ps.store(fw,"");//将集合中的数据存入硬盘文件中
		
		fr.close();//关流
		fw.close();

		return count;//返回程序启动的次数
	}
}

 打印流

一、概述

        1、打印流包括:PrintStreamPrintWriter

        2、该流提供了打印方法,可将各种类型的数据都原样打印。

 

二、字节打印流:PrintStream

构造方法中可接收的参数类型:

        1File对象。File

        2、字符串路径:String

        3、字符输出流:OutputStream

 

三、字符串打印流:PrintWriter

构造方法中可接受的参数类型

        1File对象:File

        2、字符串路径:String

        3、字节输出流:OutputStream

        4、字符输出流:Writer

 打印流

一、概述

        1、打印流包括:PrintStream和PrintWriter

        2、该流提供了打印方法,可将各种类型的数据都原样打印。

 

二、字节打印流:PrintStream

构造方法中可接收的参数类型:

        1、File对象。File

        2、字符串路径:String

        3、字符输出流:OutputStream

 

三、字符串打印流:PrintWriter

构造方法中可接受的参数类型

        1、File对象:File

        2、字符串路径:String

        3、字节输出流:OutputStream

        4、字符输出流:Writer



你可能感兴趣的:(黑马程序员 java基础之IO流二)