Java 进阶File类、IO流

简介: Java 进阶File类、IO流

一、File类

1、概述

File类的文件代表操作系统的文件或文件夹

2、创建对象

1)方法

方法名 解释

public File(String pathname) 根据文件路径创建文件对象

public File(String parent, String child) 根据父路径名字符串和子路径名字符串创建文件对象

public File(File parent, String child) 根据父路径对应文件对象和子路径名字符串创建文件对象

注意

File对象可以定位文件和文件夹

File封装的对象仅仅是一个路径名,这个路径可以是存在的,也可以是不存在的

2)创建文件 File file = new File(路径)

绝对路径

File file = new File("D:\\aa.txt");

相对路径

5d0c438715b31b415e87cfe2db62637.png

File file = new File("data/ip.txt");

3)File的文件类型和获取信息

方法名 解释

public boolean isDirectory() 判断是否为文件夹

public boolean isFile() 判断是否为文件

public boolean exists() 判断是否存在

public long length() 获取文件的大小(字节数量)

public String getAbsolutePath() 获取文件的绝对路径

public String getPath() 获取定义文件时使用的路径

public String getName() 获取文件的名称,带后缀

public long lastModified() 获取文件的最后修改时间(时间毫秒值)

实战(实现方法)

11e548dddbdf9aba33d17d146bb6734.png

import java.io.File;
public class ClassStructure {
    public static void main(String[] args) {
        File file = new File("data/ip.txt");
        //是否为文件夹
        System.out.println(file.isDirectory());
        //是否为文件
        System.out.println(file.isFile());
        //是否存在
        System.out.println(file.exists());
        //文件的大小(字节数量)
        System.out.println(file.length());
        //文件的绝对路径
        System.out.println(file.getAbsolutePath());
        //定义文件时使用的路径
        System.out.println(file.getPath());
        //文件的名称,带后缀
        System.out.println(file.getName());
        //文件的最后修改时间(时间毫秒值)
        System.out.println(file.lastModified());
    }
}

4)File文件创建和删除

创建文件

方法名 解释

public boolean createNewFile() 创建新的空文件

public boolean mkdir() 只能创建一级文件夹

public boolean mkdirs() 可以创建多级文件夹

import java.io.File;
import java.io.IOException;
public class ClassStructure {
    public static void main(String[] args) throws IOException {
        File file = new File("data1");
        //只能创建一层文件夹
        boolean mkdir = file.mkdir();
        System.out.println(mkdir);
        File file1 = new File("data1\\data");
        //创建多层文件夹
        System.out.println(file1.mkdirs());
        //创建新文件
        File file2 = new File("data1\\data\\test.txt");
        boolean newFile = file2.createNewFile();
        System.out.println(newFile);
    }
}

删除文件

方法名 解释

public boolean delete() 删除由此抽象路径名表示的文件或空文件夹;

delete方法默认只能删除文件和空文件夹,delete方法直接删除不走回收站

import java.io.File;
import java.io.IOException;
public class ClassStructure {
    public static void main(String[] args) throws IOException {
        File file = new File("data1\\data\\test.txt");
        //删除文件
        boolean delete = file.delete();
        System.out.println(delete);
    }
}

不能删除非空文件夹

import java.io.File;
import java.io.IOException;
public class ClassStructure {
    public static void main(String[] args) throws IOException {
        File file = new File("data1");
        //删除文件
        boolean delete = file.delete();
        System.out.println(delete);
    }
}

5)File文件遍历

方法名 解释

publicString[]list() 获取当前目录下所有的"一级文件名称"到一个字符串数组中去返回

publicFile[]listFiles() 获取当前目录下所有的"一级文件对象"到一个文件对象数组中去返回

listFiles()注意事项:

返回为null的情况,可以有效避免遍历返回数组时候出现运行时异常

File对象不存在时或者代表文件时,返回null

File对象代表一个空文件夹时,返回一个长度为0的数组

File对象是一个有内容的文件夹时,将里面所有文件和文件夹的路径放在File数组中返回

