Java文件操作——IO

143 阅读8分钟

一、文件目录的表示方式

  • 绝对路径 :例如,d:/home/user 表示在D盘下的 home 目录中的 user 目录。
  • ./ :表示当前路径。当前路径是指您正在操作的目录,例如,在 /home/user 目录下,那么 ./file.txt 表示在该目录下的 file.txt 文件。
  • ../ :表示父级路径,即当前路径所在的上一级目录。例如,在 /home/user 目录下,那么 ../file.txt 表示在 /home 目录下的 file.txt 文件。

二、File 文件操作

  File类就是一个文件或目录的路径名的抽象表示,它可以让你方便地操作文件或目录的属性和结构。它可以用来创建、删除、重命名、查找和修改文件和目录。

构造方法描述
File(String pathname)使用指定路径创建File对象,可以是绝对路径或相对路径。
File(File parent, String child)使用指定的父File对象和子路径创建File对象。
File(String parent, String child)使用指定的父路径和子路径创建File对象。
File(URI uri)通过指定的URI创建File对象。
修饰符及返回 值类型方法签名说明
StringgetParent()返回 File 对象的父目录文件路径
StringgetName()返回 FIle 对象的纯文件名称
StringgetPath()返回 File 对象的文件路径
StringgetAbsolutePath()返回 File 对象的绝对路径
StringgetCanonicalPath()返回 File 对象的修饰过的绝对路径
booleanexists()判断 File 对象描述的文件是否真实存在
booleanisDirectory()判断 File 对象代表的文件是否是一个目录
booleanisFile()判断 File 对象代表的文件是否是一个普通文件
booleancreateNewFile()根据 File 对象,自动创建一个空文件。成功创建后返 回 true
booleandelete()根据 File 对象,删除该文件。成功删除后返回 true
voiddeleteOnExit()根据 File 对象,标注文件将被删除,删除动作会到 JVM 运行结束时才会进行
String[]list()返回 File 对象代表的目录下的所有文件名
File[]listFiles()返回 File 对象代表的目录下的所有文件,以 File 对象 表示
booleanmkdir()创建 File 对象代表的目录
booleanmkdirs()创建 File 对象代表的目录,如果必要,会创建中间目录
booleanrenameTo(File dest)进行文件改名,也可以视为我们平时的剪切、粘贴操 作
booleancanRead()判断用户是否对文件有可读权限
booleancanWrite()判断用户是否对文件有可写权限

三、文件内容操作

  File只是对文件的属性进行操作,而想要对文件内容进行操作,就需要借助其它类。

(一)什么是流?

  流是Java中用来处理输入和输出的一种抽象概念。流可以表示从一个源到一个目标的数据的流动,比如从文件到内存。

  • 按照方向分,有输入流和输出流。输入流是从源读取数据到内存,输出流是从内存写入数据到目标。写数据到硬盘叫输出,是因为输出是相对于内存而言的。程序运行在内存中,硬盘是外部设备,所以把数据从内存写入到硬盘就是输出操作。反之,从硬盘读取数据到内存就是输入操作。
  • 按照单位分,有字节流和字符流。字节流以字节为单位,可以处理任何类型的数据,字符流以字符为单位,可以处理文本数据。

(二)输入流(读文件)

1.字节流 —— InputStream

  InputStream是抽象类,它有很多实现类,这里介绍较重要的FileInputStream

(1)FileInputStream

构造方法:

签名说明
FileInputStream(File file)利用 File 构造文件输入流
FileInputStream(String name)利用文件路径构造文件输入流
方法描述
int read()从输入流中读取下一个字节的数据,返回 -1 代表已经完全读完了。
int read(byte[] buffer)从输入流中读取多个字节的数据并将其存储在给定的字节数组中,返回实际读取的字节数,返回 -1 代表已经完全读完了。
int read(byte[] buffer, int offset, int length)从输入流中读取指定长度的字节数据,并将其存储在给定的字节数组中,从指定偏移位置开始,返回实际读取的字节数,返回 -1 代表已经完全读完了。
long skip(long n)跳过指定数量的字节。
int available()返回当前可从输入流中读取的字节数。
void close()关闭输入流。
int readNBytes(byte[] b, int off, int len)从输入流中读取指定数量的字节数据,并将其存储在给定的字节数组中,从指定偏移位置开始,返回实际读取的字节数。
    public static void main(String[] args) throws IOException {
        //创建一个输入流:test.txt中的数据为:“Hello”
        InputStream inputStream = new FileInputStream("D:/test.txt");
        while(true){
            int res = inputStream.read();
            if(res == -1){
                break;
            }
            System.out.println(res);
        }
        //关闭输入流
        inputStream.close();
    }
