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()函数,“."就表示当前的文件夹,而”..“则表示当前文件夹的上一级文件夹而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了。
三、关于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,并且也可以读出数据,这点我至今未弄懂!