Java File类库

来源:互联网 发布:中学生机器人编程 编辑:程序博客网 时间:2024/05/21 08:50

  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\abcdirectory.getCanonicalPath(); //得到的是C:\test\abcdirectory.getAbsolutePath();    //得到的是C:\test\abcdirecotry.getPath();                    //得到的是abcdirectory.getCanonicalPath(); //得到的是C:\testdirectory.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 blocke.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,并且也可以读出数据,这点我至今未弄懂!                                             
0 0
原创粉丝点击