File
路径
相对路径
路径1:“a.txt”
 路径2:“abc\\a.txt”
绝对路径
路径1:“c:\\a.txt”
 路径2:“c:\\abc\\a.txt”
- File对象就表示一个路径,可以是文件的路径、也可以是文件夹的路径
- 这个路径可以是存在的,也允许是不存在的
| 方法名称 | 说明 | 
|---|---|
| public File(String pathname) | 根据文件路径创建文件对象 | 
| public File(String parent, String child) | 根据父路径名字符串和子路径名字符串创建文件对象 | 
| public File(File parent, String child) | 根据父路径名对应文件对象和子路径名字符串创建文件对象 | 
常见成员方法
判断、获取
| 方法名称 | 说明 | 
|---|---|
| public boolean isDirectory() | 判断此路径名表示的File是否为文件夹 | 
| public boolean isFile() | 判断此路径名表示的File是否为文件 | 
| public boolean exists() | 判断此路径名表示的File是否存在 | 
| public long length() | 返回文件的大小(字节数量) | 
| public String getAbsolutePath() | 返回文件的绝对路径 | 
| public String getPath() | 返回定义文件时使用的路径 | 
| public String getName() | 返回文件的名称,带后缀 | 
| public long lastModified() | 返回文件的最后修改时间(时间毫秒值) | 
创建、删除
| 方法名称 | 说明 | 
|---|---|
| public boolean createNewFile() | 创建一个新的空的文件 | 
| public boolean mkdir() | 创建单级文件夹 | 
| public boolean mkdirs() | 创建多级文件夹 | 
| public boolean delete() | 删除文件、空文件夹 | 
-  createNewFile 创建一个新的空的文件 -  细节1:如果当前路径表示的文件是不存在的,则创建成功,方法返回true 如果当前路径表示的文件是存在的,则创建失败,方法返回false 
-  细节2:如果父级路径是不存在的,那么方法会有异常IOException 
-  细节3:createNewFile方法创建的一定是文件,如果路径中不包含后缀名,则创建一个没有后缀的文件 
 
-  
-  mkdir make Directory,文件夹(目录) - 细节1:windows当中路径是唯一的,如果当前路径已经存在,则创建失败,返回false
- 细节2:mkdir方法只能创建单级文件夹,无法创建多级文件夹
 
-  mkdirs 创建多级文件夹 细节:既可以创建单级的,又可以创建多级的文件夹 
-  delete - 如果删除的是文件,则直接删除,不走回收站
- 如果删除的是空文件夹,则直接删除,不走回收站
- 如果删除的是有内容的文件夹,则删除失败
 
获取并遍历
| 方法名称 | 说明 | 
|---|---|
| public File[] listFiles() | 获取当前该路径下所有内容 | 
- 当调用者File表示的路径不存在时,返回null
- 当调用者File表示的路径是文件时,返回null
- 当调用者File表示的路径是一个空文件夹时,返回一个长度为0的数组
- 当调用者File表示的路径是一个有内容的文件夹时,将里面所有文件和文件夹的路径放在File数组中返回
- 当调用者File表示的路径是一个有隐藏文件的文件夹时,将里面所有文件和文件夹的路径放在File数组中返回,包含隐藏文件
- 当调用者File表示的路径是需要权限才能访问的文件夹时,返回null
| 方法名称 | 说明 | 
|---|---|
| public static File[] listRoots() | 列出可用的文件系统根 | 
| public String[] list() | 获取当前该路径下所有内容 | 
| public String[] list(FilenameFilter filter) | 利用文件名过滤器获取当前该路径下所有内容 | 
| public File[] listFiles() | 获取当前该路径下所有内容 | 
| public File[] listFiles(FileFilter filter) | 利用文件名过滤器获取当前该路径下所有内容 | 
| public File[] listFiles(FilenameFilter filter) | 利用文件名过滤器获取当前该路径下所有内容 | 
IO流
分类

