目录
一、认识文件
1、文件路径
文件路径是计算机系统用于定义文件的唯一标识。文件路径可以是绝对路径和相对路径。绝对路径表示文件在文件系统中的完整位置,从根目录开始。相对路径表示文件相对于另一个文件或目录的位置。
2、绝对路径和相对路径
绝对路径:从根目录开始,一直到达指定文件所经过的位置,表示文件在文件系统中的完整位置。
例如:找CNN.py这个文件,采用绝对路径查找,从磁盘出发
G:/pythonProject/pytorch/cnn/cnn.py
相对路径:可以从任意结点出发,进行路径的描述,而这种描述方式就被成为相对路径。
例子:一样寻找CNN.py这个文件,采用相对路径查找,我们以pythonProject为基准来查找
./pytorch/cnn/cnn.py
相对路径中使用的一些特殊符号包括:
1、'.' 表示当前目录
2、‘..’表示上一级目录
注意:这个符号'\'叫做路径分隔符,在Java中,反斜杠有特殊的含义,它是转义字符的前缀,所以要在字符串中表示一个反斜杠,必须写两个反斜杠。
或者我们可以使用“/”来进行代替,就不用担心转义字符了。
二、File概述
构造方法
方法 | 说明 |
File(File parent, String child) | 根据父目录 + 孩子文件路径,创建一个新的 File 实例 |
File(String pathname) | 根据文件路径创建一个新的 File 实例,路径可以是绝对路径或者相对路径 |
File(String parent, String child) | 根据父目录 + 孩子文件路径,创建一个新的 File 实例,父目录用路径表示 |
方法
修饰符及返回值类型 | 方法 | 说明 |
String | getParent() | 返回 File 对象的父目录文件路径 |
String | getName() | 返回 FIle 对象的纯文件名称 |
String | getPath() | 返回 File 对象的文件路径 |
String | getAbsolutePath() | 返回 File 对象的绝对路径 |
String | getCanonicalPath() | 返回 File 对象的修饰过的绝对路径 |
boolean | exists() | 判断 File 对象描述的文件是否真实存在 |
boolean | isDirectory() | 判断 File 对象代表的文件是否是一个目录 |
boolean | isFile() | 判断 File 对象代表的文件是否是一个普通文件 |
boolean | createNewFile() | 根据 File 对象,自动创建一个空文件。成功创建后返回 true |
boolean | delete() | 根据 File 对象,删除该文件。成功删除后返回 true |
void | deleteOnExit() | 根据 File 对象,标注文件将被删除,删除动作会到 JVM 运行结束时才会进行 |
String[] | list() | 返回 File 对象代表的目录下的所有文件名 |
File[] | listFiles() | 返回 File 对象代表的目录下的所有文件,以 File 对象表示 |
boolean | mkdir() | 创建 File 对象代表的目录 |
boolean | mkdirs() | 创建 File 对象代表的目录,如果必要,会创建中间目录 |
boolean | renameTo(File dest) | 进行文件改名,也可以视为我们平时的剪切、粘贴操作 |
boolean | canRead() | 判断用户是否对文件有可读权限 |
boolean | canWrite() | 判断用户是否对文件有可写权限 |
2.1 文件系统操作
public class IODemo1 {
public static void main(String[] args) throws IOException {
File file = new File("d:/cat.jpg");
//返回 File 对象的父目录文件路径
System.out.println(file.getParent());
//返回 FIle 对象的纯文件名称
System.out.println(file.getName());
//返回 File 对象的文件路径
System.out.println(file.getPath());
//返回 File 对象的绝对路径
System.out.println(file.getAbsoluteFile());
//返回 File 对象的修饰过的绝对路径
System.out.println(file.getCanonicalFile());
}
}
public class IODemo2 {
public static void main(String[] args) throws IOException {
File file = new File("./cat.jpg");
//返回 File 对象的父目录文件路径
System.out.println(file.getParent());
//返回 FIle 对象的纯文件名称
System.out.println(file.getName());
//返回 File 对象的文件路径
System.out.println(file.getPath());
//返回 File 对象的绝对路径
System.out.println(file.getAbsoluteFile());
//返回 File 对象的修饰过的绝对路径
System.out.println(file.getCanonicalFile());
}
}
public class IODemo3 {
public static void main(String[] args) throws IOException {
//在相对路径中,./通常可以省略
File file = new File("./hello word.txt");
//判断 File 对象描述的文件是否真实存在
System.out.println(file.exists());
//判断 File 对象代表的文件是否是一个目录
System.out.println(file.isDirectory());
//判断 File 对象代表的文件是否是一个普通文件
System.out.println(file.isFile());
//创建文件
file.createNewFile();
System.out.println(file.exists());
System.out.println(file.isDirectory());
System.out.println(file.isFile());
}
}
public class IODemo4 {
public static void main(String[] args) {
File file = new File("test_dir");
//创建 File 对象代表的目录,只能创建一级目录
file.mkdir();
}
}
public class IODemo5 {
public static void main(String[] args) {
File file = new File("test_dir/aaa/bbb");
//创建多级目录
file.mkdirs();
}
}
public class IODemo6 {
public static void main(String[] args) {
File file = new File("test222");
String[] results = file.list();
System.out.println(Arrays.toString(results));
File[] results2 = file.listFiles();
System.out.println(Arrays.toString(results2));
}
public class IODemo7 {
public static void main(String[] args) {
//重命名
File src = new File("./test_dir");
File dest = new File("./test222");
src.renameTo(dest);
}
}
2.2 文件内容操作
InputStream概述
方法
修饰符及返回值类型 | 方法 | 说明 |
int | read() |
读取一个字节的数据,返回 -1 代表已经完全读完了
|
int |
read(byte[] b)
|
最多读取 b.length 字节的数据到 b 中,返回实际读到的数量;-1 代表以及读完了
|
int |
read(byte[] b, int off, int len)
|
最多读取 len - off 字节的数据到 b 中,放在从 off 开始,返回实际读到的数量;-1 代表以及读完了
|
void |
close()
| 关闭字节流 |
说明
InputStream类是一个抽象类,不能直接进行实例化,需要借助它的子类进行实例化
签名 | 说明 |
FileInputStream(File file)
|
利用 File 构造文件输入流
|
FileInputStream(String name)
|
利用文件路径构造文件输入流
|
public class IODemo8 {
public static void main(String[] args) throws IOException {
//这个过程相当于C中的fopen,文件的打开操作
//InputStream inputStream = new FileInputStream("g:/test.txt");
//inputStream.close();
//try with resources 带有资源的try操作,会在try代码块结束,自动执行close关闭操作
//因为InputStream实现了一个特定的接口Closeable
try (InputStream inputStream = new FileInputStream("g:/test.txt")){
//读文件
//read一次返回的是一个字节,但是此时的返回值类型是int
while (true) {
int b = inputStream.read();
if(b == -1) {
break;
}
System.out.println(b);
}
}
}
}
修饰符号及返回值类型 | 方法 | 说明 |
void | write(int b) | 写入要给字节的数据 |
void | write(byte[] b) |
将 b 这个字符数组中的数据全部写入 os 中
|
int | write(byte[] b,int off,int len) |
将 b 这个字符数组中从 off 开始的数据写入 os 中,一共写 len 个
|
void | close() | 关闭字节流 |
void |
flush()
|
重要:我们知道 I/O 的速度是很慢的,所以,大多的 OutputStream 为
了减少设备操作的次数,在写数据的时候都会将数据先暂时写入内存的
一个指定区域里,直到该区域满了或者其他指定条件时才真正将数据写
入设备中,这个区域一般称为缓冲区。但造成一个结果,就是我们写的
数据,很可能会遗留一部分在缓冲区中。需要在最后或者合适的位置,
调用 flush(刷新)操作,将数据刷到设备中。
|
public class IODemo9 {
public static void main(String[] args) {
try (OutputStream outputStream = new FileOutputStream("g:/test.txt")){
outputStream.write(97);
outputStream.write(98);
outputStream.write(99);
} catch (IOException e) {
e.printStackTrace();
}
}
}
try-with-resource语句
try-with-resource是Java7中引入的一个特性,它是为了简化在程序中使用资源(列如文件、网络连接)的管理。在Java程序中,资源的正确关闭非常重要,因为资源泄露可能导致性能问题、程序错或其它问题。try-with-resource语句确保在代码块执行完毕后自动关闭资源,无论代码执行过程中是否发生异常。
try-with-resources
语句实现自动关闭资源的方式是通过在资源实现java.lang.AutoCloseable
或java.io.Closeable
接口的情况下,确保close()
方法被调用。这两个接口都包含一个close()
方法,它们的实现负责释放资源。
try (ResourceType resource = new ResourceType()) {
// 使用资源的代码
} catch (Exception e) {
// 处理异常的代码
}