File对象是一个有隐藏文件的文件夹时,将里面所有文件和文件夹的路径放在File数组中返回,包含隐藏文件

File对象权限访问该文件夹时,返回null

59cf03b0e632c3f236d0cbbd9a8b585.png

import java.io.File;
import java.io.IOException;
public class ClassStructure {
    public static void main(String[] args) throws IOException {
        File dir = new File("data\\nest");
        File[] files = dir.listFiles();
        for (File file : files) {
            System.out.println(file);
        }
    }
}

二、IO流

1、IO流体系图

6668a6173c27c1beb3b55ba13020b82.png

2、概念

I标识Input,数据从硬盘到内存读入的过程,叫输入,负责读

O标识Output,数据从内存到写出到硬盘的过程,叫输出,负责写

3、FileInputStream文件字节输入流

把磁盘中的数据已字节的形式读入到内存中

构造器 解释

public FileInputStream(File file) 创建字节输入流管道与源文件对象接通

public FileInputStream(String pathname) 创建字节输入流管道与源文件路径接通

方法名 解释

public int read() 每次读取一个字节,没有字节返回-1

public int read(byte[] buffer) 每次读取一个字节数组,没有字节返回-1

public int read(byte[] buffer,int off,int len) 从下标off的位置开始读取最多len个字节数据储存于buffer数组缓冲区

70d8d5f10983216e1b5cc73adb0e6f3.png

import java.io.FileInputStream;
import java.io.IOException;
public class ClassStructure {
    public static void main(String[] args) throws IOException {
        int read = 0;
        //创建一个读入数据的相对路径的流
        FileInputStream fileInputStream = new FileInputStream("data/access.log");
        /* int i
        //判断文件是否为空,否则一直读取打印
         while ((read = fileInputStream.read()) != -1){
            System.out.print((char)read);
        }
        System.out.println();
         */
        /*  byte[] buffer
        //创建一个8字节数组
        byte[] by = new byte[8];
        //读取流
        read = fileInputStream.read(by);
        System.out.println(read);
        //转换为字符串
        String str = new String(by);
        System.out.println(str);
         */
        /*
        byte[] buffer , int pos , int len  指定输出流
         */
        //创建一个8字节数组
        byte[] by = new byte[8];
        //判断文件是否为空,否则一直读取打印
        while((read = fileInputStream.read(by)) != -1){
            //转换为字符串
            String str = new String(by,0,read);
            System.out.println(str);
        }
        //读取完流必须关闭
        fileInputStream.close();
    }
}

4、FileOutputStream文件字节输出流

内存中的数据以字节的形式写出到磁盘中

构造器 解释

public FileOutputStream(File file) 创建字节输出流管道与源文件对象接通

public FileOutputStream(File file,boolean append) 创建字节输出流管道与源文件对象接通,可追加数据

public FileOutputStream(String filepath) 创建字节输出流管道与源文件路径接通

public FileOutputStream(String filepath,boolean append) 创建字节输出流管道与源文件路径接通,可追加数据

方法名 解释

public void write(int i) 一个字符数据写入输入流

public void write(byte[] buffer) 字符类型数组中的数据写入输出流

public void write(byte[] buffer , int pos , int len) 字符类型数组中的指定部分数据写入输出流

flush() 刷新流,可以继续写数据

close() 关闭流,释放资源,但是在关闭之前会先刷新流;

一旦关闭,就不能再写数据

c97c092233c4493f46e4ab5eaee5687.png

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class ClassStructure {
    public static void main(String[] args) throws IOException {
        int read = 0;
        //创建一个读入数据的相对路径的流
        FileInputStream fileInputStream = new FileInputStream("data/access.log");
        FileOutputStream fileOutputStream = new FileOutputStream("data/access1.log");
        /* int i
        //判断文件是否为空,否则一直读取打印
        while ((read = fileInputStream.read()) != -1){
            //把文件内容直接写入到access1.log中
            fileOutputStream.write(read);
        }
        System.out.println();
        /*
        byte[] buffer , int pos , int len  指定输出流
         */
        //创建一个8字节数组
        byte[] by = new byte[8];
        //判断文件是否为空,否则一直读取打印
        while((read = fileInputStream.read(by)) != -1){
            fileOutputStream.write(by,0,read);
        }
        System.out.println("复制OK");
        //将输出流的缓冲流数据全部写出到达目的地
        fileOutputStream.flush();
        //读取完流必须关闭
        fileInputStream.close();
        //写入完流必须关闭
        fileOutputStream.close();
    }
}

