09、IO流—File类与IO流(一)

简介: 09、IO流—File类与IO流(一)

一、File类


基本认识


File类:java.io.File,也是io流中的一部分,File类能够新建、删除、重命名文件与目录,但是不能访问文件本身,若是需要访问文件内容需要使用到输入输出流。


创建对象:通过构造器获取,介绍三个


File(String pathname):可填入绝对路径与相当路径,相对路径就是在本项目目录下。
File(String parent, String child):parent是父路径、child是子文件路径。
File(File parent, String child):父File对象与子文件路径。
@Test
public void test01(){
    //第一个构造器:File(String pathname)
    File file = new File("C:\\Users\\93997\\Desktop\\fileexer\\javahoner");
    //第二个构造器:File(String parent, String child)
    File file1 = new File("C:\\Users\\93997\\Desktop\\fileexer","javahoner");
    //第三个构造器:File(File parent, String child)
    File file2 = new File(new File("C:\\Users\\93997\\Desktop\\fileexer"),"javahoner");
    System.out.println(file);
    System.out.println(file1);
    System.out.println(file2);
}


第三个构造器第一个参数File parent:当其不为空时,实际上也是取该对象属性string path。

println()输出路径:File类其toString()方法就是打印了String path参数。



路径分隔符:就是上面构造器中的那个\\,不同操作系统使用的也不同


windows与Dos系统默认:\


Unix与URL使用:/


因为Java跨平台,所以对于路径分隔符需慎用,Java也给出通用的:File.separator,我们在创建实例时可以使用这个参数来代替我们手写/或\。(这个属性是通过调用方法来获取到本地文件系统的默认分隔符)


//相当于C:\Users\93997\Desktop\fileexer\javahoner 
File file = new File("C:\\Users\\93997\\Desktop\\fileexer\"+File.separator+\"javahoner");


实用方法


获取功能


获取文件对象的相关信息


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


String getPath:获取路径(也是绝对路径)


String getName:获取路径下的最后一个文件名


String getParent():获取上层文件目录路径,若无,返回null


Long length():获取文件长度(字节数)


Long lastModified():获取最后一次修改文件的时间戳(毫秒值)


String[] list():获取指定目录下所有文件的名称


File[] listFiles():获取指定目录下所有文件,以对象形式返回


若调用方法的抽象路径名不表示目录,返回值为null


实际使用:


@Test
public void test01(){
    //第一个构造器:File(String pathname)
    File file = new File("C:\\Users\\93997\\Desktop\\fileexer\\javahoner");
    System.out.println(file.getAbsolutePath());//C:\Users\93997\Desktop\fileexer\javahoner
    System.out.println(file.getPath());//C:\Users\93997\Desktop\fileexer\javahoner
    System.out.println(file.getName());//javahoner
    System.out.println(file.getParent());//C:\Users\93997\Desktop\fileexer
    System.out.println(file.length());//0
    System.out.println(file.lastModified());//1612056310161
    for (String childFile : file.list()) {
    System.out.print(childFile+" ");
    }//文件1 文件2
    System.out.println();
    for (File listFile : file.listFiles()) {
    System.out.println(listFile);
    }
    //C:\Users\93997\Desktop\fileexer\javahoner\文件1
    //C:\Users\93997\Desktop\fileexer\javahoner\文件2
}


重命名功能(包含剪切)


方法介绍


public boolean renameTo(File dest):剪切文件改名到指定路径(也可以实现重命名效果)


调用该方法的File,其指定路径下是否有文件都没事;注意dest的文件路径应该是不存在的

返回值:dest的路径下应该不存在文件,若存在返回false。


实际应用:重命名与剪切功能


场景1:想将javahoner目录下的文件名为文件修改为长路锅锅


File file = new File("C:\\Users\\93997\\Desktop\\fileexer\\javahoner\\文件");
boolean b = file.renameTo(new File("C:\\Users\\93997\\Desktop\\fileexer\\javahoner\\重命名的文件"));
System.out.println(b);


实际上就是将C:\\Users\\93997\\Desktop\\fileexer\\javahoner\\文件先剪切到C:\\Users\\93997\\Desktop\\fileexer\\javahoner路径下再改名为不存在的文件名为重命名文件。实现了修改名称效果

场景2:想将javahoner目录下的文件长路锅锅移动到1(2)文件中


File file = new File("C:\\Users\\93997\\Desktop\\fileexer\\javahoner\\长路锅锅");
boolean b = file.renameTo(new File("C:\\Users\\93997\\Desktop\\1(2)\\长路锅锅"));
System.out.println(b);


其实原理操作与上面一样的,需要注意1(2)要不存在长路锅锅文件。

总结:秒呀这个方法,看了下源码最终定位到一个WinNTFileSystem的private native boolean rename0(File f1, File f2);根据native关键字,说明这个方法是一个原生函数,是使用c/c++来实现并编译成DLL文件由java去调用。



判断功能


这里仅仅介绍下方法使用


public boolean isDirectory:判断是否是文件目录


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


public boolean exists():判断是否存在


public boolean canRead():判断是否可读


public boolean canWrite():判断是否可写