//第二种写法
//资源的声明和初始化部分发生在try关键字后的括号中。这些资源必须是实现了AutoCloseable接口的类的实例,这个接口定义了一个close方法,用于关闭资源。在try块结束时,无论是否发生异常,这些资源会被自动关闭,而不需要显式调用close方法。
    public static void main(String[] args) throws IOException {
        //try()会自动调用close()方法
        //创建一个输入流
        try(InputStream inputStream = new FileInputStream("D:/test.txt")){
            while(true){
                int res = inputStream.read();
                if(res == -1){
                    break;
                }
                System.out.println(res);
            }
        }
    }
//第三种方式:
    public static void main(String[] args) throws IOException {
        //try()会自动调用close()方法
        //创建一个输入流
        try(InputStream inputStream = new FileInputStream("D:/test.txt")){
            while(true){
                //接收数据:本轮数据
                byte[] buffer = new byte[1024];
                //输入数据
                int len = inputStream.read(buffer);
                if(len == -1){
                    break;
                }
                //遍历这一轮的数据
                for (int i = 0; i < len; i++) {
                    System.out.println(buffer[i]);
                }
            }
        }
    }

结果:

image.png

这是每个字母对应的ASCII值。

2.字符流 —— Reader

(1)FileReader
构造方法描述
FileReader(File file)使用指定的File对象创建一个新的FileReader,用于读取指定文件的字符数据。
FileReader(String fileName)使用指定的文件名创建一个新的FileReader,用于读取指定文件的字符数据。
方法描述
int read()读取单个字符并返回其Unicode代码点值,如果到达文件末尾则返回 -1。。
int read(char[] cbuf)将字符读入数组并返回读取的字符数,如果到达文件末尾则返回 -1。
int read(char[] cbuf, int off, int len)将字符读入数组的指定范围并返回读取的字符数,如果到达文件末尾则返回 -1。
void close()关闭FileReader并释放相关的资源。
    public static void main(String[] args) {
        try ( Reader reader = new FileReader("D:/test.txt")){
           while (true){
               char[] res = new char[1024];
               int len = reader.read(res);
               if(len == -1){
                   break;
               }
               for (int i = 0; i < len; i++) {
                   System.out.print(res[i]);
               }
           }
        }catch (IOException e){
            e.printStackTrace();
        }
    }

(三)输出流(写文件)

1.字节流 —— OutPutStream

(1)FileOutPutStream

  OutPutStream是抽象类,它有很多实现类,这里介绍较重要的FileOutPutStream

构造方法描述
FileOutputStream(File file)使用指定的File对象创建一个新的文件输出流,该流将数据写入到指定的文件。
FileOutputStream(File file, boolean append)使用指定的File对象创建一个新的文件输出流,可以选择是否以追加模式打开文件。
FileOutputStream(String name)使用指定的文件名创建一个新的文件输出流,该流将数据写入到指定的文件。
FileOutputStream(String name, boolean append)使用指定的文件名创建一个新的文件输出流,可以选择是否以追加模式打开文件。
方法描述
void write(int b)将指定的字节写入输出流。
void write(byte[] b)将字节数组中的所有字节写入输出流。
void write(byte[] b, int off, int len)将字节数组中的指定范围的字节写入输出流。
void flush()刷新输出流,将缓冲区中的数据写入目标文件。
void close()关闭输出流,释放资源并确保所有数据都已写入目标文件。
    public static void main(String[] args) throws IOException {
        //创建输出流,第二个参数如果为 true 表示往文件末追加数据。注意:FileOutputStream 可以自动创建文件(如果不存在)
        try(OutputStream outputStream = new FileOutputStream("D:/test.txt",true)){
            outputStream.write('h');
            outputStream.write('e');
            outputStream.write('l');
            outputStream.write('l');
            outputStream.write('o');
        }
    }

image.png

2.字符流 —— Writer

(1)FileWriter
构造方法描述
FileWriter(File file)使用指定的File对象创建一个新的FileWriter,用于向指定文件写入字符数据。
FileWriter(File file, boolean append)使用指定的File对象创建一个新的FileWriter,可以选择是否以追加模式打开文件。
FileWriter(String fileName)使用指定的文件名创建一个新的FileWriter,用于向指定文件写入字符数据。
FileWriter(String fileName, boolean append)使用指定的文件名创建一个新的FileWriter,可以选择是否以追加模式打开文件。
方法描述
void write(int c)写入单个字符。
void write(char[] cbuf)将字符数组的所有字符写入文件。
void write(String str)将字符串的所有字符写入文件。
void write(char[] cbuf, int off, int len)将字符数组的一部分写入文件,从指定偏移位置开始,写入指定长度的字符。
void write(String str, int off, int len)将字符串的一部分写入文件,从指定偏移位置开始,写入指定长度的字符。
void flush()刷新缓冲区,将缓冲区中的数据写入文件。
void close()关闭FileWriter并释放相关的资源。
    public static void main(String[] args) {
        try(Writer writer = new FileWriter("D:/test.txt")){
            writer.write("你好哇!掘友~");
        }catch (IOException e){
            e.printStackTrace();
        }
    }