狭义的文件:
存储在硬盘上的数据,以文件为单位,进行组织;文件夹也叫做"目录",也是一种特殊的文件(文件里存储的也是文件)
这章笔记的内容都是指狭义的文件
广义的文件:
操作系统负责管理软硬件资源,操作系统往往会把这些资源统一抽象成文件进行管理-----"一切皆文件"
比如,有一个网卡,就把这个网卡抽象成一个"文件",创建了特殊的文件来表示网卡;从网卡接收数据,就读取这个文件,往网卡发送数据,就写这个文件
再比如,有一个键盘,想从键盘种读取数据,也是将键盘抽象成一个"文件"(stdin),读这个文件就能读取到用户输入的内容了
绝对路径是指目录下的绝对位置,直接到达目标位置,通常是从盘符开始的路径,完整的描述文件位置的路径就是绝对路径
路径之间使用\(反斜杠)分隔,当然/(斜杠)也可以,一般推荐使用/(斜杠)来分隔
相对路径首先需要一个"基准路径"(现在的位置),以基准路径为起点,往下继续走直到到达目标路径的表示方式
我们知道 I/O 的速度是很慢的,所以,大多的 OutputStream 为了减少设备操作的次数,在写数据的时候都会将数据先暂时写入内存的一个指定区域里,直到该区域满了或者其他指定条件时才真正将数据写入设备中,这个区域一般称为缓冲区
但造成一个结果,就是我们写的数据,很可能会遗留一部分在缓冲区中。需要在最后或者合适的位置,调用 flush(刷新)操作,将数据刷到设备中
文件操作是属于操作系统层面提供的一些API,不同的操作系统提供的API是不一样的,JAVA作为一个跨平台语言,为了统一代码,就在JVM中把不同系统的文件操作API进行了封装
构造File对象:
File 对象名 = new File("路径");
根据文件路径创建一个新的 File 实例,路径可以是绝对路径或者相对路径
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 对象,删除该文件 |
String[] | list() | 返回 File 对象代表的目录下的所有文件名 |
File[] | listFiles() | 返回 File 对象代表的目录下的所有文件,以 File 对象表示 |
boolean | mkdir() | 创建 File 对象代表的单层目录 |
boolean | mkdirs() | 创建 File 对象代表的多层目录 |
boolean | renameTo(File dest) | 传递一个File对象,进行文件改名 |
boolean | canRead() | 判断用户是否对文件有可读权限 |
boolean | canWrite() | 判断用户是否对文件有可写权限 |
数据文件被分为文本文件或者二进制文件
数据在内存中以二进制的形式存储,如果不加转换的输出到硬盘,就是二进制文件
如果要求在硬盘上以ASCII码的形式存储,则需要在存储前转换。以ASCII字符的形式存储的文件就是文本文件
把硬盘上的数据往内存上面写就是输入
把内存上的数据往硬盘上面写就是输出
文件内容的读写也叫做"流"(stream),计算机中的流其实是一种信息的转换,把文件内容的读写操作比喻成水流
java标准库在"流"的概念上,提供了一组类,完成文件内容的读写操作
读写文件分为两种:一种是字节流(按字节读和写),一种是字符流(按字符读和写)
InputStream和OutputStream是字节流的,Reader和Writer是字符流的,Scanner和PrintWriter也是字符流的
打开文件以后一定要记得close()文件,不然会出现文件资源泄露的情况!!!
InputStream:
读数据,把数据从硬盘读到内存中,InputStream 只是一个抽象类,要使用还需要具体的实现类,使用FileInputStream
修饰符及返回值类型 | 方法名 | 说明 |
---|---|---|
int | read() | 读取一个字节的数据,返回 -1 代表已经完全读完了 |
int | read(byte[] b) | 最多读取 b.length 字节的数据到 b 中,返回实际读到的数量;-1 代表以及读完了 |
int | read(byte[] b, int off, int len) | b数组从 off 开始的位置读,读len个字节,返回实际读到的数量;-1 代表以及读完了 |
void | close() | 关闭字节流 |
FileInputStream:
InputStream的具体实现类
方法名 | 说明 |
---|---|
FileInputStream(File file) | 利用 File 构造文件输入流 |
FileInputStream(String name) | 利用文件路径构造文件输入流 |
OutputStream:
写数据,把数据从内存写入到硬盘中,OutputStream只是一个抽象类,要使用还需要具体的实现类,使用FileOutputStream
使用OutputStream写文件的时候,只要打开文件成功,就会把文件原有内容清空
修饰符及返回值类型 | 方法名 | 说明 |
---|---|---|
void | write(int b) | 写入一个字节的数据 |
void | write(byte[] b) | 将 b 这个字节数组中的数据全部写入到文件中 |
int | write(byte[] b, int off, int len) | 将 b 这个字节数组中从 off 开始的数据写入到文件中,一共写 len 个,返回实际写的数量;-1 代表以及写完了 |
void | close() | 关闭字节流 |
void | flush() | 重要:我们知道 I/O 的速度是很慢的,所以,大多的 OutputStream 为了减少设备操作的次数,在写数据的时候都会将数据先暂时写入内存的一个指定区域里,直到该区域满了或者其他指定条件时才真正将数据写入设备中,这个区域一般称为缓冲区。但造成一个结果,就是我们写的数据,很可能会遗留一部分在缓冲区中。需要在最后或者合适的位置,调用 flush(刷新)操作,将数据刷到设备中。 |
FileOutputStream:
OutputStream的具体实现类
方法名 | 说明 |
---|---|
FileOutputStream(File file) | 利用 File 构造文件输出流 |
FileOutputStream(String name) | 利用文件路径构造文件输出流 |
Reader:
读数据,把数据从硬盘读到内存中,Reader 只是一个抽象类,要使用还需要具体的实现类,使用FileReader
修饰符及返回值类型 | 方法名 | 说明 |
---|---|---|
int | read() | 读取一个字符的数据,返回 -1 代表已经完全读完了 |
int | read(char[] b) | 最多读取 b.length 字符的数据到 b 中,返回实际读到的数量;-1 代表以及读完了 |
int | read(char[] b, int off, int len) | b数组从 off 开始的位置读,读len个字符,返回实际读到的数量;-1 代表以及读完了 |
void | close() | 关闭字符流 |
FileReader:
Reader的具体实现类
方法名 | 说明 |
---|---|
FileReader(File file) | 利用 File 构造文件输入流 |
FileReader(String name) | 利用文件路径构造文件输入流 |
Writer:
写数据,把数据从内存写入到硬盘中,Writer只是一个抽象类,要使用还需要具体的实现类,使用FileWriter
修饰符及返回值类型 | 方法名 | 说明 |
---|---|---|
void | write(int b) | 写入一个字符的数据 |
void | write(char[] b) | 将 b 这个字符数组中的数据全部写入到文件中 |
void | write(String b) | 写入b字符串数据 |
int | write(char[] b, int off, int len) | 将 b 这个字符数组中从 off 开始的数据写入到文件中,一共写 len 个,返回实际写的数量;-1 代表以及写完了 |
int | write(String[] b,int off,int len) | 将b字符串从off开始的数据写入到文件中,一共写len个,返回实际写的数量;-1 代表以及写完了 |
void | close() | 关闭字符流 |
void | flush() | 重要:我们知道 I/O 的速度是很慢的,所以,大多的 OutputStream 为了减少设备操作的次数,在写数据的时候都会将数据先暂时写入内存的一个指定区域里,直到该区域满了或者其他指定条件时才真正将数据写入设备中,这个区域一般称为缓冲区。但造成一个结果,就是我们写的数据,很可能会遗留一部分在缓冲区中。需要在最后或者合适的位置,调用 flush(刷新)操作,将数据刷到设备中。 |
FileWriter:
Writer的具体实现类
方法名 | 说明 |
---|---|
FileWriter(File file) | 利用 File 构造文件输出流 |
FileWriter(String name) | 利用文件路径构造文件输出流 |
Scanner:
可以使用Scanner传入一个输入字节流来简化开发,Scanner是字符流的
Scanner 名字 = new Scanner(输入字节流);
PrintWriter:
可以使用PrintWriter传入一个输出字节流来简化开发,PrintWriter是字符流的
PrintWriter 名字 = new PrintWriter(输出字节流);