纯文本文件:Windows自带的记事本打开能读懂
FileOutputStream
操作本地文件的字节输出流,可以把程序中的数据写到本地文件中。
一、构造方法
| 构造方法 | 描述 | 
|---|---|
| FileOutputStream(String name) | 使用指定的文件名创建一个 FileOutputStream对象。如果文件不存在,会创建一个新文件。 | 
| FileOutputStream(String name, boolean append) | 使用指定的文件名和 append标志创建FileOutputStream对象。如果append为true,字节将被写入文件末尾。 | 
| FileOutputStream(File file) | 使用指定的 File对象创建FileOutputStream对象。如果文件不存在,会创建一个新文件。 | 
| FileOutputStream(File file, boolean append) | 使用指定的 File对象和append标志创建FileOutputStream对象。如果append为true,字节将被写入文件末尾。 | 
| FileOutputStream(FileDescriptor fdObj) | 创建一个文件输出流以写入指定的文件描述符。 | 
二、书写步骤
- 创建字节输出流对象
- 写数据
- 释放资源
细节:
- 创建字节输出流对象
 细节1:参数是字符串表示的路径或者是File对象都是可以的
 细节2:如果文件不存在会创建一个新的文件,但是要保证父级路径是存在的。
 细节3:如果文件已经存在,则会清空文件
- 写数据
 细节:write方法的参数是整数,但是实际上写到本地文件中的是整数在ASCII上对应的字符
- 释放资源
 细节:每次使用完流之后都要释放资源
import java.io.FileOutputStream;
import java.io.IOException;public class Test {public static void main(String[] args) throws IOException {FileOutputStream fos = new FileOutputStream("..\\5.20\\a.txt");fos.write(97);fos.close();}
}
三、write用法
| 方法名称 | 说明 | 
|---|---|
| void write(int b) | 一次写一个字节数据 | 
| void write(byte[] b) | 一次写一个字节数组数据 | 
| void write(byte[] b, int off, int len) | 一次写一个字节数组的部分数据 | 
public class Test {public static void main(String[] args) throws IOException {FileOutputStream fos = new FileOutputStream("..\\5.20\\a.txt");String str = "abcd";byte[] bytes = str.getBytes();fos.write(bytes);fos.close();}
}
void write(byte[] b, int off, int len):
off:起始索引:字节数组b中的起始偏移量。表示从数组的哪个索引位置开始写入数据。(off必须是非负整数,且不能超过数组b的长度。)
len:写入字节数:这是要写入的字节数。从off位置开始,连续写入len个字节。
四、换行与续写
1.换行
 写出一个换行符即可
 windows:\r\n
 Linux:\n
 Mac:\r
在windows操作系统当中,java对回车换行进行了优化。
虽然完整的是\r\n,但是我们写其中一个\r或者\n,
java也可以实现换行,因为java在底层会补全。
2.续写
FileOutputStream(String name, boolean append)
FileOutputStream(File file, boolean append)
如果 append 为 true,字节将被写入文件末尾。
    FileOutputStream fos = new FileOutputStream("..\\5.20\\a.txt",true);
FileInputStream
操作本地文件的字节输入流,可以把本地文件中的数据读取到程序中来。
一、构造方法
| 构造方法 | 参数描述 | 
|---|---|
| FileInputStream(File file) | 要读取的文件对象。 | 
| FileInputStream(String name) | 要读取的文件的路径名。 | 
| FileInputStream(FileDescriptor fd) | 文件描述符对象,表示已打开的文件。 | 
二、书写步骤
- 创建字节输入流对象
- 读数据
- 释放资源
细节:
-  - 如果文件不存在,就直接报错。
 
-  - 一次读一个字节,读出来的是数据在ASCII上对应的数字
- 读到文件末尾了,read方法返回-1。
 
- 每次使用完流必须要释放资源。
三、循环读取
import java.io.FileInputStream;
import java.io.IOException;public class Demo {public static void main(String[] args) throws IOException {FileInputStream fis = new FileInputStream("..\\5.20\\a.txt");int b;while ((b = fis.read()) != -1) {System.out.print((char) b);}fis.close();}
}
四、read
| 方法名称 | 说明 | 
|---|---|
| public int read() | 一次读一个字节数据 | 
| public int read(byte[] buffer) | 一次读一个字节数组数据 | 

字符集
ASCII
存储英文,一个字节就足以
计算机的存储规则
- GB2312字符集:1980年发布,1981年5月1日实施的简体中文汉字编码国家标准。
 收录7445个图形字符,其中包括6763个简体汉字
- BIG5字符集:台湾地区繁体中文标准字符集,共收录13053个中文字,1984年实施。
- GBK字符集:2000年3月17日发布,收录21003个汉字
 包含国家标准GB13000-1中的全部中日韩汉字,和BIG5编码中的所有汉字。
- Unicode字符集:
 国际标准字符集,它将世界各种语言的每个字符定义一个唯一的编码,以满足跨语言、跨平台的文本信息转换。