5、try-catch-finally资源释放

finally:放在try-catch后面的,无论是正常执行还是异常执行代码,最后一定要执行,特殊情况除外

33a9db3727ddd2f4b4800558f0422b9.png

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class ClassStructure {
    public static void main(String[] args) throws FileNotFoundException {
        int read = 0;
        FileInputStream fileInputStream = null;
        FileOutputStream fileOutputStream = null;
        //创建一个读入数据的相对路径的流
        fileInputStream = new FileInputStream("data/access.log");
        fileOutputStream = new FileOutputStream("data/access1.log");
        try {
            //判断文件是否为空,否则一直读取打印
            while ((read = fileInputStream.read()) != -1) {
                //把文件内容直接写入到access1.log中
                fileOutputStream.write(read);
            }
            System.out.println();
            System.out.println("复制OK");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //将输出流的缓冲流数据全部写出到达目的地
            try {
                fileOutputStream.flush();
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                //读取完流必须关闭
                if (fileInputStream != null) {
                    fileInputStream.close();
                }
                //写入完流必须关闭
                if (fileOutputStream != null) {
                    fileOutputStream.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
相关文章
|
8月前
|
Java 开发工具
【Azure Storage Account】Java Code访问Storage Account File Share的上传和下载代码示例
本文介绍如何使用Java通过azure-storage-file-share SDK实现Azure文件共享的上传下载。包含依赖引入、客户端创建及完整示例代码,助你快速集成Azure File Share功能。
528 6
|
8月前
|
存储 Java 索引
用Java语言实现一个自定义的ArrayList类
自定义MyArrayList类模拟Java ArrayList核心功能,支持泛型、动态扩容(1.5倍)、增删改查及越界检查,底层用Object数组实现,适合学习动态数组原理。
350 4
|
8月前
|
IDE JavaScript Java
在Java 11中,如何处理被弃用的类或接口?
在Java 11中,如何处理被弃用的类或接口?
373 5
|
8月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
404 1
|
8月前
|
Java Unix Go
【Java】(8)Stream流、文件File相关操作,IO的含义与运用
Java 为 I/O 提供了强大的而灵活的支持,使其更广泛地应用到文件传输和网络编程中。!但本节讲述最基本的和流与 I/O 相关的功能。我们将通过一个个例子来学习这些功能。
314 1
|
8月前
|
Java Go 开发工具
【Java】(8)正则表达式的使用与常用类分享
正则表达式定义了字符串的模式。正则表达式并不仅限于某一种语言,但是在每种语言中有细微的差别。
508 1
|
8月前
|
存储 Java 程序员
【Java】(6)全方面带你了解Java里的日期与时间内容,介绍 Calendar、GregorianCalendar、Date类
java.util 包提供了 Date 类来封装当前的日期和时间。Date 类提供两个构造函数来实例化 Date 对象。第一个构造函数使用当前日期和时间来初始化对象。Date( )第二个构造函数接收一个参数,该参数是从1970年1月1日起的毫秒数。
323 0
|
8月前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
379 1
|
存储 Java
【IO面试题 四】、介绍一下Java的序列化与反序列化
Java的序列化与反序列化允许对象通过实现Serializable接口转换成字节序列并存储或传输,之后可以通过ObjectInputStream和ObjectOutputStream的方法将这些字节序列恢复成对象。
|
Java 大数据
解析Java中的NIO与传统IO的区别与应用
解析Java中的NIO与传统IO的区别与应用