一、File类
File类意图提供一种抽象,这种抽象指不依赖机器的方式来处理很多依赖于机器的文件和路径名的复杂性。
该类中包含许多文件属性的方法,以及重命名和删除文件和目录的方法。
但是不包含读写文件内容的方法。
File类的构造方法:
1、通过给定的父抽象路径名和子路径名字符串创建一个新的File实例。
File(File parent, String child);
2、通过将给定路径名字符串转换成抽象路径名来创建一个新 File 实例。
File(String pathname)
3、根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 实例。
File(String parent, String child)
4、通过将给定的 file: URI 转换成一个抽象路径名来创建一个新的 File 实例。
File(URI uri)
What is URI ?
统一资源标识符(Uniform Resource Identifier,或URI)是一个用于标识某一互联网资源名称的字符串。 该种标识允许用户对任何(包括本地和互联网)的资源通过特定的协议进行交互操作。URI由包括确定语法和相关协议的方案所定义。
Web上可用的每种资源 -HTML文档、图像、视频片段、程序等 - 由一个通用资源标识符(Uniform Resource Identifier, 简称”URI”)进行定位。
(参考百度百科)
创建File对象成功后,可以使用以下列表中的方法操作文件。
都用public修饰
类型 | 函数名 | 作用 |
---|---|---|
String | getName() | 返回由此抽象路径名表示的文件或目录的名称。 |
String | getParent() | 返回此抽象路径名的父路径名的路径名字符串,如果此路径名没有指定父目录,则返回 null |
File | getParentFile() | 返回此抽象路径名的父路径名的抽象路径名,如果此路径名没有指定父目录,则返回 null |
String | getPath() | 将此抽象路径名转换为一个路径名字符串 |
boolean | isAbsolute() | 测试此抽象路径名是否为绝对路径名 |
String | getAbsolutePath() | 返回抽象路径名的绝对路径名字符串 |
boolean | canRead() | 测试应用程序是否可以读取此抽象路径名表示的文件 |
boolean | canWrite() | 测试应用程序是否可以修改此抽象路径名表示的文件 |
boolean | exists() | 测试此抽象路径名表示的文件或目录是否存在 |
boolean | isDirectory() | 测试此抽象路径名表示的文件是否是一个目录 |
boolean | isFile() | 测试此抽象路径名表示的文件是否是一个标准文件 |
long | lastModified() | 返回此抽象路径名表示的文件最后一次被修改的时间 |
long | length() | 返回由此抽象路径名表示的文件的长度。 |
boolean | createNewFile() throws IOException | 当且仅当不存在具有此抽象路径名指定的名称的文件时,原子地创建由此抽象路径名 |
boolean | delete() | 删除此抽象路径名表示的文件或目录 |
void | deleteOnExit() | 在虚拟机终止时,请求删除此抽象路径名表示的文件或目录 |
String[] | list() | 返回由此抽象路径名所表示的目录中的文件和目录的名称所组成字符串数组 |
String[] | list(FilenameFilter filter) | 返回由包含在目录中的文件和目录的名称所组成的字符串数组,这一目录是通过满足指定过滤器的抽象路径名来表示的 |
File[] | listFiles() | 返回一个抽象路径名数组,这些路径名表示此抽象路径名所表示目录中的文件 |
File[] | listFiles(FileFilter filter) | 返回表示此抽象路径名所表示目录中的文件和目录的抽象路径名数组,这些路径名满足特定过滤器 |
boolean | mkdir() | 创建此抽象路径名指定的目录 |
boolean | mkdirs() | 创建此抽象路径名指定的目录,包括创建必需但不存在的父目录 |
boolean | renameTo(File dest) | 重新命名此抽象路径名表示的文件 |
boolean | setLastModified(long time) | 设置由此抽象路径名所指定的文件或目录的最后一次修改时间 |
boolean | setReadOnly() | 标记此抽象路径名指定的文件或目录,以便只可对其进行读操作 |
int | compareTo(File pathname) | 按字母顺序比较两个抽象路径名 |
int | compareTo(Object o) | 按字母顺序比较抽象路径名与给定对象 |
String | toString() | 返回此抽象路径名的路径名字符串 |
boolean | equals(Object obj) | 测试此抽象路径名与给定对象是否相等 |
其余两个static函数
public static File createTempFile(String prefix, String suffix, directory) throws IOException
在指定目录中创建一个新的空文件,使用给定的前缀和后缀字符串生成其名称
public static File createTempFile(String prefix, String suffix) throws IOException
在默认临时文件目录中创建一个空文件,使用给定前缀和后缀生成其名称
注意:
在Windows中目录的分隔符是反斜杠()。但是在java中,反斜杠应该写成\形式。
构建一个File实例并不会在机器上创建一个文件。不管文件是否存在,都可以创建任意文件名的的File实例。可以调用File中的exists()方法来判断文件是否存在。
File类测试demo:
public class Main {
public static void main(String[] args) {
java.io.File file = new java.io.File("test.txt");
System.out.println("Does it exist? " + file.exists());
System.out.println("The file has " + file.length() + " bytes");
System.out.println("Can it be read? " + file.canRead());
System.out.println("Can it be written? " + file.canWrite());
System.out.println("Is a directory ? " + file.isDirectory());
System.out.println("Is a file ? " + file.isFile());
System.out.println("Is a absolute ? " + file.isAbsolute());
System.out.println("Is a hidden ? " + file.isHidden());
System.out.println("Absolute path: " + file.getAbsolutePath());
System.out.println("Last modified on " +
new java.util.Date(file.lastModified()));
}
}
运行结果:
二、文件输入和输出
1、使用PrintWriter写数据
java.io.PrintWriter类可用来创建一个文本文件并向该文件写入数据。
PrintWriter的常用方法
2、可以使用try-with-resources自动关闭资源
程序员经常会忘记关闭文件。JDK 7提供下面的新的try-with-resources语法来自动文件。
try(声明和创建资源){
使用资源来处理文件;
}
还记不记得c语言中,文件指针忘记关闭经常会导致很多bug吧。
在Java中使用try-with-resources不仅可以避免错误,而且还可以简化代码。
关键字try后声明和创建的资源必须是AutoCloseable的子类型,这样try块结束时,资源自动调用close()方法来关闭资源。
3、使用Scanner读数据
先来回忆一下,如何从键盘读取数据。
Scanner input = new Scanner(System.in);
然后可以用input.next(),input.nextInt()等来从键盘接受各种数据。
键盘实质上是一个设备文件,那么从其它文件读取数据也是一样的。
如:
Scanner input = new Scanner(new File(filename));
Scanner的常用方法
关于Scanner的工作模式
Scanner的标记读取法首先跳过任意分隔符(默认为空格),然后读取一个以分隔符结束的标记。然后,对应与各种类型,将标记自动转换为相应类型的值。对于next()无须做转换的。如果比阿基和期望的类型不匹配,就会抛出一个运行异常java.util.InputMismatchException。
方法next()和nextLine()都会读取一个字符串。next()方法读取一个由分隔符分隔的字符串,但是nextLine()读取一个以换行符结束的行。
换行符:Windows上为\r\n,Unix/Linux上是\n。
例子:
/*PrintWriter and Scanner test*/
import java.io.IOException;
import java.io.PrintWriter;
import java.io.File;
import java.util.Scanner;
public class Main {
public static void main(String[] args) throws IOException{
File file = new File("source.txt");
if(file.exists()){
System.out.println("File already exists");
System.exit(1);
}
try(PrintWriter output = new PrintWriter(file)){
output.print("li T zhao ");
output.println("90");
output.print("zhou F wei ");
output.println("60");
}
try(Scanner input = new Scanner(file)){
for(int i=0;i<2;i++){
String firstname = input.next();
String mi = input.next();
String lastname = input.next();
int score = input.nextInt();
System.out.println(firstname + " " + mi
+ " " + lastname + " " + score);
}
}
}
}
运行结果:
第一次运行:
第二次运行:
参考:
Java语言程序设计(基础篇)第十版
URI (标识、定位任何资源的字符串)-百度百科
Java菜鸟教程File类