File类心得

File类心得

在程序中设置路径时会有系统依赖的问题,java.io.File类提供一个抽象的、与系统独立的路径表示。给它一个路径字符串,它会将其转换为与系统无关的抽象路径表示,这个路径可以指向一个文件、目录或是URI(Uniform Resource Identifier)。

一个File的实例被建立时,它就不能再被改变内容。File实例除了用作一个文件或目录的抽象表示之外,它还提供了不少相关操作方法:可以用它来对文件系统作一些查询与设置的动作。要注意的是,不管是文件还是目录,在Java中都是以File的实例来表示。若要进行文件输出/输入操作,必须配合其他相关类来使用。
先来点简单的:

// 操作一个代表文件的抽象路径            File f = new File("d:/ws/pp/readme.txt");         System.out.println(f.toString());// 返回此抽象路径名的路径名字符串。该字符串就是 getPath() 方法返回的字符串           System.out.println(f);               System.out.println(f.getName());// 获得文件名readme.txt            System.out.println(f.getPath());// 获得完整的抽象路径d:\ws\pp\readme.txt         System.out.println(f.getParent());// 获得该文件的父抽象路径d:\ws\pp                  // 操作一个代表目录的抽象路径                    File f = new File("d:/ws/pp/");         System.out.println(f.toString());         System.out.println(f);         System.out.println(f.getName());// 获得目录名pp         System.out.println(f.getPath());// 获得完整的抽象路径d:\ws\pp         System.out.println(f.getParent());//获得该目录的父抽象路径d:\ws

File类是文件或目录的抽象,所以在对File对象进行操作时,明确是路径还是目录就显得很重要了(特别在递归中)。 当然,File类也提供了isDirectory()和isFile()这两个方法来判断到底是文件还是目录。 但要注意的是这一判断不能以代码中的File f = new File("d:/ws/pp/readme.txt");为根据。因为这个对象是抽象的,在文件系统中不一定有对应的实际存在,如果实际存在没有那么是目录还是文件都没有意义,这时isDirectory()和isFile()这两个方法都会返回FALSE。 接着,选择要根据d:/ws/pp/readme.txt,建立相关的目录和文件,你可能会敲如下代码:

public static void main(String[] args) {         File f = new File("d:/ws/pp/readme.txt");                 if (!f.exists()) {             f.mkdirs();                         try {                 f.createNewFile();             } catch (IOException e) {                 e.printStackTrace();             }         } }

可是,运行时你会发觉: 1.编译器报错了,java.io.IOException: 拒绝访问。 2.在d盘中建立了以下目录:D:\ws\pp\readme.txt,注意readme.txt是名叫readme.txt的一个目录而非文件。
为什么会出现这种情况呢?
首先mkdirs()会把根据整个抽象路径d:/ws/pp/readme.txt在硬盘中建立相关的目录(我们想建立的文件的名字readme.txt也用来建立目录),然后我们试图建立一个名字为空的文件这时肯定会抛异常了。
那么怎么解决这个问题,其实方法很简单,我们不要让mkdirs()把整个抽象路径都用来建目录就OK.修改后代码如下:

public static void main(String[] args) {         File f = new File("d:/ws/pp/readme.txt");             if (!f.exists()) {                     f.getParentFile().mkdirs();             try {                 f.createNewFile();             } catch (IOException e) {                 e.printStackTrace();             }         }  }

通过getParentFile()获得File类封装的抽象路径的父路径,由mkdirs()去建立。

对于目录有绝对目录和相对目录之分。上面的代码用到的是绝对目录。绝对目录也叫完整路径,它不需要任何额外的路径信息就何以进行文件或目录的精确定位。而相对目录,顾其名相对,也就说要定位一个文件或目录必须有一个参考点,也就是额外的目录信息,那么这个额外的信息是什么呢?必须弄个明白。从网上搜了一下得到的答案是:java.io 包中的类总是根据当前用户目录来分析相对路径名。此目录由系统属性user.dir 指定,通常是 Java 虚拟机的调用目录.

