资讯专栏INFORMATION COLUMN

Java IO : File

chaos_G / 3352人阅读

摘要:类位于的这个包下。的构造器中的路径参数也支持绝对路径和相对路径,像上面的代码用的是绝对路径。也提供了另外一种构造器这两个构造器可以让你在构造文件或目录时指定它的父目录。返回的,则是所有文件或目录所代表的对象。同时提供以下接口获取文件权限信息

File类位于JDK的java.io这个包下。
一个File类既可以代表一个文件,也可以代表一个目录。
构造器

要使用File,首先需要通过构造器构造它的一个实例

File file1 = new File("/a/b");
File file2 = new File("C:a.dat");

构造File类需要给它指定一个路径,比如上面代码中的/a/bC:a.dat.
路径可以代表一个文件,也可以代表一个目录。

路径分隔符依据操作系统的不同而不同,在类Unix系统中,分隔符是/,而在windows操作系统中,分隔符是,如果在代码中以硬编码的方式写死了路径分隔符,那么代码的可移植性就不高。可以通过File.separator或者是File.separatorChar来获取当前操作系统的路径分隔符。

File的构造器中的路径参数也支持绝对路径和相对路径,像上面的代码用的是绝对路径。那么相对路径相对的是哪个路径呢?Java会默认采用user.dir作为当前路径,可以通过System.getProperty("user.dir")来得到这个路径,这个路径也是JVM启动时所在的路径。

File也提供了另外一种构造器:

File(String parent, String child)
File(File parent, String child)

这两个构造器可以让你在构造文件或目录时指定它的父目录。

路径与名字

File类包含了诸多获取路径和路径名字的方法,这些方法看似差别不大却又别有洞天,可以通过下面几段代码来看看区别:

执行以下代码

File file = new File(".");
System.out.println("Absolute path = " + file.getAbsolutePath());
System.out.println("Canonical path = " + file.getCanonicalPath());
System.out.println("Name = " + file.getName());
System.out.println("Parent = " + file.getParent());
System.out.println("Path = " + file.getPath());
System.out.println("Is absolute = " + file.isAbsolute());

得到的结果是:

Absolute path = C:prjooksioch02codePathInfo.
Canonical path = C:prjooksioch02codePathInfo
Name = .
Parent = null
Path = .
Is absolute = false

执行以下代码:

