File类的常用方法
boolean | exists() 测试此抽象路径名表示的文件或目录是否存在。 |
boolean | isDirectory()` 测试此抽象路径名表示的文件是否为目录。 |
boolean | isFile() 测试此抽象路径名表示的文件是否为普通文件。 |
常用方法:
// 表示的文件或目录是否真的存在?
System.out.println(f1.exists());
// 判断是否表示的是文件?
System.out.println(f1.isFile());
// 判断是否表示的是目录?
System.out.println(f1.isDirectory());
// 获取文件或目录信息
// 获取文件名或目录名
System.out.println(f1.getName());
// 获取文件或目录的路径
System.out.println(f1.getPath());
// 获取文件或目录的可读、可写、可执行、是否是隐藏属性信息
System.out.println(f1.canRead());
System.out.println(f1.canWrite());
System.out.println(f1.canExecute());
System.out.println(f1.isHidden());
// 获取最后修改时间
System.out.println(new Date(f1.lastModified()));
// 获取内容的长度,单位是字节
System.out.println(f1.length());//返回文件中的数据大小
// 目录的遍历方法
// 获取当前目录包含的所有子目录名和文件名
String[] list = f1.list();
for (String s : list) {
System.out.println(s);
}
// 获取当前目录包含的所有子目录对象和文件对象
File[] files = f1.listFiles();
for (File file : files) {
System.out.println(file.getName());
}
新建和删除方法
File f5=new File("C:\\Users\\lx\\Desktop\\1.txt");
if(!f5.exists()){
// 在磁盘中创建这个文件
try {
f5.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
if(f5.exists()){
// 删除磁盘中的这个文件
f5.delete();
}
File f6=new File("C:\\Users\\lx\\Desktop\\a");
if(!f6.exists()){
// 在磁盘上创建目录
//f6.mkdir();
f6.mkdirs();
}
if(f6.exists()){
// 删除磁盘上的目录
f6.delete();
}
IO流
2、IO流的分类
(1)从传输方向,分为输入流和输出流。
输入流:负责读取数据。
输出流:负责写入数据。
(2)从处理单位,分为字节流和字符流。
字节流:按照字节为单位进行传输。
字符流:按照字符为单位进行传输。
(3)从功能上,分为节点流和高级流。
节点流:只有读写功能。
高级流:除了读写,还有其他功能的流。
字节流和字符流区别
(1)字节流以字节为单位进行读写,字符流是以字符为单位进行读写。
(2)字节流写操作立即执行,字符流写操作需要调用flush或close方法时才执行。
(3)字节流可以传输任何类型的数据(文本、图片、音频、视频==),字符流只能传输字符数据(文本)。
高级流
前面讲的这些字节流和字符流都是节点流,只有基本的读写功能。
高级流不仅能够读写,还有其他增强的功能。
高级流是建立在节点流的基础上创建。
先建节点流,然后创建高级流。
常用的高级流有: 转换流, 缓冲流,序列化流
缓冲流
默认缓冲区大小:8192字节。
使用缓冲流读写原理: 将读取的数据先临时存储在缓冲区;当缓冲区写满了,才会将缓冲区的数据写入目的端。
使用缓冲流的优点: 提高了IO效率,同时减少了对硬盘的损耗。
字节缓冲流
字节缓冲输入流:BufferedInputStream
字节缓冲输出流:BufferedOutputStream
序列化流
将对象转为字节码(二进制)的过程,我们称为对象的序列化。
将字节码转为对象的过程,我们称为对象的反序列化。
对象存储或者传输时,必须是二进制形式,所以要进行序列化操作。
StreamCorruptedException问题处理
每次写对象都会添加头部标记,导致读取对象时出现StreamCorruptedException。
解决:重写ObjectOutputStream的writeStreamHeader方法。只第一次添加对象时设置头部,后续不再设置。
序列化接口说明
在序列化和反序列化的时候,需要将对象转为Serializable类型,因此需要实体类实现Serializable接口。
序列化版本号:
private static final long serialVersionUID = 1L;
在反序列化的时候会比对版本,一致才能完成反序列化。否则报错,操作失败。