从这就话知道"当前用户目录"就是这个参考点,而这个目录可以通过System.out.println(System.getProperty("user.dir"));查询得到。

如果在控制台中运行一个class文件,如d:下执行java demo,那么此时通过System.out.println(System.getProperty("user.dir"));得到的是D:如果在别的目录如的d:/cc中执行java demo那么该目录就是d:/cc,那么我们可以确定"当前用户目录"就是执行java命令时CLASS文件所在的目录, 而在eclipse中程序都是在项目根路径上执行的,那么项目根路径就是相对路径的参考点。 由此类推一下可知,Tomcat下的bin目录.如” D:\tomcat\bin\.”,就是参考点。

下面再来看看getPath()与getAbsolutePath()的区别:

1 File x=new File("./test1.txt"); 2 System.out.println(x.getPath());          //.\test1.txt 3 System.out.println(x.getAbsolutePath());   //C:\Documents and Settings\yuno\workspace\002\.\test1.txt 4          5 File xx=new File("d:/ws/pp/readme.txt"); 6 System.out.println(xx.getPath());         //d:\ws\pp\readme.txt 7 System.out.println(xx.getAbsolutePath()); //d:\ws\pp\readme.txt

getAbsolutePath()根据名字就是获得绝对路径,那么getPath()就是获得相对路径。

抽象路径如果是相对路径,那么getPath()就输出该相对路径,而getAbsolutePath()就根据这个相对路径并根据参考点获得绝对的路径。当然传入一个绝对的抽象路径,这两个方法的返回是一样的。

再看看getAbsolutePath()和getCanonicalPath()的区别:

1 File x=new File("./test1.txt");  2 System.out.println(x.getPath());          //.\test1.txt  3 System.out.println(x.getAbsolutePath());   //C:\Documents and Settings\yuno\workspace\002\.\test1.txt  4 System.out.println(x.getCanonicalPath());  //C:\Documents and Settings\yuno\workspace\002\test1.txt  5           6 System.out.println("===========================");  7           8 File xx=new File("d:/ws/pp/readme.txt");  9 System.out.println(xx.getPath());         //d:\ws\pp\readme.txt 10 System.out.println(xx.getAbsolutePath()); //d:\ws\pp\readme.txt 11 System.out.println(xx.getCanonicalPath());//D:\ws\pp\readme.txt

可以看到getCanonicalPath()连..或者.这样的符号解析出来。

最后看看getCanonicalPath()和自己的不同:

File file = new File("D:/Readme.txt"); System.out.println(file.getCanonicalPath());

首先,确定D盘里没有Readme.txt这个文件,执行这段代码,得到的结果是:Readme.txt(注意文件的大小写)。

然后,在D盘下建立一个文件,名叫readme.txt,再次执行代码,得到结果是:readme.txt

有趣吧,一样的代码,不同的结果。原因是:windows对大小写是不敏感的,windows中readme.txt和Readme.txt是一个文件,所以在windows上当文件不存在时,得到的路径就是按照输入的路径。但当文件存在时,就会按照实际的情况来显示。这也就是建立文件后和删除文件后会有不同的原因。文件夹和文件类似。   下面为的说明:规范路径名是绝对路径名,并且是惟一的。规范路径名的准确定义与系统有关。如有必要,此方法首先将路径名转换成绝对路径名,这与调用 getAbsolutePath() 方法的效果一样,然后用与系统相关的方式将它映射到其惟一路径名。这通常涉及到从路径名中移除多余的名称(比如 "." 和 "..")、分析符号连接(对于 UNIX 平台),以及将驱动器名转换成标准大小写形式(对于 Microsoft Windows 平台)。

表示现有文件或目录的每个路径名都有一个惟一的规范形式。表示非存在文件或目录的每个路径名也有一个惟一的规范形式。非存在文件或目录路径名的规范形式可能不同于创建文件或目录之后同一路径名的规范形式。同样,现有文件或目录路径名的规范形式可能不同于删除文件或目录之后同一路径名的规范形式。

