现在的位置: 首页 > 综合 > 正文

36、Java I/O系统

2018年02月05日 ⁄ 综合 ⁄ 共 3852字 ⁄ 字号 评论关闭

对程序语言设计者来说,设计一个令人满意的I/O(输入输出)系统,是件极艰巨的任务——《Thinking in Java》

1、File类:一个File类的对象,表示了磁盘上的文件或目录;File类提供了与平台无关的方法来对磁盘上的文件或目录进行操作;File类直接处理文件和文件系统;File类没有指定信息怎样从文件读取和向文件存储;File类描述了文件本身的属性;File对象用来获取或处理与磁盘文件相关的信息,例如权限,时间,日期和目录路径;File类还可以浏览子目录层次结构。

      java.io包中的File类提供了与具体平台无关的方式描述目录和文件对象的属性功能。其中包含大量的方法可用来获取路径、目录和文件的相关信息,并对他们进行创建、删除、改名等管理工作。因为不同的系统平台,对文件路径的描述不尽相同。为做到平台无关,在Java语言中,使用抽象路径等概念。Java自动进行不同系统平台的文件路径描述与抽象文件路径之间的转换。File类的直接父类是Object类。

import java.io.File;
import java.io.IOException;

public class FileTest1
{
	public static void main(String[] args)
	{
		File file = new File("d:\\com");
		try
		{
			System.out.println(file.createNewFile());
		} catch (IOException e)
		{
			e.printStackTrace();
		}
	}
}

因为在java中“\”表示转义符,所以要想创建d:\com文件,路径中的“\”要写成“\\”,或者使用反斜线“/”,反斜线比较通用。

File类的构造方法:File(String directoryPath),File(String directoryPath, String filename),File(File dirObj, String filename);这里,directoryPath是文件的路径名,filename 是文件名,dirObj 是一个指定目录的File 对象

2、File的方法:isDirectory()、isFile()——判断是目录还是文件。创建目录mkDir(),mkDirs()——带s的方法,如果目录的父目录不存在,一并创建。publicString[]list()返回抽象路径名表示路径中的文件名和目录名(只是第一层)。

      在进行文件操作时,常需要知道一个关于文件的信息。Jave的File类提供了方法来操纵文件和获得一个文件的信息。另外,File类还可以对目录和文件进行删除、属性修改等管理工作,File 类定义了很多获取File对象标准属性的方法。例如getName()返回文件名,getParent()返回父目录名,exists()在文件存在的情况下返回true,反之返回false。然而File类是不对称的。说它不对称,意思是虽然存在允许验证一个简单文件对象属性的很多方法,但是没有相应的方法来改变这些属性。

File类中的其他常用方法:String getName()、String getPath()、String getAbsolutePath()、String getParent()、boolean renameTo( File newName)、long length()、boolean delete()、boolean mkdir()、String[] list()、boolean exists()、boolean canWrite()、boolean canRead()、boolean isFile()、boolean
isDirectory()

3、目录是一个包含其他文件和路径列表的File 类,当你创建一个File 对象且它是目录时,isDirectory() 方法返回ture。这种情况下,可以调用该对象的list()方法来提取该目录内部其他文件和目录的列表。

import java.io.File;

public class FileTest4
{
	public static void main(String[] args)
	{
		File file = new File("d:/j2sdk1.4.2_16");
	
		String[] names = file.list();
	
		for(String name : names)
		{
			System.out.println(name);
		}
		System.out.println("----------------");
		
		File[] files = file.listFiles();
		
		for(File f : files)
		{
			System.out.println(f.getName());
			System.out.println("父目录:" + f.getParent());
		}
		
		File file2 = new File("d:/ad/1.txt");
		file2.delete();
	}
}

4、使用FilenameFilter:希望能够限制由list()方法返回的文件数目,使它仅返回那些与一定的文件名方式或者过滤(filter)相匹配的文件;为达到这样的目的,必须使用list()的第二种形式(方法重载)。String[ ] list(FilenameFilter  FFObj),该形式中,FFObj是一个实现FilenameFilter接口的类的对象

import java.io.File;
import java.io.FilenameFilter;

public class FileTest5
{
	public static void main(String[] args)
	{
		File file = new File("d:/ad");
		
		String[] names = file.list();
		
		for(String name : names)
		{
			if(name.endsWith(".java"))
			{
				System.out.println(name);
			}
		}
		System.out.println("---------");
		File file2 = new File("d:/ad");
		String[] names1 = file2.list(new FilenameFilter()
		{
			public boolean accept(File dir, String name)
			{
				if(name.endsWith(".java"))
				{
					return true; 
				}
				return false;
			}
		});
		
		for(String name : names1)
		{
			System.out.println(name);
		}
	}
}

FilenameFilter仅定义了一个方法,accept()。该方法被列表中的每个文件调用一次。它的通常形式如下:boolean accept(File directory, String filename)
当被directory 指定的目录中的文件(也就是说,那些与filename 参数匹配的文件)包含在列表中时,accept()方法返回true ,当这些文件没有包括在列表中时,accept()返回false

5、递归(Recursion):就是方法调用自身。对于递归来说,一定有一个出口,让递归结束,只有这样才能保证不出现死循环。

public class Test1
{
	//循环方式计算阶乘,又叫做迭代方式
	public int compute1(int number)
	{
		int result = 1;
		for(int i = number;i> 0;i--)
		{
			result *=i;
		}
		return result;
	}
	//使用递归方式计算阶乘
	public int compute(int number)
	{
		if(1 == number)
		{
			return 1;
		}
		else
		{
			return number * compute(number-1);
		}
	}
	public static void main(String[] args)
	{
		Test1 test = new Test1();
		
		System.out.println(test.compute(5));
		System.out.println(test.compute1(5));
	}
}

斐波那契数列:

public class Fabna
{
	public int compute(int n)
	{
		if(1 == n || 2 == n)
		{
			return 1;
		}
		else
		{
			return compute(n-1) + compute(n-2);
		}
	}
	public static void main(String[] args)
	{
		Fabna f = new Fabna();
		System.out.println(f.compute(9));
	}
}

使用递归删除一个目录(File的delete方法只能删除一个空目录,如果不为空,要进入目录中,先删除其中内容)

import java.io.File;

public class FileTest6
{
	public static void deleteAll(File file)
	{
		if(file.isFile() || 0 == file.list().length)
		{
			file.delete();
		}
		else
		{
			File[] files = file.listFiles();
			for(File f : files)
			{
				deleteAll(f);
				f.delete();
			}
		}
	}
	public static void main(String[] args)
	{
		deleteAll(new File("d:/ad"));
	}
}

 

【上篇】
【下篇】

抱歉!评论已关闭.