系统显示:ANSI
windows系统默认使用的就是GBK。

为什么会有乱码
- 读取数据时未读完整个汉字
- 编码和解码时的方式不统一
编码和解码
Java中编码的方法
| String类中的方法 | 说明 | 
|---|---|
| public byte[] getBytes() | 使用默认方式进行编码 | 
| public byte[] getBytes(String charsetName) | 使用指定方式进行编码 | 
Java中解码的方法
| String类中的方法 | 说明 | 
|---|---|
| String(byte[] bytes) | 使用默认方式进行解码 | 
| String(byte[] bytes, String charsetName) | 使用指定方式进行解码 | 
UTF
UTF-8、UTF-16 和 UTF-32 是三种不同的字符编码方案,它们在存储字符时使用不同的字节长度:
- UTF-8: UTF-8 是一种变长编码方案,字符的存储长度可以是 1 到 4 个字节。在 UTF-8 中,常用的 ASCII 字符(0 到 127)使用单个字节存储,而其他字符则使用多个字节。通常情况下,UTF-8 编码的字节数如下: - 1 字节:ASCII 字符
- 2 字节:大多数欧洲语言的常用字符
- 3 字节:较少使用的非常见字符
- 4 字节:较少见的字符和符号
 
- UTF-16: UTF-16 使用固定长度的 2 个字节来存储大多数常见字符,但一些辅助字符需要使用额外的 2 个字节(总共 4 个字节)进行编码。这意味着大多数字符都占用 2 个字节,但一些罕见字符占用 4 个字节。
- UTF-32: UTF-32 使用固定长度的 4 个字节来表示每个字符,无论字符的编码大小。
字符流
字符流的底层其实就是字节流
字符流 = 字节流 + 字符集
特点:
- 输入流:一次读一个字节,遇到中文时,一次读多个字节
- 输出流:底层会把数据按照指定的编码方式进行编码,变成字节再写到文件中

FileReader
-  创建字符输入流对象 构造方法 说明 public FileReader(File file)创建字符输入流关联本地文件 public FileReader(String pathname)创建字符输入流关联本地文件 细节1:如果文件不存在,就直接报错 
-  读取数据 成员方法 说明 public int read()读取数据,读到末尾返回-1 public int read(char[] buffer)读取多个数据,读到末尾返回-1 细节1:按字节进行读取,遇到中文,一次读多个字节,读取后解码,返回一个整数 
 细节2:读到文件末尾了,read方法返回-1
-  释放资源 成员方法 说明 public int close()释放资源/关闭流 
| 构造方法 | 说明 | 
|---|---|
| public FileWriter(File file) | 创建字符输出流关联本地文件 | 
| public FileWriter(String pathname) | 创建字符输出流关联本地文件 | 
| public FileWriter(File file, boolean append) | 创建字符输出流关联本地文件,续写 | 
| public FileWriter(String pathname, boolean append) | 创建字符输出流关联本地文件,续写 | 
成员方法
| 成员方法 | 说明 | 
|---|---|
| void write(int c) | 写出一个字符 | 
| void write(String str) | 写出一个字符串 | 
| void write(String str, int off, int len) | 写出一个字符串的一部分 | 
| void write(char[] cbuf) | 写出一个字符数组 | 
| void write(char[] cbuf, int off, int len) | 写出字符数组的一部分 | 
- 创建字符输出流对象
 细节1:参数是字符串表示的路径或者File对象都是可以的
 细节2:如果文件不存在会创建一个新的文件,但是要保证父级路径是存在的
 细节3:如果文件已经存在,则会清空文件,如果不想清空可以打开续写开关
- 写数据
 细节:如果write方法的参数是整数,但是实际上写到本地文件中的是整数在字符集上对应的字符
- 释放资源
 细节:每次使用完流之后都要释放资源
字符流原理解析
- 创建字符输入流对象
 底层::联文件,并创建缓冲区(长度为8192的字节数)
- 读取数据
底层:
- 判断缓冲区中是否有数据可以读取
- 缓冲区没有数据:就从文件中获取数据,装到缓冲区中,每次尽可能装满缓冲区
 如果文件中也没有数据了,返回-1
- 缓冲区有数据:就从缓冲区中读取
 空参的read方法:一次读取一个字节,遇到中文一次读多个字节,把字节解码并转成十进制返回
 有参的read方法:把读取字节,解码,强转三步合并了,强转之后的字符放到数组中
已经到底啦!!