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,并且也可以读出数据,这点我至今未弄懂!
分享到:
相关推荐
【Java 2 类库3详解】 Java 2 类库,也称为 Java Standard Edition (Java SE) 的一部分,是Java编程语言的核心组件,包含了丰富的API(应用程序接口)供开发者使用。这些API涵盖了各种功能,从基本的数据类型和控制...
Java SE 类库查询手册是Java开发人员的重要参考资料,它涵盖了Java标准版平台的核心类库,这些类库提供了大量用于构建应用程序的基础工具和功能。在Java SE中,类库包括了集合框架、输入/输出流、网络编程、多线程、...
比如,`java.util.ArrayList`是一个动态数组,`java.io.File`类用于文件操作,`java.net.Socket`用于网络通信。 MFC(Microsoft Foundation Classes)是微软提供的一个C++类库,用于构建Windows应用程序。它封装了...
Java 2 类库,也被称为Java SE(标准版)API,是Java编程语言的核心组成部分,包含了大量的类和接口,为开发者提供了丰富的功能和工具。这些类库覆盖了从基本的数据类型操作、对象创建到复杂的网络通信、多线程处理...
此外,Java类库还包括了输入/输出(I/O)相关的类,如File类用于文件操作,InputStream和OutputStream用于处理字节流,Reader和Writer处理字符流。网络编程方面,Socket和ServerSocket提供了客户端和服务器之间的...
除了以上提到的,Java工具类库通常还包括其他实用工具,比如集合操作(如`ArrayList`, `HashMap`),IO操作(`File`, `InputStream`, `OutputStream`),线程控制(`Thread`, `ExecutorService`),网络通信(`...
Java2 类库是Java编程语言的核心组成部分,它包含了大量的预定义类和接口,为开发者提供了丰富的功能和工具,使得在Java平台上构建复杂应用程序变得更为便捷。这个类库是Java平台标准版(Java SE)的一部分,它包括...
### Java标准类库(java基础类) #### 概述 Java标准类库是Java编程语言的核心组成部分之一,提供了丰富的API供开发者使用。本篇文档主要介绍`java.io`包下的核心概念及其应用,包括数据流处理、序列化、以及文件...
jdom.rar - jdom 是一个处理xml文件的java类库,可以方便地对xml文件进行读或写-jdom is a processing xml file java class library, can easily read or write xml file
Java2类库,也被称为Java Standard Edition (Java SE) API,是Java编程语言的核心组成部分,为开发者提供了丰富的功能和工具,使得开发各种类型的应用程序变得可能。这个类库包括了基础的类、接口和异常,涵盖了输入...
3. `java.io`: 提供了进行输入/输出操作的类,如File、InputStream、OutputStream、Reader、Writer等。它们支持对文件、网络和内存的数据读写。 4. `java.nio`: 非阻塞I/O(New I/O)包,提供了更高效的数据传输...
这份文件是一本关于Java SE类库查询手册的内容摘要,其中详细列出了Java SE 6版本中常用的接口和类,主要集中在以下几个包中:java.applet, java.lang, java.io, 以及java.awt。以下是对文档中提及的知识点的详细...
Java的PList类库Blister是一个专门为Java开发者设计的库,用于处理Apple的Property List(简称PList)文件。PList文件是一种XML或二进制格式的数据存储方式,广泛应用于iOS、macOS以及相关的Apple软件中,用于存储...
`java.io`提供输入输出功能,如`File`、`InputStream`、`OutputStream`;`java.util`包含集合框架、日期时间、泛型、算法等,如`ArrayList`、`HashMap`。 2. **集合框架** Java集合框架是Java类库的核心部分,它...
Channels是NIO类库中的第三个核心组件,用于提供Socket、File和Pipe三种类型的通道。Channels提供了全双工的通道,可以实现高效的I/O操作。 四、Selector Selector是NIO类库中的核心机制,用于实现多个异步I/O操作...
`java.io`提供了输入输出相关的类,如`File`、`InputStream`和`OutputStream`,用于处理文件和流。`java.util`包含了集合框架、日期时间、随机数生成等功能。 2. **集合框架**:`java.util`包下的集合框架是Java...
JAVA2 SDK 类库详解 Java 2 Software Development Kit (SDK),通常称为JDK,是Java编程语言的核心组件,用于开发和运行Java应用程序。这个SDK包含了Java编译器、Java虚拟机(JVM)、调试工具、类库和其他必要的开发...
JPinyin是一个汉字转拼音的Java开源类库,在PinYin4j的功能基础上做了一些改进。 【JPinyin主要特性】 1、准确、完善的字库; Unicode编码从4E00-9FA5范围及3007(〇)的20903个汉字中,JPinyin能转换除46个异体...