File file = new File("C:
eports2015..2014February");
System.out.println("Absolute path = " + file.getAbsolutePath());
System.out.println("Canonical path = " + file.getCanonicalPath());
System.out.println("Name = " + file.getName());
System.out.println("Parent = " + file.getParent());
System.out.println("Path = " + file.getPath());
System.out.println("Is absolute = " + file.isAbsolute());

得到的结果是:

Absolute path = C:
eports2015..2014February
Canonical path = C:
eports2014February
Name = February
Parent = C:
eports2015..2014
Path = C:
eports2015..2014February
Is absolute = true

执行以下代码:

File file = new File("");
System.out.println("Absolute path = " + file.getAbsolutePath());
System.out.println("Canonical path = " + file.getCanonicalPath());
System.out.println("Name = " + file.getName());
System.out.println("Parent = " + file.getParent());
System.out.println("Path = " + file.getPath());
System.out.println("Is absolute = " + file.isAbsolute());

得到的结果是:

Absolute path = C:prjooksioch02codePathInfo
Canonical path = C:prjooksioch02codePathInfo
Name =
Parent = null
Path =
Is absolute = false

从这里可以看出来,file.getAbsolutePath()会把相对路径的信息也打印出来,读起来并不是非常直观的,而file.getCanonicalPath()总是以对人类阅读友好的方式打印路径。
如果File的入参是绝对路径,那么getNamegetPath只打印入参,并且getParent为null。

得到文件/目录信息

前面说过,File可以是一个文件,也可以代表一个目录,如何知道File代表的是哪一个呢?通过以下两个方法就可以知道

boolean isDirectory()

boolean isFile()

有时候我们想知道File代表的那个文件或目录是否在文件系统中存在,boolean exists()会告诉你。
在类Unix文件系统中,隐藏文件通常以.开头,比如用户的home目录下的.bash_profile,同样在windows中也会有隐藏文件,可通过isHidden()来判断一个文件是否是隐藏文件。通过length()可以获得文件的大小,通过lastModified()可以获得文件的最后修改时间,这个时间是距离(1970,1,1)的毫秒数。通常可以通过比较一个文件的最后修改时间来判断文件是否被修改过。

列举某个目录

可通过File[] listRoots()来列举当前文件系统的根目录。
在windows下,就是列出所有的盘符:

C:
D:
E:
F:

在Unix中,只有一个,那就是/

如果要列出某个特定目录下的文件和目录呢,有以下方法:

String[] list()
String[] list(FilenameFilter filter)
File[] listFiles()
File[] listFiles(FileFilter filter)
File[] listFiles(FilenameFilter filter)

以上方法中,返回String[]的,则是列举出所有文件或目录的名字。返回File[]的,则是所有文件或目录所代表的File对象。
FileFilterFilenameFilter是过滤器,能让你在列举目录时选择过滤掉哪些文件或目录。

获取磁盘空间信息

File提供了三个方法可以让你得知某个分区的磁盘空间的信息:

long getFreeSpace() //获取剩余空间
long getTotalSpace() //获取总空间大小
long getUsableSpace() //获取剩余可用空间

尽管getFreeSpace和getUsableSpace看起来差不多,但实际上是有差别的,getUsableSpace会进行更多细致的检查,比如当前JVM进程是否对该目录有写权限,以及另外一些操作系统的限制等,但getFreeSpace和getUsableSpace返回的值只能当做一个参考值,因为有可能有其他的进程正在读写这个磁盘空间。
下面是一个例子:

File[] roots = File.listRoots();
for (File root: roots) {
    System.out.println("Partition: " + root);
    System.out.println("Free space on this partition = " +
    root.getFreeSpace());
    System.out.println("Usable space on this partition = " +
    root.getUsableSpace());
    System.out.println("Total space on this partition = " +
    root.getTotalSpace());
    System.out.println("***");
}

输出结果为:

Partition: C:
Free space on this partition = 143271129088
Usable space on this partition = 143271129088
Total space on this partition = 499808989184
***
Partition: D:
Free space on this partition = 0
Usable space on this partition = 0
Total space on this partition = 0
***
Partition: E:
Free space on this partition = 733418569728
Usable space on this partition = 733418569728
Total space on this partition = 1000169533440
***
Partition: F:
Free space on this partition = 33728192512
Usable space on this partition = 33728192512
Total space on this partition = 64021835776
***
对文件或目录进行修改

如果想创建一个文件,使用boolean createNewFile()将会创建一个新的空文件,同样,创建一个目录可以用boolean mkdir() 或者boolean mkdirs() ,如果中间目录不存在,后者会创建好所有中间目录,而前者将会报错某个目录不存在。

有时候你希望创建一个临时文件,可以使用static File createTempFile(String prefix, String suffix),这个方法将会默认把临时文件放在用户的临时文件夹中,如果你想指定临时文件存放的地方,可以使用static File createTempFile(String prefix, String suffix, File directory)指定该目录。

文件权限

从Java 1.6开始,增加了对文件权限修改的接口。

boolean setExecutable(boolean executable)
boolean setExecutable(boolean executable, boolean ownerOnly)
boolean setReadable(boolean readable)
boolean setReadable(boolean readable, boolean ownerOnly)
boolean setWritable(boolean writable)
and boolean setWritable(boolean writable boolean ownerOnly)

同时提供以下接口获取文件权限信息:

boolean canRead()
boolean canWrite()
boolean canExecute()

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/65343.html

相关文章

  • Java学习之常用工具类

    摘要:小编来为大家介绍几款比较常用的开发工具这是象面包和奶油一样必须的通用语言库,这个实用工具类包括一些很早以前在中未包含的重要方法。 小编来为大家介绍几款比较常用的Java开发工具:StringUtils这是象面包和奶油一样必须的通用语言库,这个实用工具类包括一些很早以前在String中未包含的重要方法。StringUtils...

    番茄西红柿 评论0 收藏2637
  • 基于javaIO流的文件读取系统

    摘要:流读写基本功能新建文件查看列表写文件删除文件查看文件导入的包下面新建一个类,然后在函数里初始化一个方法,方法中用来判断输入的值所相对应的功能板块。这里也只限制于在正常情况下的输入输出。 IO流读写 基本功能: 新建文件 查看列表 写文件 删除文件 查看文件 导入的包: import java.io.BufferedInputStream; import java.io.Buffe...

    chunquedong 评论0 收藏0
  • 快速Get-JAVA-IO

    摘要:除非文件用自带的记事本打开我们能够读懂,才采用字符流,否则建议使用字节流。 第四阶段 IO IO流 前言: 前面的学习我们只能够在已有的一定封闭范围内进行一些操作,但是这显然是无趣的,也是不支持我们实现一些复杂的需求,所以Java提供IO流这样一种概念,方便我们对数据进行操作 而使用IO流我们可以实现一些强大的功能,例如针对文件的移动复制等操作,又或者程序与外部文件之间的数据存储或者读...

    wangzy2019 评论0 收藏0
  • 【freemaker实现导出word②】代码实现导出word(包括导出list数据和导出图片到wor

    摘要:前面文章已经分享了如何创建导出需要用到的模板了,接下来这里要给大家分享的是如何用后台制作导出的代码工具和实现。可以重,数据库装载。 前面文章已经分享了如何创建导出word需要用到的xml/ftl模板了,接下来这里要给大家分享的是如何用后台制作导出word的代码工具和controller实现。 1、首先是工具类,没有工具,谈何实现呢?下面贴我这边导出word的utils,大家可以直接复制...

    bitkylin 评论0 收藏0
  • Java IO学习笔记二

    摘要:学习笔记二流的概念在程序中所有的数据都是以流的方式进行传输或保存的,程序需要数据的时候要使用输入流读取数据,而当程序需要将一些数据保存起来的时候,就要使用输出流完成。主要功能是向文件中写入内容构造函数根据给定的对象构造一个对象。 Java IO学习笔记二 流的概念 在程序中所有的数据都是以流的方式进行传输或保存的,程序需要数据的时候要使用输入流读取数据,而当程序需要将一些数据保存起来...

    ideaa 评论0 收藏0
  • Java编程基础21——IO(字节流)

    摘要:流按操作类型分为两种字节流字节流可以操作任何数据因为在计算机中任何数据都是以字节的形式存储的字符流字符流只能操作纯字符数据,比较方便。 1_IO流概述及其分类 1.概念 IO流用来处理设备之间的数据传输 Java对数据的操作是通过流的方式 Java用于操作流的类都在IO包中 流按流向分为两种:输入流,输出流。 流按操作类型分为两种: 字节流 : 字节流可以操作任何数据,因为在...

    yanbingyun1990 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<