Java File类库

  Java的File类库里有许多API,可以让我们很方便地调用。比如说:我们可以得到文件所在磁盘的大小、可用空间、已用空间;还可以得到文件的各种属性(读、写、执行);还可以进行一些基本的文件操作(创建文件、创建临时文件、创建文件夹等)

  在这些操作中,有一些很容易用错,我在这里记下备忘。

一、关于Canonical和Absolute的事

  Canonical意思为标准的,而Absolute为绝对的。 对应的词:CanonicalPath / AbsolutePath 就是标准路径、绝对路径。在Java API里有4个相关的方法。分别是:

  ①public String getCanonicalPath()

  ②public String getAbsolutePath()

  ③public File getCanonicalFile()

  ④public File getAbsoluteFile()

  其实这四个方法都差不多。我们先来说说Canonical 和 Absolute的区别。Canonical 是标准的路径,而Absolute是绝对路径,它们之间唯一的区别就是Canonical能解析路径中的“." 和 ".." (分别代表当前路径和上一级路径)。比如:

比如当前的路径为 C:\test\abc
directory.getCanonicalPath(); //得到的是C:\test\abc
directory.getAbsolutePath();    //得到的是C:\test\abc
direcotry.getPath();                    //得到的是abc

directory.getCanonicalPath(); //得到的是C:\test
directory.getAbsolutePath();    //得到的是C:\test\.
direcotry.getPath();                    //得到的是.

directory.getCanonicalPath(); //得到的是C:\
directory.getAbsolutePath();    //得到的是C:\test\..
direcotry.getPath();                    //得到的是..
   # 对于getCanonicalPath()函数,“."就表示当前的文件夹,而”..“则表示当前文件夹的上一级文件夹
# 对于getAbsolutePath()函数,则不管”.”、“..”,返回当前的路径加上你在new File()时设定的路径
# 至于getPath()函数,得到的只是你在new File()时设定的路径

  而getXXXFile()的作用是什么呢?它是File对象才能调用的一个方法,但它返回的也是一个File对象。如果我有一个File对象了,那么我还干嘛去用这个方法再返回一个File对象呢?其实getXXXFile()方法是为了方便程序员的工作。

  比如:当前路径是 C:\abc\123 并且该目录下有一个 hello.txt 文件。那么我要得到该文件的File对象,你会怎么写?那不就是直接写相对路径:

File file = new File("hello.txt");
  那就是啊。但你写的是相对路径,不算是规范的一种写法,最好还是将File中的路径换成绝对路径。这时你就会用getXXXFile()这个方法了。

file = file.getCanonicalFile();
  其实getXXXFile()方法只是将File对象中的路径属性由相对路径换成绝对路径而已。

  想想如果没有getXXXFile()方法,那么我们要得到一个File路径属性为绝对路径的File对象要怎么做?要不就直接在声明File对象的时候敲入冗长的路径。要不就输入相对路径由getCanonicalPath得到File的绝对路径名,然后再构造。要不然就直接再调用一次getXXXFile()方法。如果让你选择,你会选哪个呢?

  总结:getXXXFile()方法的作用纯粹就是方便操作,仅此而已。

另外:System.getProperty()中的字符串参数如下: System.getProperty()参数大全

二、关于获取当前路径

在Java中,如果我们要获取当前路径,有两种方法。

第一种,通过System.getProperty("user.dir")方法:

//用System得到当前目录
	public static void printCurDirBS()	//print Current Directory By System.getProperty
	{
		System.out.println("Current Directory By System:" + System.getProperty("user.dir"));
	}

第二种,通过File:

//使用File的方式打印当前目录
	public static void printCurDirBF()
	{
		File file = new File(".");
		try
		{
			System.out.println("Current Directory By File:" + file.getCanonicalPath());
		} 
		catch (IOException e)
		{
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
其实前面说到getCanonicalXXX 和 getAbsoluteXXX 方法。其实它们在大多数时候是没有区别的,所以选择哪个使用都差不多。但是在这里,因为File对象的路径使用了".",所以必须用 getCanonicalXXX 方法。所以我们也就不难得知什么时候该用Canonical,什么时候用Absolute了。
就本例而言,我想说的是:System.getProperty("user.dir") 与 File file = new File(".") 在CMD中返回当前路径,而在Eclipse或MyEclipse中则是返回项目的根目录。比如我的项目路径是:E:\Workspace\TomcatProject,我的Java文件在:E:\Workspace\TomcatProject\src\com\test\FileTest.java 里,那么我在ME里运行时,它们都在将项目根目录作为『当前路径』的。这点需要清楚。 但是再问一句,为什么是这样呢?我还不是很清楚,有知道的同学可以指点一下。

三、关于setReadable()方法

在Java中,我将一个文本文件设置为不可读,即执行以下语句:

	public static void setFileAttribute(File file, File copyFile) throws IOException
	{	
		file.setReadable(false, true);  //第二个参数为true表示此操作对所有人有效,为false表示此操作只对文件拥有者有效
		file.setExecutable(false, true);
		file.setWritable(false, true);
		
		System.out.println(file.canRead());
		System.out.println(file.canWrite());
		System.out.println(file.canExecute());
		
		System.out.println("测试是否真的可读");
		
		FileReader fr = new FileReader(file);
		int c;
		while((c = fr.read())!= -1)
		{
			System.out.print((char)c);
		}
	}
 
但是执行之后canRead()依旧为true,并且也可以读出数据,这点我至今未弄懂!
                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值