Java中的文件操作(File类)
Java中主要通过File类进行对文件的抽象描述,但是有File类并代表文件是真实存在的。
File类概述
FIle类是java.io.File包下的类,我们先来看File类的中的常见属性、构造方法和方法。
属性
修饰符及类型 | 属性 | 说明 |
---|---|---|
static String | pathSeparator | 依赖于系统的路径分隔符,String类型的表示 |
static char | pathSeparator | 依赖于系统的路径分隔符,char类型的表示 |
构造方法
签名 | 说明 |
---|---|
FIle(FIle parent,String child) | 从父路径和子路径名字创建新的FIle实例 |
FIle(String pathname) | 通过给定的字符串转换为路径来创建FIle实例,路径可以是相对路径也可以是绝对路径 |
什么是绝对路径和相对路径:
https://blog.csdn.net/qq_59599094/article/details/129831107
/** File实例的创建
* 这里并不要求文件真是存在,只是得一个File实例
*/
File file = new File("./hello.txt");
System.out.println(file.exists());
File类中的常用方法
修饰符及返回值类型 | 方法签名 | 说明 |
---|---|---|
String | getParent() | 返回File对象的父目录文件路径 |
String | getName() | 返回对象的纯文件名称 |
String | getPath() | 返回File对象文件路径 |
String | getAbsolutePath() | 返回File对象的绝对路径 |
String | getCanonnicalPath() | 返回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 | mkdirs() | 创建File对象代表的目录,如果必要,会创建中间目录 |
boolean | renameTo(File dest) | 进行文件改名,也可以视为平时的剪切、粘贴操作 |
boolean | canRead() | 判断用户是否对文件有可读权限 |
boolean | canWrite() | 判断用户是否对文件有可写权限 |
代码示例
import java.io.File;
import java.io.IOException;
public class Test {
public static void main(String[] args) throws IOException {
/** File实例的创建
* 这里并不要求文件真是存在,只是得一个File实例
* 在当前作业下的上一级路景观获取文件描述
*/
//文件并不存在
File file = new File("../hello.txt");
System.out.println(file.exists());
System.out.println(file.getParent());
/**
* 返回绝对路径
*/
System.out.println(file.getAbsoluteFile());
/**
* 返回File对象修饰过后的真实路径
*/
System.out.println(file.getCanonicalFile());
}
}
普通文件的创建及删除:
import java.io.File;
import java.io.IOException;
public class Test2 {
public static void main(String[] args) throws IOException {
/**
* 要求文件不存在才能看到效果
*/
File file = new File("./hello.txt");
System.out.println("file.exists():" + file.exists());
//创建一个普通文件
System.out.println("file.isDirectory()" + file.isDirectory());
System.out.println("file.isFile()" + file.isFile());
System.out.println("file.createNewFile()" + file.createNewFile());
System.out.println("file.exists()" + file.exists());
System.out.println("file.isDirectory()" + file.isDirectory());
System.out.println("file.isFile()" + file.isFile());
//此时文件已经存在不能创建
System.out.println("file.createNewFile()" + file.createNewFile());
}
}
文件内容的读写——数据流
InputStream 概述
修饰符及返回值类型 | 方法签名 | 说明 |
---|---|---|
int | read() | 读取一个字节数据,返回-1代表全部读完 |
int | read(byte[] b) | 最多读取b.length字节数据到b中,返回实际读到的数据量,-1代表读完 |
int | read(byte[] b,int off,int len) | off为b中的偏移,最多读取len - off字节数据到b中 |
void | close() | 关闭字节流 |
强调:
InputStream是一个抽象类,要使用需要具体的是现实类。关于InputStream的实现类有很多,基本可以认为不同的输入设备都可以对应一个InputStream类,我们现只关心从文件中读取,使用FileInputStream即可。
FileInputStream概述
签名 | 说明 |
---|---|
FileInputStream(File file) | 利用FIle构造文件输入流 |
FileInputStream(String name) | 利用文件路径构造文件输入流 |
代码演示
首先在当前目录下准备hello.txt的文件,然后往里面输入数据,这里的输入流是从硬盘中的文件输入到内存中
import java.io.*;
public class Test3 {
public static void main(String[] args) throws IOException {
File file = new File("./hello.txt");
System.out.println(file.exists());
InputStream inputStream = new FileInputStream(file);
while (true) {
int ch = inputStream.read();
if (ch == -1) {
//代表已经读完了
break;
}
System.out.print((char)ch);
}
/**
* 注意:一定要记得关闭资源
*/
inputStream.close();
}
}
OutputStream概述
强调:
同样的OutputStream也是一个抽象类,需要具体的实现类,现在我们还是只需要关心FileOutputStream即可。
我们这里输出流指的是输出到硬盘上的文件中。
代码演示
import java.io.*;
public class Test4 {
public static void main(String[] args) throws IOException {
//获取文件描述符
File file = new File("./hello.txt");
OutputStream outputStream = new FileOutputStream(file);
outputStream.write('h');
outputStream.write('e');
outputStream.write('l');
outputStream.write('l');
outputStream.write('o');
/**
* 重要:我们知道 I/O 的速度是很慢的,所以,大多的 OutputStream 为
* 了减少设备操作的次数,在写数据的时候都会将数据先暂时写入内存的
* 一个指定区域里,直到该区域满了或者其他指定条件时才真正将数据写
* 入设备中,这个区域一般称为缓冲区。但造成一个结果,就是我们写的
* 数据,很可能会遗留一部分在缓冲区中。需要在最后或者合适的位置,
* 调用 flush(刷新)操作,将数据刷到设备中。
*/
outputStream.flush();
outputStream.close();
}
}