文件操作
File 类
属性
修饰符及类型 | 属性 | 说明 |
static String | pathSeparator | 路径分隔符,String 类型表示 |
static char | pathSeparator | 路径分隔符,char 类型表示 |
构造方法
方法签名 | 说明 |
File(File parent, String child) | 根据父目录 File 对象 + 孩子路径,创建 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() | 判断用户是否有可写权限 |
get 方法的使用
public class Test {
public static void main(String[] args) throws IOException {
File file = new File("../test.txt");
System.out.println("所处目录名 " + file.getParent());
System.out.println("文件名 " + file.getName());
System.out.println("路径 " + file.getPath());
System.out.println("绝对路径 " + file.getAbsolutePath());
System.out.println("经过处理的绝对路径 " + file.getCanonicalPath());
}
}
运行结果
文件创建删除
public class Test {
public static void main(String[] args) throws IOException {
File file = new File("test.txt");
System.out.println("是否存在 " + file.exists());
System.out.println("是否为文件夹 " + file.isDirectory());
System.out.println("是否为文件 " + file.isFile());
System.out.println();
System.out.println("使用 createNewFile() 创建文件");
System.out.println(file.createNewFile());
System.out.println();
System.out.println("是否存在 " + file.exists());
System.out.println("是否为文件夹 " + file.isDirectory());
System.out.println("是否为文件 " + file.isFile());
System.out.println();
System.out.println("使用 delete() 删除文件");
System.out.println(file.delete());
System.out.println();
System.out.println("是否存在 " + file.exists());
System.out.println("是否为文件夹 " + file.isDirectory());
System.out.println("是否为文件 " + file.isFile());
}
}
运行结果
文件读写
InputStream
方法
修饰符及返回类型 | 方法签名 | 说明 |
int | read() | 读取一个字节的数据,当内容读完后再读将返回 -1 |
int | read(byte[] b) | 最多读取 b.length 字节的数据到 b 中,返回读到的字节数,返回 -1 表示文件读完 |
int | read(byte[] b, int off, int len) | 读取 len 个字节,最多读取 b.length - off 个字节,数据从 b[off] 开始储存,返回 -1 表示文件读完 |
void | close() | 关闭字节流输入 |
InputStream 是一个抽象类,需要使用实现类来调用具体方法,我们这里需要文件相关的Input Stream 实现类 —— FileInputStream 类
FileInputStream
构造方法
方法签名 | 说明 |
FileInputStream(File file) | 利用 File 对象构造文件输入流 FileInputStream 对象 |
FileInputStream(String name) | 利用文件路径构造文件输入流 FileInputStream 对象 |
使用 read() 一个一个字节读取
public class Test {
public static void main(String[] args) throws IOException {
// test.txt 与 src 在同一层中
// test.txt 内容为 test
// 使用 try-with-resources 语句打开 FileInputStream 资源
// try 语句执行完毕后 自动释放 FileInputStream 资源
try (InputStream inputStream = new FileInputStream("test.txt")) {
// 使用 read() 一个一个字节的读取直到文件读取结束
while (true) {
int b = inputStream.read();
if (b == -1) {
// 当 read() 返回 -1
// 文件读取完毕,break 退出循环
break;
}
// 将每次读取到的字节值以字符形式输出
System.out.printf("%c", b);
}
}
}
}
运行结果
使用 read(byte[] b) 一次读取所有字节
public class Test {
public static void main(String[] args) throws IOException {
// test.txt 与 src 在同一层中
// test.txt 内容为 test
// 使用 try-with-resources 语句打开 FileInputStream 资源
// try 语句执行完毕后 自动释放 FileInputStream 资源
try (InputStream inputStream = new FileInputStream("test.txt")) {
byte[] bytes = new byte[4];
while (true) {
int len = inputStream.read(bytes);
if (len == -1) {
// 当 read() 返回 -1
// 文件读完
break;
}
for (int i = 0; i < len; i++) {
System.out.printf("%c", bytes[i]);
}
}
}
System.out.println();
}
}
运行结果
注意:由于中文字符的编码原因,一个字节并不能对应一个字符,使用这种方法读取中文需要将 bytes 数组使用 String 类的构造方法 String(byte bytes[], int offset, int length, String charsetName) 将 bytes[] 转换为字符串 (UTF-8 的一个字符大小为 3 个字节)
for (int i = 0; i < len; i+=3) {
String s = new String(bytes, i, 3, "UTF-8");
System.out.print(s);
}
运行结果
Scanner
构造方法
构造方法 | 说明 |
Scanner(InputStream inputStream, String charset) | 使用 charset 字符集进行 inputStream 的扫描读取 |
代码实现
public class Test {
public static void main(String[] args) throws IOException {
try (InputStream inputStream = new FileInputStream("test.txt")) {
try (Scanner scanner = new Scanner(inputStream, "UTF-8")) {
while (scanner.hasNext()) {
String s = scanner.next();
System.out.print(s);
}
}
}
}
}
运行结果
OutputStream
方法
修饰符及返回值类型 | 方法签名 | 说明 |
void | write(int b) | 写入要给的字节数据 |
void | write(byte[] b) | 将字节数据中的数据全部写入 |
int | write(byte[] b, int off, int len) | 写入字节数组中从 off 开始的 len 个字节数据 |
void | close() | 关闭字节流 |
void | flush() | 刷新缓冲区 |
缓冲区:对程序来讲 I/O 速度是比较慢的。因此为了减少 I/O 次数,写数据的时候会先将数据写入到一个指定的缓冲区中。缓冲区满了或是满足了某些特定条件的时候,将缓冲区的数据一次性写入到目标中,大大减少 I/O 次数。但可能就会出现写入数据时,数据写入到缓冲区中了,但不满足条件,没有写入真正的目的地,数据被遗留在了缓冲区中。所以我们有时需要使用 flush() 刷新缓冲区,强行将缓冲区的数据写到目的地中
OutputStream 同样是一个抽象类,所以我们应该使用 FileOutputStream 类
OutputStreamWriter
一个一个字节写入
public class Test {
public static void main(String[] args) throws IOException {
try (OutputStream outputStream = new FileOutputStream("test.txt")) {
outputStream.write('H');
outputStream.write('e');
outputStream.write('l');
outputStream.write('l');
outputStream.write('o');
outputStream.flush();
}
}
}
运行结果
字节数组写入
public class Test {
public static void main(String[] args) throws IOException {
try (OutputStream os = new FileOutputStream("test.txt")) {
byte[] b = new byte[]{
(byte) 'G', (byte) 'o', (byte) 'o', (byte) 'd'
};
os.write(b);
os.flush();
}
}
}
运行结果
使用字符串写入
public class Test {
public static void main(String[] args) throws IOException {
try (OutputStream outputStream = new FileOutputStream("test.txt")) {
String s = "Hello 世界";
byte[] b = s.getBytes(StandardCharsets.UTF_8);
outputStream.write(b);
outputStream.flush();
}
}
}
运行结果
PintWriter
PintWriter 类的对象,提供了几种我们比较熟悉的输出方法,包括 print/println/printf
public class Test {
public static void main(String[] args) throws IOException {
try (OutputStream outputStream = new FileOutputStream("test.txt")) {
OutputStreamWriter osWriter = new OutputStreamWriter(outputStream, StandardCharsets.UTF_8);
PrintWriter writer = new PrintWriter(osWriter);
writer.print("Hello ");
writer.println("你好");
writer.printf("%s: %d\n", "一百", 100);
writer.flush();
}
}
}
运行结果