简介
整个 Java.io 包中最重要的就是 5 个类。指的是 File、OutputStream、InputStream、Writer、Reader;本节将重点讲解 Java.io 的相关内容。
知识点
- 文件
- 随机读写
- 文件操作
- 文件拷贝
- 文件属性
- 目录读取
- IO 流
- 字节流
- 字符流
文件
Java 使用 File 类来直接处理文件和文件系统。File 类没有指定信息怎样从文件读取或向文件存储;它描述了文件本身的属性。File 对象用来获取或处理与磁盘文件相关的信息,例如权限,时间,日期和目录路径。此外,File 还浏览子目录层次结构。Java 中的目录当成 File 对待,它具有附加的属性——一个可以被 list( )方法检测的文件名列表。
构造方法
File 类提供了以下构造方法:
//根据 parent 抽象路径名和 child 路径名字符串创建一个新 File 实例。
File(File parent, String child)
//通过将给定路径名字符串转换为抽象路径名来创建一个新 File 实例
File(String pathname)
// 根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 实例
File(String parent, String child)
//通过将给定的 file: URI 转换为一个抽象路径名来创建一个新的 File 实例
File(URI uri)
使用示例
//一个目录路径参数
File f1 = new File("/home/project/");
//对象有两个参数——路径和文件名
File f2 = new File("/home/project/","a.bat");
//指向f1文件的路径及文件名
File f3 = new File(f1,"a.bat");
常用方法
来看看 File 的一些常用方法
方法 | 说明 |
---|---|
boolean canExecute() | 测试应用程序是否可以执行此抽象路径名表示的文件 |
boolean canRead() | 测试应用程序是否可以读取此抽象路径名表示的文件 |
boolean canWrite() | 测试应用程序是否可以修改此抽象路径名表示的文件 |
int compareTo(File pathname) | 按字母顺序比较两个抽象路径名 |
boolean createNewFile() | 当且仅当不存在具有此抽象路径名指定名称的文件时,不可分地创建一个新的空文件 |
static File createTempFile(String prefix, String suffix) | 在默认临时文件目录中创建一个空文件,使用给定前缀和后缀生成其名称 |
static File createTempFile(String prefix, String suffix, File directory) | 在指定目录中创建一个新的空文件,使用给定的前缀和后缀字符串生成其名称 |
boolean delete() | 删除此抽象路径名表示的文件或目录 |
void deleteOnExit() | 在虚拟机终止时,请求删除此抽象路径名表示的文件或目录 |
boolean equals(Object obj) | 测试此抽象路径名与给定对象是否相等 |
boolean exists() | 测试此抽象路径名表示的文件或目录是否存在 |
File getAbsoluteFile() | 返回此抽象路径名的绝对路径名形式 |
String getAbsolutePath() | 返回此抽象路径名的绝对路径名字符串 |
File getCanonicalFile() | 返回此抽象路径名的规范形式 |
String getCanonicalPath() | 返回此抽象路径名的规范路径名字符串 |
long getFreeSpace() | 返回此抽象路径名指定的分区中未分配的字节数 |
String getName() | 返回由此抽象路径名表示的文件或目录的名称 |
String getParent() | 返回此抽象路径名父目录的路径名字符串;如果此路径名没有指定父目录,则返回 null |
File getParentFile() | 返回此抽象路径名父目录的抽象路径名;如果此路径名没有指定父目录,则返回 null |
String getPath() | 将此抽象路径名转换为一个路径名字符串 |
long getTotalSpace() | 返回此抽象路径名指定的分区大小 |
long getUsableSpace() | 返回此抽象路径名指定的分区上可用于此虚拟机的字节数 |
int hashCode() | 计算此抽象路径名的哈希码 |
boolean isAbsolute() | 测试此抽象路径名是否为绝对路径名 |
boolean isDirectory() | 测试此抽象路径名表示的文件是否是一个目录 |
boolean isFile() | 测试此抽象路径名表示的文件是否是一个标准文件 |
boolean isHidden() | 测试此抽象路径名指定的文件是否是一个隐藏文件 |
long lastModified() | 返回此抽象路径名表示的文件最后一次被修改的时间 |
long length() | 返回由此抽象路径名表示的文件的长度 |
String[] list() | 返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中的文件和目录 |
String[] list(FilenameFilter filter) | 返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中满足指定过滤器的文件和目录 |
File[] listFiles() | 返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件 |
File[] listFiles(FileFilter filter) | 返回抽象路径名数组,这些路径名表示此抽象路径名表示的目录中满足指定过滤器的文件和目录 |
File[] listFiles(FilenameFilter filter) | 返回抽象路径名数组,这些路径名表示此抽象路径名表示的目录中满足指定过滤器的文件和目录 |
static File[] listRoots() | 列出可用的文件系统根 |
boolean mkdir() | 创建此抽象路径名指定的目录 |
boolean mkdirs() | 创建此抽象路径名指定的目录,包括所有必需但不存在的父目录 |
boolean renameTo(File dest) | 重新命名此抽象路径名表示的文件 |
boolean setExecutable(boolean executable) | 设置此抽象路径名所有者执行权限的一个便捷方法 |
boolean setExecutable(boolean executable, boolean ownerOnly) | 设置此抽象路径名的所有者或所有用户的执行权限 |
boolean setLastModified(long time) | 设置此抽象路径名指定的文件或目录的最后一次修改时间 |
boolean setReadable(boolean readable) | 设置此抽象路径名所有者读权限的一个便捷方法 |
boolean setReadable(boolean readable, boolean ownerOnly) | 设置此抽象路径名的所有者或所有用户的读权限 |
boolean setReadOnly() | 标记此抽象路径名指定的文件或目录,从而只能对其进行读操作 |
boolean setWritable(boolean writable) | 设置此抽象路径名所有者写权限的一个便捷方法 |
boolean setWritable(boolean writable, boolean ownerOnly) | 设置此抽象路径名的所有者或所有用户的写权限 |
String toString() | 返回此抽象路径名的路径名字符串 |
URI toURI() | 构造一个表示此抽象路径名的 file: URI |
编程实例
在/home/porject/
目录下创建源代码文件FileDemo.java
import java.io.File;
import java.io.IOException;
public class FileDemo {
public static void main(String[] args){
//同学们可以根据自己的路径进行更改
File f1 =new
File("/home/project/1.txt");
//File(String parent,String child)
File f2 =new File("/home/project","2.txt");
//separator 跨平台分隔符
File f3 =new File("/home"+File.separator+"project");
File f4 =new File(f3,"3.txt");
try {
System.out.println(f1);
//当文件存在时返回 false;不存在时返回 true
System.out.println(f2.createNewFile());
//当文件不存在时返回 false
System.out.println(f3.delete());
}catch(IOException e) {
e.printStackTrace();
}
//列出磁盘下的文件和文件夹
File[] files =File.listRoots();
for(File file:files){
System.out.println(file);
if(file.length()>0){
String[] filenames =file.list();
for(String filename:filenames){
System.out.println(filename);
}
}
}
}
}
编译运行:
$ javac FileDemo.java
$ java FileDemo
文件流
java.io 包中提供了文件操作类:
- 用于读写本地文件系统中的文件:FileInputStream 和 FileOutputStream
- 描述本地文件系统中的文件或目录:File、FileDescriptor 和 FilenameFilter
- 提供对本地文件系统中文件的随机访问支持:RandomAccessFile
接下来将学习文件流的 FileInputStream 和 FileOutputStream 。
FileInputStream 类用于打开一个输入文件,若要打开的文件不存在,则会产生异常 FileNotFoundException,这是一个非运行时异常,必须捕获或声明抛弃;
FileOutputStream 类用来打开一个输出文件,若要打开的文件不存在,则会创建一个新的文件,否则原文件的内容会被新写入的内容所覆盖;
在进行文件的读/写操作时,会产生非运行时异常 IOException,必须捕获或声明抛弃(其他的输入/输出流处理时也同样需要进行输入/输出异常处理)。
文件流的构造方法
//打开一个以 f 描述的文件作为输入
FileInputStream(File f)
//打开一个文件路径名为 name 的文件作为输入
FileInputStream(String name)
//创建一个以 f 描述的文件作为输出
//如果文件存在,则其内容被清空
FileOutputStream(File f)
//创建一个文件路径名为 name 的文件作为输出
//文件如果已经存在,则其内容被清空
FileOutputStream(String name)
//创建一个文件路径名为 name 的文件作为输出
//文件如果已经存在,则在该输出上输出的内容被接到原有内容之后
FileOutputStream(String name, boolean append)
代码示例
File f1 = new File("file1.txt");
File f2 = new File("file2.txt");
FileInputStream in = new FileInputStream(f1);
FileOutputStream out = new FileOutputStream(f2);
输入流的参数是用于指定输入的文件名,输出流的参数则是用于指定输出的文件名。
编程实战
使用输入流和输出将 file1.txt 的内容复制到 file2.txt。
在/home/project/
目录下新建Txt文件file1.txt
。填入内容比如shiyanlou
。 在/home/project/
目录下新建源代码文件Test.java
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class Test {
public static void main(String[] args) {
try {
//inFile 作为输入流的数据文件必须存在,否则抛出异常
File inFile = new File("/home/project/file1.txt");
//file2.txt没有,系统可以创建
File outFile = new File("file2.txt");
FileInputStream fis = new FileInputStream(inFile);
FileOutputStream fos = new FileOutputStream(outFile);
int c;
while((c = fis.read()) != -1){
fos.write(c);
}
//打开了文件一定要记着关,释放系统资源
fis.close();
fos.close();
}catch(FileNotFoundException e) {
System.out.println("FileStreamsTest:" + e);
}catch(IOException e){
System.err.println("FileStreamTest:" + e);
}
}
}
编译运行:
$ javac Test.java
$ java Test
运行完成后,打开 file2.txt,可以看到 file2 和 file1 有相