public boolean is Hidden():判断是否隐藏



创建、删除文件

创建功能


public boolean createNewFile():文件存在不创建返回false。


public boolean mkdir():文件目录存在不创建,若此文件目录的上级目录不存在也不创建。


public boolean mkdirs():不仅仅是此目录文件,若是此目录的上层文件目录不存在一并创建。



删除功能


public boolean delete():删除此抽象路径名表示的文件或目录,若是此路径名表示目录,则目录必须为空才能删除。



实际小案例

案例:删除指定路径下所有文件


public class Main {
    //生成num个空白字符串,若是num非0最后添加-
    public static String blankStr(int num){
        StringBuilder str = new StringBuilder();
        for (int i=0;i<num;i++){
            str.append(" ");
        }
        if(num != 0){
            str.append("-");
        }
        return str.toString();
    }
    //删除路径下内容(包含层级关系)
    public static void deleteAllFile(File file,int tier) throws RuntimeException{
        //如果该路径是一个文件直接删除
        if(file.isFile()){
            System.out.println(file.delete()?blankStr(tier)+file.getName()+"已删除":blankStr(tier)+file.getName()+"删除失败");
            return;
        }
        //该路径是目录
        File[] files = file.listFiles();
        //空目录直接删除
        if(files == null || files.length == 0){
            System.out.println(file.delete()?blankStr(tier)+"成功删除"+file.getName():blankStr(tier)+file.getName()+"空目录删除失败");
            return;
        }
        //目录不为空,遍历当前文件
        for (File dict : files) {
            //目录:删除目录中内容+删除自己本身
            if(dict.isDirectory()){
                //获取目录下的所有文件
                File[] files2 = dict.listFiles();
                //如果目录为空直接删除
                if(files2 == null || files2.length == 0){
                    System.out.println(dict.delete()?blankStr(tier)+"成功删除"+dict.getName():blankStr(tier)+dict.getName()+"空目录删除失败");
                }else{
                    //非空目录情况
                    deleteAllFile(dict,tier+1);
                    System.out.println(dict.delete()?blankStr(tier)+"成功删除"+dict.getName():blankStr(tier)+dict.getName()+"空目录删除失败");
                }
            }else{
                //非目录:无提示直接调用
                deleteAllFile(dict,tier+1);
            }
        }
    }
    //测试
    @Test
    public void test01(){
        File file = new File("C:\\Users\\93997\\Desktop\\fileexer\\javahoner\\文件1");
        try {
            deleteAllFile(file,0);
        } catch (RuntimeException e) {
            System.out.println("删除非空文件时出现异常!!!");
        }
        System.out.println("该文件路径下内容已被删除");
    }
}


调用deleteAllFile(File file,int tier)即可:参数1就是删除指定文件路径,参数2表示层级关系(设置为0最高级)


二、IO流


1、认识IO流


Google将I/O誉为"开放中创新",input/output:二进制1,0


IO原理:是Input/Output的缩写,I/O技术是很实用的技术,用来处理设备之间的数据传输。例如读/写文件,网络通讯等。


input:读取外部数据(例如磁盘、光盘等存储设备的数据)到程序(内存)中。

output:将程序(内存)中的数据库输出到磁盘、光盘等存储设备中。

在Java程序中,对于数据的输入/输出操作以"流(stream)"的方式进行。java.io包下提供了各种"流"类和接口,用以获取不同种类的数据,并通过标准的方法输入或输出数据。



流的分类


根据数据单位不同分为两类:字节流与字符流


字节流:最基本单位是字节byte的流,通常用来传输视频、图片(非文本的数据)

字符流:最基本单位是字符char的流,通常用来文本输入输出。

说明:中文字体在不同编码下占不同字节数,在UTF-8中文所占字节不确定可能是2,3,4个字节,所以建议进行文本输入输出选择字符流。

区别(重要):字节流按字节读数据,不需要编码解码;字符流按字符读数据,一次读两个字节,并返回这两个字节所对应的int型数值)(编码)。

数据的流向不同分为:输入流、输出流


角色不同分为:节点流、处理流


Java的IO流全部都是由下面这4个抽象基类派生:


(抽象基类)

字节流

字符流

输入流

InputStream

Reader

输出流

OutputStream

Writer


I/O流体系图:




关系图:




2、IO流基类介绍


字节流基类介绍

对于字节流的输入输出流的基类,首先介绍一下InputSream以及OutputSream。


InputSream为字节输入流的抽象基类,其基类定义了以下几个通用方法,这里列举几个

int read():从流中读取1个字节并返回,如果达到文件末尾返回-1;

read(byte b[]):从流中读取b的长度个字节的数据存储到b中,返回的是读取的字节个数,若是返回-1表示到了结尾,没有数据。

int read(byte b[], int off, int len):从流中的off位置开始读取len个字节的数据到b中,返回结果是实际读取的字节个数,若是返回-1表示没有数据。

void close():关闭输入流

OutputSream为字节输出流的抽象基类,这里列举几个该基类常用方法

void write(int b):将1个字节写入到输出流中

