Java进阶,file类,IO流
一.File类
File类概述
- File类的对象代表操作系统的文件(文件、文件夹),File类在java.io.File包下。
- File类提供了诸如:创建文件对象代表文件,获取文件信息(大小、修改时间)、删除文件、创建文件(文件夹)等功能
1.创建File对象
File类创建对象
方法名称 | 说明 |
---|---|
public File(String pathname) | 根据文件路径创建文件对象 |
public File(String parent, String child) | 根据父路径名字符串和子路径名字符串创建文件对象 |
public File(File parent, String child) | 根据父路径对应文件对象和子路径名字符串创建文件对象 |
注意
- File对象可以定位文件和文件夹
- File封装的对象仅仅是一个路径名,这个路径可以是存在的,也可以是不存在的。
绝对路径和相对路径
-
绝对路径:从盘符开始 File file1 = new File(“D:\itheima\a.txt”);
-
相对路径:不带盘符,默认直接到当前工程下的目录寻找文件。 File file3 = new File(“模块名\a.txt”);
public class FileDemo1 {
public static void main(String[] args) {
//1.绝对路径创建一个文件对象
File f1 = new File("E:/demo/xaioren.jpg");
//a.获取它的绝对路径。
System.out.println(f1.getAbsolutePath());
//b.获取文件定义的时候使用的路径。
System.out.println(f1.getPath());
//c.获取文件的名称:带后缀
System.out.println(f1.getName());
//d.获取文件的大小:字节个数
System.out.println(f1.length());//字节大小
//e.获取文件的最后修改时间
long time = f1.lastModified();
System.out.println("最后修改的时间:" + new SimpleDateFormat("yyyy/MM/dd HH:mm:ss").format(time));
//f.判断文件是文件还是文件夹
System.out.println(f1.isFile());//true
System.out.println(f1.isDirectory());//false
}
}
2.常用方法:判断文件类型、获取文件信息
File类的判断文件类型、获取文件信息功能
方法名称 | 说明 |
---|---|
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() | 返回文件的最后修改时间(时间毫秒值) |
3.常用方法:创建文件、删除文件功能
File类创建文件的功能
方法名称 | 说明 |
---|---|
public boolean createNewFile() | 创建一个新的空的文件 |
public boolean mkdir() | 只能创建一级文件夹 |
public boolean mkdirs() | 可以创建多级文件夹 |
File类删除文件的功能
方法名称 | 说明 |
---|---|
public boolean delete() | 删除由此抽象路径名表示的文件或空文件夹 |
注意:delete方法默认只能删除文件和空文件夹,delete方法直接删除不走回收站
public class FileDemo2 {
public static void main(String[] args) throws IOException {
File f = new File("file-io-app/src/data.txt");
//a.创建新文件,创建成功返回true,反之,不需要这个,以后文件写出去的时候都会自动创建
System.out.println(f.createNewFile());
File f1 = new File("file-io-app/src/data1.txt");
System.out.println(f1.createNewFile());
//b.mkdir创建一级目录
File f2 = new File("E:/demo/aaa");
System.out.println(f2.mkdir());
//c.mkdirs创建多级目录
File f3 = new File("E:/demo/bbb/ccc/vvv");
System.out.println(f3.mkdirs());
//d.删除文件或者空文件夹
System.out.println(f1.delete());
//e.只能删除空文件夹,不能删除非空文件夹
File f4 = new File("E:/demo");
System.out.println(f4.delete());
}
}
4.常用方法:遍历文件夹
File类的遍历功能
方法名称 | 说明 |
---|---|
public String[] list() | 获取当前目录下所有的"一级文件名称"到一个字符串数组中去返回。 |
public File[] listFiles()(常用) | 获取当前目录下所有的"一级文件对象"到一个文件对象数组中去返回(重点) |
listFiles方法注意事项:
- 当文件不存在时或者代表文件时,返回null
- 当文件对象代表一个空文件夹时,返回一个长度为0的数组
- 当文件对象是一个有内容的文件夹时,将里面所有文件和文件夹的路径放在File数组中返回
- 当文件对象是一个有隐藏文件的文件夹时,将里面所有文件和文件夹的路径放在File数组中返回,包含隐藏文件
- 当没有权限访问该文件夹时,返回null
public class FileDemo3 {
public static void main(String[] args) {
//1.定位一个文件夹
File f1 = new File("E:/demo");
String[] names = f1.list();
for (String name : names) {
System.out.println(name);
}
//2.一级文件对象
File[] files = f1.listFiles();
for (File file : files) {
System.out.println(file.getAbsolutePath());
}
//注意事项
}
}
二.字符集
1.常见字符集介绍
字符集基础知识:
- 字符集(Character Set)是多个字符的集合,字符集种类较多,每个字符集包含的字符个数不同,常见字符集有:
ASCII字符集
GBK字符集
Unicode(UTF-8)字符集等。
- 英文和数字等在任何国家的字符集中都占1个字节
- GBK字符中一个中文字符占2个字节
- UTF-8编码中一个中文1般占3个字节
注意:编码前和编码后需要一致,否则会乱码
英文和数字不会
2.字符集的编码、解码操作
String编码
方法名称 | 说明 |
---|---|
byte[] getBytes() | 使用平台的默认字符集将该 String编码为一系列字节,将结果存储到新的字节数组中 |
byte[] getBytes(String charsetName) | 使用指定的字符集将该 String编码为一系列字节,将结果存储到新的字节数组中 |
String解码
构造器 | 说明 |
---|---|
String(byte[] bytes) | 通过使用平台的默认字符集解码指定的字节数组来构造新的 String |
String(byte[] bytes, String charsetName) | 通过指定的字符集解码指定的字节数组来构造新的 String |
三.IO流
1.概述
- I表示intput,把硬盘文件中的数据读入到内存的过程,称之输入,负责读。
- O表示output,把内存中的数据写出到硬盘文件的过程,称之输出,负责写。
总结流的四大类:
- 字节输入流:以内存为基准,来自磁盘文件/网络中的数据以字节的形式读入到内存中去的流称为字节输入流。
- 字节输出流:以内存为基准,把内存中的数据以字节写出到磁盘文件或者网络中去的流称为字节输出流。
- 字符输入流:以内存为基准,来自磁盘文件/网络中的数据以字符的形式读入到内存中去的流称为字符输入流。
- 字符输出流:以内存为基准,把内存中的数据以字符写出到磁盘文件或者网络介质中去的流称为字符输出流。
1.IO流的作用?
- 读写文件数据的
2.IO流是怎么划分的,大体分为几类,各自的作用?
- 字节输入流 InputStream(读字节数据的)
- 字节输出流 OutoutStream(写字节数据出去的)
- 字符输入流 Reader(读字符数据的)
- 字符输出流 Writer(写字符数据出去的)
2.字节流
1.字节输入流:每次读取一个字节,每次读取一个字节数组
文件字节输入流:FileInputStream
- 作用:以内存为基准,把磁盘文件中的数据以字节的形式读取到内存中去。
构造器 | 说明 |
---|---|
public FileInputStream(File file) | 创建字节输入流管道与源文件对象接通 |
public FileInputStream(String pathname) | 创建字节输入流管道与源文件路径接通 |
方法名称 | 说明 |
---|---|
public int read() | 每次读取一个字节返回,如果字节已经没有可读的返回-1 |
public int read(byte[] buffer) | 每次读取一个字节数组返回,如果字节已经没有可读的返回-1 |
1.使用字节流读取中文输出乱码,如何使用字节输入流读取中文输出不乱码呢?
- 定义一个与文件一样大的字节数组,一次性读取完文件的全部字节。
2.直接把文件数据全部读取到一个字节数组可以避免乱码,是否存在问题?
- 如果文件过大,字节数组可能引起内存溢出。
2.字节输入流:读取文件的全部字节
方式一
- 自己定义一个字节数组与文件的大小一样大,然后使用读取字节数组的方法,一次性读取完成。
方法名称 | 说明 |
---|---|
public int read(byte[] buffer) | 每次读取一个字节数组返回,如果字节已经没有可读的返回-1 |
方式二
- 官方为字节输入流InputStream提供了如下API可以直接把文件的全部数据读取到一个字节数组中
方法名称 | 说明 |
---|---|
public byte[] readAllBytes() throws IOException | 直接将当前字节输入流对应的文件对象的字节数据装到一个字节数组返回 |
1.如何使用字节输入流读取中文内容输出不乱码呢?
- 一次性读取完全部字节。
- 可以定义与文件一样大的字节数组读取,也可以使用官方API.
2.直接把文件数据全部读取到一个字节数组可以避免乱码,是否存在问题?
- 如果文件过大,定义的字节数组可能引起内存溢出。
3.字节输出流:写字节数据到文件
文件字节输出流:FileOutputStream
- 作用:以内存为基准,把内存中的数据以字节的形式写出到磁盘文件中去的流。
构造器 | 说明 |
---|---|
public FileOutputStream(File file) | 创建字节输出流管道与源文件对象接通 |
public FileOutputStream(File file,boolean append) | 创建字节输出流管道与源文件对象接通,可追加数据 |
public FileOutputStream(String filepath) | 创建字节输出流管道与源文件路径接通 |
public FileOutputStream(String filepath,boolean append) | 创建字节输出流管道与源文件路径接通,可追加数据 |
文件字节输出流(FileOutputStream)写数据出去的API
方法名称 | 说明 |
---|---|
public void write(int a) | 写一个字节出去 |
public void write(byte[] buffer) | 写一个字节数组出去 |
public void write(byte[] buffer , int pos , int len) | 写一个字节数组的一部分出去。 |
流的关闭与刷新
方法 | 说明 |
---|---|
flush() | 刷新流,还可以继续写数据 |
close() | 关闭流,释放资源,但是在关闭之前会先刷新流。一旦关闭,就不能再写数据 |
1.字节输出流如何实现写出去的数据能换行
- os.write(“\r\n”.getBytes())
3.IO流:资源释放的方式
1.try-catch-finally
- finally:放在try-catch后面的,无论是正常执行还是异常执行代码,最后一定要执行,除非JVM退出。
- 作用:一般用于进行最后的资源释放操作(专业级做法)
格式:
try {
FileOutputStream fos = new FileOutputStream(“a.txt”);
fos.write(97);
} catch (IOException e) {
e.printStackTrace();
} finally{}
2.try-with-resource
- 自动释放资源、代码简洁