时间: 2024-10-12 19:49:58

File类心得的相关文章

异常及File类概述

一.异常 1.异常分类: Throwable:Throwable类是 Java 语言中所有错误或异常的超类.它只有两个子类 Error:属于严重问题,只能避免:如内存溢出(OutOfMemory) Exception:可以解决的异常问题 编译时期异常:在写代码期间遇到的异常,不处理没办法运行: 运行时期异常(RuntimeException):在程序运行时期遇到的异常,一般情况不是编译时期异常就是运行时期异常: 2.异常处理: 1)捕获异常:try-catch-finally A:格式:try{

File类--System.out.print(Object obj)的理解

一.File 类(java.io) 概述:Java中使用File类来表示文件或者文件夹对象!     抽象路径名:描述文件或文件夹时,使用的路径符号,就是一个对象的字符串表示形式,如"c:\\";     绝对路径:绝对位置开始的路径;     相对路径:相对位置开始的路径; 构造方法:     File(String pathname)     File(String parent, String child)     File(File parent, String child)

java File类

今天我要总结一下java File类.这个是一个很重要的类. 首先是我画的思维导图. 还写了一些自己写的代码. /** * Date : 2017/6/24 * Author : Hsj * Description : */ public class Demo { /** * File(pathname)表示文件或文件夹路径 * File(String parent,child); * File(File parent,child); */ @Test public void fun() { /

File类详解

一.File类: File类时io包中唯一代表磁盘文件本身的对象.File类定义了一些与平台无关的方法来操作文件,可以通过调用File类中的方法,实现创建.删除.重命名文件等. File类的对象主要用来获取文本的一些信息,如文件所在的目录.文件的长度.文件的读取权限等. 1.文件的创建:目录(文件夹)的创建 File(String pathname):在此File的构造方法中填入一个String类型的路径名:实例如下: String s="d:\\aaa.txt"; File f=ne

java019异常、File类

异常的分类: * Error:称为错误类.表示java运行时系统内部错误或者资源耗尽的错误,仅靠修改程序本身不能恢复执行的.比如:服务器宕机,数据库崩溃等 * Exception:称为异常类,表示程序本身可以处理的错误. 继承体系 * Throwable  * Error   * Exception   * RuntimeException //除了运行时异常都是编译时异常,一般都是程序员本身的错误 JVM默认处理异常的方式: * a:自己将该问题处理,然后继续运行,对应下方的 a 代码 * b

JavaIO(01)File类详解

File类 file类中的主要方法和变量 常量: 表示路径的分割符:(windows) 作用:根据java可移植性的特点,编写路径一定要符合本地操作系统要求的分割符: public static final String separator public static final String pathSeparator package cn.itcast; import java.io.File; public class DemoFile02 { public static void mai

java File类的常见用法

File类简单用法! [java] view plain copy print? [java] view plain copy print? import java.io.File; import java.io.IOException; public class TestFile { public void createFile(String path){ File file=new File(path); if(!file.exists()){//判断文件是否存在 try { file.cr

【转】File类应用 - FilenameFilter 和 FileFilter

FilenameFilter & FileFilter FilenameFilter 和 FileFilter 都是用来过滤文件,例如过滤,以.jpg或者.java结尾的文件,通过看他们的源码:通过使用File类中String[] list(FilenameFilter filter)或者public File[] listFiles(FileFilter filter)方法,把FilenameFilter或者FileFilter接口对象作为参数传入,通过实现接口里面的 boolean acce

黑马程序员——【Java基础】——File类、Properties集合、IO包中的其他类

---------- android培训.java培训.期待与您交流! ---------- 一.File类 (一)概述 1.File类:文件和目录路径名的抽象表现形式 2.作用: (1)用来将文件或文件夹封装成对象 (2)方便于对“文件”与“文件夹属性信息”进行操作 (3)File对象,可以作为参数传递给流的构造函数 (二)构造方法 * 通过File的构造函数创建File对象 方式1:File f = new File("c:\\a.txt"); 方式2:File f2 = newF