void write(byte b[]):从b的off位置开始,获取len个字节数据,写到输出流中

void flush():刷新此输出流并强制任何缓冲的输出字节被写出。(为之后缓冲流提供抽象方法)

void close():关闭输出流

输出入流关字节流的含节点流以及各种处理流它们的基类就是这两个。



字符流基类介绍

对于字符流的输入输出流的基类,介绍一下Reader、Writer


Reader:是字符输入流的抽象基类 ,定义了几个函数如下

int read():读取单个字符,返回结果是一个int,若想要字符显示需要转为char;若是到达流的末尾,返回-1

int read(char cbuf[]):从流中读取b的长度个字符的数据存储到b中,返回的是读取的字节个数,若是返回-1表示到了结尾,没有数据。

void close():关闭字符输入流

writer:是字符输入流的抽象基类 ,定义了几个函数如下

void write(int b):将1个字节写入到输出流中

void write(byte b[]):从b的off位置开始,获取len个字节数据,写到输出流中

void flush():刷新此输出流并强制任何缓冲的输出字节被写出。(为之后缓冲流提供抽象方法)

void close():关闭输出流

与之前介绍的字节流大致相同,他们两个区别之一就是它们传递的数据单位不同一个是字节、一个是流。



相关文章
|
4月前
|
Java
缓冲流和转换流的使用【 File类+IO流知识回顾③】
这篇文章介绍了Java中缓冲流(BufferedInputStream, BufferedOutputStream, BufferedReader, BufferedWriter)和转换流(InputStreamReader, OutputStreamWriter)的使用,包括它们的构造方法和如何利用它们提高IO操作的效率及处理字符编码问题。
缓冲流和转换流的使用【 File类+IO流知识回顾③】
|
4月前
|
存储 Java 调度
FileInputStream,FileOutputStream 和 FileReader ,FileWriter 类的基本使用【 File类+IO流知识回顾②】
这篇文章回顾了Java中FileInputStream、FileOutputStream、FileReader和FileWriter类的基本使用方法,包括读取和写入文件的操作,以及字符流和字节流的区别和应用场景。
FileInputStream,FileOutputStream 和 FileReader ,FileWriter 类的基本使用【 File类+IO流知识回顾②】
|
4月前
|
Java
File类的基本使用【 File类+IO流知识回顾①】
这篇文章回顾了Java中File类的基本使用,包括创建File对象、获取文件数据信息、判断文件存在与否、创建和删除文件目录,以及遍历文件目录的方法。
File类的基本使用【 File类+IO流知识回顾①】
|
4月前
|
存储 Java
序列化流 ObjectInputStream 和 ObjectOutputStream 的基本使用【 File类+IO流知识回顾④】
这篇文章介绍了Java中ObjectInputStream和ObjectOutputStream类的基本使用,这两个类用于实现对象的序列化和反序列化。文章解释了序列化的概念、如何通过实现Serializable接口来实现序列化,以及如何使用transient关键字标记不需要序列化的属性。接着,通过示例代码演示了如何使用ObjectOutputStream进行对象的序列化和ObjectInputStream进行反序列化。
序列化流 ObjectInputStream 和 ObjectOutputStream 的基本使用【 File类+IO流知识回顾④】
|
4月前
|
Java 大数据 API
Java 流(Stream)、文件(File)和IO的区别
Java中的流(Stream)、文件(File)和输入/输出(I/O)是处理数据的关键概念。`File`类用于基本文件操作,如创建、删除和检查文件;流则提供了数据读写的抽象机制,适用于文件、内存和网络等多种数据源;I/O涵盖更广泛的输入输出操作,包括文件I/O、网络通信等,并支持异常处理和缓冲等功能。实际开发中,这三者常结合使用,以实现高效的数据处理。例如,`File`用于管理文件路径,`Stream`用于读写数据,I/O则处理复杂的输入输出需求。
261 12
|
5月前
|
Java
IO流操作-------File类、输入流和输出流(二)
这篇文章介绍了Java中IO流操作的基本概念和使用,包括字节流和字符流的读取与写入,以及如何使用缓冲流提高文件读写效率和实现文件复制的方法。
IO流操作-------File类、输入流和输出流(二)
|
5月前
|
Java
IO流操作-------File类(一)
这篇文章介绍了Java中File类的常用操作,包括创建文件/文件夹、删除文件、查询文件属性(如存在性、大小、名称、路径)以及递归遍历文件夹下所有文件的方法。
IO流操作-------File类(一)
|
5月前
|
存储 缓存 Java
15 Java IO流(File类+IO流+字节流+字符流+字节编码)
15 Java IO流(File类+IO流+字节流+字符流+字节编码)
60 3
|
5月前
|
存储 Java
【IO面试题 四】、介绍一下Java的序列化与反序列化
Java的序列化与反序列化允许对象通过实现Serializable接口转换成字节序列并存储或传输,之后可以通过ObjectInputStream和ObjectOutputStream的方法将这些字节序列恢复成对象。
|
6月前
|
Java 大数据
解析Java中的NIO与传统IO的区别与应用
解析Java中的NIO与传统IO的区别与应用

热门文章

最新文章