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方法:把读取字节,解码,强转三步合并了,强转之后的字符放到数组中
已经到底啦!!