一,文件
1.1 File类的概述
File类定义
1.File类主要是JAVA为文件这块的操作(如删除、新增等)而设计的相关类。
2.File类的包名是java.io,其实现了Serializable, Comparable两大接口以便于其对象可序列化和比较。
3.File类是文件和目录路径名的抽象表示,主要用于文件和目录的创建、查找和删除等操作。File 类的实例是不可变的;也就是说,一旦创建,File 对象表示的抽象路径名将永不改变。
4.File类代表一个特定的文件或者目录(文件夹),并提供了若干方法对该文件或目录进行操作。
1.2 File类的构造函数
-
new File(String path)
public class Test2{
public static void main(String[] args){
File file=new File(“xxx”);
System.out.println(file.getPath()); //路径结果就是xxx
}
} -
new File(String parent,String child)
public class Test2{
/*
若子路径child为Null,会抛出NullPointerException空异常错误
当父路径为Null时,会以子路径child作为绝对路径创建实例,等同于调用第一个File(String child )效果一样
*/
public static void main(String[] args){
String parent=null;
File file=new File(parent,“xxx”);
System.out.println(file.getPath()); //路径结果就是xxx
}
} -
new File(File parent,String child)
public class Test2{
public static void main(String[] args){
String parent = “E:/test”;
File parentFile= new File(parent);
String child = “E:/test/1.txt”;
File file = new File(parentFile, child);
System.out.println(file.getPath()); // 路径结果就是E:\test\E:\test\1.txt
}
}
1.3 File类的常用方法
创建删除
- createNewFile() //创建指定文件
- mkdir() //创建指定文件夹
- mkdirs() //能够创建多层文件夹
- delete() //删除指定文件/文件夹对象
- deleteOnExit() //当java虚拟机对此进程结束运行时,才执行此条语句,即删除指令
判断
- isFile() 判断是否是文件
- isDirectory() 判断是否是文件夹
- exists() 判断文件/文件夹是否存在
- isAbsolute():判断当前文件对象指向的文件是否是绝对地址的,
绝对路径:从盘符开始、
相对路径:相对与项目的根目录开始 - canRead() 如果指定的文件存在的路径名和文件允许应用程序读取,此方法返回布尔值true。
- canWrite() 是否可以写入由抽象路径名表示的文件。如果存在抽象文件路径并且允许应用程序写入文件,则该函数返回true。
注:判断是否是文件或者文件夹,如果不存在都返回false
获取
-
length():返回文件大小,单位是字节,空文件夹则是0
-
getParent():获取父目录的绝对路径
-
getParentFile():返回父目录的对象
-
getPath():获取this在创建时所传入的路径
-
getAbsolutePath():获取绝对路径
File file = new File(“a.txt”);
System.out.println(file.getPath());
System.out.println(file.getAbsolutePath());/* 输出结果: a.txt E:\2023_project\a.txt */
-
getAbsoluteFile():返回以此路径所创建出的File对象
-
getName():获取文件/文件夹名
文件的遍历:
- list():返回指定目录中所有文件、文件夹的名字组成的字符串数组
- listFiles():返回指定目录中所有文件、文件夹对象组成的数组
File f2 = new File(“C:\mine\下载\迅雷”);
File[] files = f2.listFiles();
for(File file : files){
System.out.println(file);
} - list(FilenameFilter filter):返回指定目录中符合要求的所有文件、文件夹的名字组成的字符串数组
- listFiles(FilenameFilter filter):返回指定目录中符合要求的所有文件、文件夹对象组成的数组
File f = new File(“C:\Users\86151\Desktop\Java2106\笔记”);
File[] files = f.listFiles(new FilenameFilter(){
/*
参数:
1.dir:当前遍历的文件夹对象
2.name:当前文件夹中所有文件/文件夹的名字
*/
@Override
public boolean accept(File dir, String name) {
File f = new File(dir,name);
long len = f.length() / 1024;
return len >= 10 && len <= 15;
}
});
System.out.println(files.length);
for(File file : files ){
System.out.println(file);
} - listFiles(FileFilter filter):返回指定目录中符合要求的所有文件、文件夹对象组成的数组
File f = new File(“C:\Users\86151\Desktop\Java2106\笔记”);
File[] files = f.listFiles(new FileFilter(){
// 参数f:当前目录下文件/文件夹的文件对象
@Override
public boolean accept(File f) {
return f.isFile() && f.length() // 1024 < 10;
}
});
System.out.println(files.length);
for(File file : files){
System.out.println(file);
}
递归:一个方法直接或间接的调用自身
核心思想:把一个大型复杂的问题转换成一个与原问题相似规模较小的问题
好处:大大地减少了程序的代码量
弊端:资源消耗较大,效率较低
// 文件的递归,获取指定目录下的所有文件
public void searchFile(File dir){
File[] files = dir.listFiles();
for(File file : files){
if(file.isFile()){
System.out.println(file);
}else{
searchFile(file);
}
}
}
二,IO流
2.1 概念
IO流:我们将数据的传递看成数据的流动,使用i(input)表示输入,使用o(output)表示输出来描述数据的流向
IO流的分类:
- 根据流向
- 输入流:外部 -> 内存
- 输出流 :内存 -> 外部
- 根据文件类型
- 字节流:操作任何类型的文件
- 字符流:操作文本文件
IO流的四个顶层父类:都是抽象类
- 字节输入流:InputStream
- 字节输出流:OutputStream
- 字符输入流:Reader
- 字符输出流:Writer
2.2 FileOutputStream 文件字节输出流
构造函数:
- new FileOutputStream(String path)
- new FileOutputStream(String path,boolean append) //后面的booean值表示是否可追加值
- new FileOutputStream(File f)
- new FileOutputStream(File ,boolean append)
注:如果使用的构造函数没有boolean参数或者boolean参数是false,都会重新创建出这个文件,如果使用的构造函数中的boolean参数是true,那么不会重新创建出这个文件
常用方法:
- write(int b)
- write(byte[] b)322
- write(byte[] b,int offset ,int len)
- flush():将缓冲区中的内容刷新到目标地址中
- close():释放资源
注:
- close()也会将缓冲区中的内容刷新到目标地址,但是它与flush()的区别是,flush()只是将缓冲区中的内容刷新到目标地址中,流的资源并没有释放,所以在flush()之后可以继续使用流;close()方法还释放了所有流的资源,所在在close()之后不能在继续使用流,继续使用流会发生IOException;
- 字节流不需要手动调用flush(),因为字节流会自动将内容刷新到目标地址
2.3 FileInputStream 文件字节输入流
构造函数
- new FileInputStream(String path)
- new FileInputStream(File f)
常用方法:
-
read():读取一个字符,返回该字符对应的十进制数,返回-1表示读完了
FileInputStream fis1 = new FileInputStream(“C:\Users\Administrator\Desktop\0406\演示用\a.txt”);
int t;
String s = “”;
while((t = fis1.read()) != -1){
s += (char)t;
}
System.out.println(s); -
read(byte[] b):读取若干字符,将读取到的字符对应的十进制数保存在字节数组中,返回读取到的有效个数,返回-1表示读完了
-
read(byte[] b,int off,int len)
FileInputStream fis = new FileInputStream(“C:\Users\Administrator\Desktop\0406\演示用\b.txt”);
byte[] bs = new byte[6];
int len;
String s = “”;
while((len = fis.read(bs)) != -1){
s += new String(bs,0,len);
}
System.out.println(s); -
close():释放资源
文件的剪切
public static void cut() throws Exception{
String orginal = “E:\软件\八爪鱼\Octopus Setup 8.5.1 - 副本.exe”;
File f = new File(orginal);String target = “C:\Users\Administrator\Desktop\0407\测试\八爪鱼.exe”;
FileOutputStream fos = new FileOutputStream(target);
FileInputStream fis = new FileInputStream(orginal);byte[] bs = new byte[1024 * 1024];
int len = 0;
while((len = fis.read(bs)) != -1){
fos.write(bs,0,len);
}
f.deleteOnExit();//无论在释放资源前后执行此条语句,删除功能照常进行
//f.delet();在释放资源前执行此条语句,功能不生效
fis.close();
fos.close();
}
2.4 FileWriter 文件字符输出流
构造函数
- new FileWriter(File f)
- new FileWriter(File f,boolean append)
- new FileWriter(String path)
- new FileWriter(String path,boolean append)
常用方法
- write(String s)
- write(char[] chs)
- write(char[] chs,int off,int len)
- write(String s,int off,int len)
- write(int c)
- close():释放资源
- flush():使用字符流在输出时,会将数据先写到缓冲区中,我们需要调用flush()方法,才能将缓冲区中的数据刷新到目标地址
注:flush()和close()都可以刷新缓冲区,区别是flush()之后流还可以继续使用,close()之后不能再使用这个流
2.5 FileReader 文件字符输入流
构造函数
- new FileReader(File f)
- new FileReader(String path)
常用方法
-
read():读取一个字符,返回该字符对应的十进制数,返回-1表示读完了
FileInputStream fis1 = new FileInputStream(“C:\Users\Administrator\Desktop\0406\演示用\a.txt”);
int t;
String s = “”;
while((t = fis1.read()) != -1){
s += (char)t;
}
System.out.println(s); -
read(char[] chs):读取若干字符,将读取到的字符对应的十进制数保存在字节数组中,返回读取到的有效个数,返回-1表示读完了
FileInputStream fis = new FileInputStream(“C:\Users\Administrator\Desktop\0406\演示用\b.txt”);
byte[] bs = new byte[6];
int len;
String s = “”;
while((len = fis.read(bs)) != -1){
s += new String(bs,0,len);
}
System.out.println(s); -
read(char[] chs,int off,int len)
2.6 缓冲流
也称为高效流,它是对四个文件流的加强,它的读写速度更快
- BufferedOutputStream:字节缓冲输出流
- 常用方法:同 FileOutputStream
- BufferedInputStream:字节缓冲输入流
- 常用方法:同 FileInputStream
- BufferedReader:字符缓冲输入流
- 常用方法:同 FileReader
- 特有方法:readLine():读取一行
- BufferedWriter:字符缓冲输出流
- 常用方法:同 FileWriter
- 特有方法:newLine():换行
构造函数
- new BufferedOutputStream(OutputStream os)
- new BufferedInputStream(InputStream is)
- new BufferedReader(Reader r)
- new BufferedWriter(Writer w)
2.7 对象流
在Java中允许将一个对象存储到文件中,也可以将一个文件中的对象解析到程序中,这种操作就要使用对象流来完成。
序列化:将一个对象存储到文件中
反序列化:将一个文件中的对象解析到程序中
注:
- 要被序列化的对象所在的类,必须实现序列化接口Serializable,该接口中没有任何方法,因为它是一个标志型的接口,标志当前的类允许被序列化
- 序列化前后的类必须保证没有变化
ObjectOutputStream
构造函数:new ObjectOutputStream(OutputStream os)
ObjectInputStream
构造函数:new ObjectInputStream(InputStream is)
FileOutputStream fos = new FileOutputStream("C:\\Users\\Administrator\\Desktop\\0407\\stu.txt");
Stu s = new Stu("zs",20);
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(s);
FileInputStream fis = new FileInputStream("C:\\Users\\Administrator\\Desktop\\0407\\stu.txt");
ObjectInputStream ois = new ObjectInputStream(fis);
Stu o = (Stu)ois.readObject();
System.out.println(o.toString());
关键字:transient短暂的、瞬间的、瞬时的、瞬态的,在对象被序列化时,被transient修改的属性,不会被序列化
2.8 Properties 属性集
它本质上是一个Map,元素是以键值对的方式进行存储的,但是它的键和值只能是字符串类型的。
Properties用于编写配置文件
Properties文件编写的注意点:
- 每条配置信息必须独占一行
- 每条配置信息的都要由键和值组成
- 键值对的格式如下:
key=value
key:value
key value
构造函数:new Properties()
常用方法:
- load(Reader r)
- load(InputStream is)
- getProperty(String key)