Java中的 I/O之File类
- 什么是I/O
- IO流的分类
- 关于流的基本特性
- IO流的体系结构
- File类介绍
- File类的使用
- File类的一些主要方法
什么是I/O
I/O即输入输出,它采用的流技术来处理设备之间的数据传输。java.io包下提供了各种“流”类的接口,用于获取不同种类的数据,并通过标准的方法输输入或输出数据。
有:文件流 字符流 数据流 对象流 网络流…
流:代表任何有能力产出数据的数据源对象或者是有能力接受数据的接收端对象 -----Thinking in Java
流的本质:数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作。
流的作用:为数据源和目的地建立一个输送通道。
计算机中数据都是以二进制的形式读出或写入的。文件就像是一个水池,我们可以通过管道把水池中的水抽取出来,或者通过流把水放到一个水池中。这里的管道也就相当于是Java中的流,流的本质是一种有序的数据集合,有数据源和目的地。
在整个Java.io包中最重要的就是5个类和一个接口。5个类指的是File、OutputStream、InputStream、Writer、Reader;一个接口指的是Serializable.掌握了这些IO的核心操作那么对于Java中的IO体系也就有了一个初步的认识了。
Java中I/O主要包括如下几个层次,包含三个部分:
- 流式部分—IO的主体部分
- 非流式部分—主要包含一些辅助流式部分的类,如:File类、RandomAccessFile类和FileDescriptor等类
- 其他类–文件读取部分的与安全相关的类,如:SerializablePermission类,以及与本地操作系统相关的文件系统的类,如:FileSystem类和Win32FileSystem类和WinNTFileSystem类
IO流的分类
- 按照数据流动的方向分:
- 输入流:程序从数据流读取数据源到内存中,数据源包括外界(键盘、文件、网络···),是数据源读入到程序的通信通道
- 输出流:程序向输出流写入输入,将程序在内存中流动的数据输出(写)到外界(显示器,打印机,文件,网络···)
主要的输入输出流:
按数据流动的方向分 | 字节型 | 字符流 |
输入流 | InputStream | Reader |
输出流 | OutputStream | Writer |
- 按照流的操作单元分(处理数据类型的不同):
- 字节流:数据流中最小的数据单元是字节
- 字符流:数据流中最小的数据单元是字符,Java中的字符默认采用的是Unicode编码,一个字符占用两个字节。
- 按照角色划分:
- 节点流:从具体介质读写数据的类,程序将直接连接到实际的数据源,如 InputStream
- 处理流:对节点流进行包装和进行特定的处理,如对一个已存在的流进行封装 BufferInputStream
关于流的基本特性
- 先进先出,最先写入输出流的数据最先被输入流读取到。
- 顺序存取,可以一个接一个地往流中写入一串字节,读出时也将按写入顺序读取一串字节,不能随机访问中间的数据。(RandomAccessFile可以从文件的任意位置进行存取(输入输出)操作)
- 只读或只写,每个流只能是输入流或输出流的一种,不能同时具备两个功能,输入流只能进行读操作,对输出流只能进行写操作。在一个数据传输通道中,如果既要写入数据,又要读取数据,则要分别提供两个流。
IO流的体系结构
主要的类包括:
- File(文件特征与管理):用于文件或者目录的描述信息,例如生成新目录,修改文件名,删除文件,判断文件所在路径等。
- InputStream(二进制格式操作):抽象类,基于字节的输入操作,是所有输入流的父类。定义了所有输入流都具有的共同特征。
- OutputStream(二进制格式操作):抽象类。基于字节的输出操作。是所有输出流的父类。定义了所有输出流都具有的共同特征。
- Reader(文件格式操作):抽象类,基于字符的输入操作。
- Writer(文件格式操作):抽象类,基于字符的输出操作。
- RandomAccessFile(随机文件操作):一个独立的类,直接继承至Object.它的功能丰富,可以从文件的任意位置进行存取(输入输出)操作。
Java中IO流的体系结构图:
IO流类结构图概览:
File类介绍
了解File类之前,得先了解什么是文件,文件是一种电脑得存储形式,文件有不同的后缀名,后缀名是文件的格式,决定了该文件被电脑中何种程序运行,文件格式包括 .txt .doc .ppt .mp4 .jpg .rar …等,每一种格式的文件都有它自己的字节排布规律,我们需要使用不用的运行环境才能打开它。
电脑上的文件夹是不占用存储空间的,它仅仅是电脑操作系统为文件划分区域做的可视化手段。
并且电脑当中的文件和文件夹名称是不区分大小写的。
一个char字符占一个字节,一个回车符(上一行的结束,下一行的开始)占两个字节。
Java当中的File类是文件和目录路径名的抽象表示。
一个File类对象可以与电脑中的文件或文件夹产生一一对应的映射关系。
但是File与真实硬盘中的文件或文件夹,不是一个概念:
File是在内存中的一个对象<—映射—>硬盘上的文件或文件夹
File类的使用
四个构造方法:
- File(String pathname) :通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例。
它可能是最常用的创建File对象的方式:
File file = new File("E://test//Test.txt");
如果电脑的E盘中真实存在test文件夹且里面有名为Test.txt的相应文件,那么该file对象就会和硬盘中对应真实存在的Test.txt文件产生一一映射关系。
如果这个文件在硬盘上不存在也没关系,这个对象依然存在,只是没有了映射关系,它所有属性都是默认值。
如果给的路径是一个相对路径, 那么它是相对于当前项目所在硬盘上的目录。
- File(File parent, String child) :从父抽象路径名和子路径名字符串创建新的 File实例。
File parent = new File("E://test");
File file = new File(parent,"Test.txt");
- File(String parent, String child) :从父路径名字符串和子路径名字符串创建新的 File实例。
File file = new File("E:\\test","Test.txt");
其实//
和\\
都可以表示代码中文件层级的分隔符
- File(URI uri) :通过将给定的 file: URI转换为抽象路径名来创建新的 File实例。
File类的一些主要方法
- String path = getAbsolutePath() 获取文件的绝对路径
- String name = getName() 获取文件的名字
- boolean = createNewFile() 创建新的文件,可能会发生编译时异常:
IOException
- boolean = mkdir() 创建新的文件夹 如果父目录不存在,则不能创建
- boolean = mkdirs() 创建新的文件夹 即使父目录不存在,也可以创建,即创建级联文件目录
- File file = getParentFile() 获取当前file的父亲file对象,如果没有父file对象则返回null
File file = new File("E:\\test\\Test.txt");
File parentFile = file.getParentFile();
while (parentFile!=null){
System.out.println(parentFile.toString());
parentFile = parentFile.getParentFile();
}
/**
* E:\test
* E:\
*/
- String pname = getParent() 获取当前file的父亲file名字
- File[] files = listFiles() 获取当前file的所有子对象,如果返回的数组对象值为null,则说明它是一个文件,如果不为null,则说明它是文件夹;如果返回的数组对象的length等于0,说明它是空文件夹,返回的数组的length即为它的子对象个数。
- String[] names = list() 获取当前file的所有子对象名字
- boolean = delete() 删除文件或空的文件夹,不能删除带元素的文件夹
- long = length() 获取文件中字节的个数
- long = lastModified()获取文件最后的修改时间—>毫秒值
File file = new File("E:\\test","Test.txt");
long length = file.lastModified();
Date date = new Date(length);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd kk:mm:ss");
String time = sdf.format(date);
System.out.println(time);//2020-04-21 08:46:47
- boolean = setLastModified(long time) :设置文件最后一次修改的时间
其他一些简单方法,见名即可知义:
- canRead()
- canWrite()
- isHidden()
- isFile()
- isDirectory()