Java文件操作

目录

一、File类概述

1.1 使用案例

二、文件内容的读写

2.1 字符流

2.1.1 读取文件

2.1.2 写入文件

2.2 字节流

2.2.1 读取文件

2.2.2 写入文件


对于Java操作文件,具体详情可以参考Java api文档 中的Java.io.File类

一、File类概述

首先先了解一下File类中常见的属性、构造方法和普通方法

属性

修饰符及类型 属性 说明
static String pathSeparator 依赖于系统的路径分隔符,String 类型的表示
static char pathSeparator 依赖于系统的路径分隔符,char 类型的表示

构造方法

签名 说明
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() 判断用户是否对文件有可写权限

1.1 使用案例

File的基本使用

import java.io.File;
import java.io.IOException;

public class Demo5 {
    public static void main(String[] args) throws IOException {
        File file = new File("../hello.txt");//这里不要求该文件存在
        System.out.println(file.getParentFile());
        System.out.println(file.getName());
        System.out.println(file.getAbsoluteFile());
        System.out.println(file.getCanonicalFile());
    }
}

Java文件操作_第1张图片

普通文件的创建、删除

import java.io.File;
import java.io.IOException;

public class Demo6 {
    public static void main(String[] args) throws IOException {
        File file = new File("./test.txt");
        System.out.println(file.exists());
        System.out.println(file.isFile());
        // 创建文件
        file.createNewFile();
        System.out.println(file.exists());
        System.out.println(file.isFile());
        System.out.println(file.getAbsoluteFile());
    }
}

 Java文件操作_第2张图片

当前的目录中是没有这个test.txt文件的,然后运行程序

Java文件操作_第3张图片Java文件操作_第4张图片

从这里可以看出创建已经成功了,接下来是删除操作。

import java.io.File;

public class Demo7 {
    public static void main(String[] args) {
        File file = new File("./test.txt");
        file.delete();
    }
}

当这个代码执行的时候,文件就会被删除了。

二、文件内容的读写

2.1 字符流

2.1.1 读取文件

构造方法

签名 说明
FileReader(File file) 利用 File 构造文件输入流
FileReader(String name) 利用文件路径构造文件输入流

文件读取

首先先准备好一个含有内容的文件 

Java文件操作_第5张图片

import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;

public class Demo9 {
    public static void main(String[] args) throws IOException {
        //这里用try()的写法就不用去关闭字符流了,这个会自动关闭
        try(Reader reader = new FileReader("./test.txt")) {
            // 因为文件不能一下就全部读完,所以采取循环读取的方式
            while (true) {
                // 用来存储读取到的字符
                char[] buf = new char[1024];
                // 将文件中的内容写入字符数组中
                int n = reader.read(buf);
                if (n == -1) {
                    // 读取结束
                    break;
                }
                for (int i = 0; i < n; i++) {
                    System.out.print(buf[i]);
                }
            }
        }
    }
}

 

2.1.2 写入文件

修饰
符及
返回
值类
方法签名 说明
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(刷新)操作,将数据刷到设备中。
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;

public class Demo10 {
    public static void main(String[] args) throws IOException {
        try (Writer fileWriter = new FileWriter("./test.txt",true)) {
            fileWriter.write("hello world!");
        }
    }
}

运行代码就会看到,结果已经写入了文件中了

Java文件操作_第6张图片

2.2 字节流

2.2.1 读取文件

构造方法

签名 说明
FileInputStream(File file) 利用 File 构造文件输入流
FileInputStream(String name) 利用文件路径构造文件输入流

开始读取文件

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

public class Demo11 {
    public static void main(String[] args) throws IOException {
        try (InputStream in = new FileInputStream("./test.txt")) {
            while (true) {
                byte[] buf = new byte[1024];// 由于这里是字节流读入,所以只能用字节数组接收
                int n = in.read(buf);
                if (n == -1) {
                    break;
                }
                for (int i = 0; i < n; i++) {
                    System.out.printf("%x",buf[i]);// 由于是字节,这里用16进制打印
                }
            }
        }
    }
}

由于有时候需要的是文件本身的内容,而不是字节内容,这里通常使用 String 来解决。

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

public class Demo11 {
    public static void main(String[] args) throws IOException {
        try (InputStream in = new FileInputStream("./test.txt")) {
            while (true) {
                byte[] buf = new byte[1024];// 由于这里是字节流读入,所以只能用字节数组接收
                int n = in.read(buf);
                if (n == -1) {
                    break;
                }
                // 利用String 字节转字符
                String s = new String(buf,0,n);
                System.out.print(s);
            }
        }
    }
}

利用Scanner 进行字符读取

上述例子中,我们看到了对字符类型直接使用 InputStream 进行读取是非常麻烦且困难的,所以,我们使用一种我们之前比较熟悉的类来完成该工作,就是 Scanner 类。但是Scanner类只能用于字节流的文本内容读取,如果内容是二进制文件则不能用Scanner。

构造方法 说明
Scanner(InputStream is, String charset) 使用 charset 字符集进行 is 的扫描读取
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Scanner;

public class Demo12 {
    public static void main(String[] args) throws IOException {
        try (InputStream in = new FileInputStream("test.txt")) {
            Scanner sc = new Scanner(in);
            // 由于Scanner遇到换行就会停止读取,为了读取全部文本内容就要用到hashNext
            while (sc.hasNextLine()) {
                String s = sc.nextLine();
                System.out.println(s);
            }
        }
    }
}

注意:不论是字节流还是字符流都能用Scanner来接收 ,但是都只限于文本内容

2.2.2 写入文件

这里的写入具体方法参考 2.1.2中的方法,因为写入的方法都是一样的,只是写入的是字节还是字符的区别。

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

public class Demo14 {
    public static void main(String[] args) throws IOException {
        try (OutputStream os = new FileOutputStream("./test.txt",true)) {
            os.write("hello".getBytes());// 由于是字节输出所以要转换成字节
        }
    }
}

这里的操作并不需要全部记住,只需要了解如何使用即可。用的使用查询api文档

你可能感兴趣的:(java)