一、File-文件操作:
1.作用:File用于表示文件或目录,不能对文件的内容进行访问;
2.知识点结构图:
3.部分难点示例:
a.listFiles()方法:
File dir = new File(".");
File[] subs = dir.listFiles();
for (File file : subs) {
System.out.println(file.getName());
}
b.FileFilter()方法:
File dir = new File(".");
File[] subs = dir.listFiles(new FileFilter() {
@Override
public boolean accept(File file) {
return file.getName().endsWith(".txt");
}
});
for (File file : subs) {
System.out.println(file);
}
二、RandomAccessFile:
1.作用:Java提供了一个可以对文件随机访问的操作,包括读和写操作,该类名为RandomAccessFile。该类的读写是基于指针的操作;
2.知识点结构图:
三、基本IO操作:
1.总结分类:
a.输入:读取数据;
b.输出:写出数据;
c.节点流(低级流):可以从或向一个特定的方向(节点)读写数据;
d.处理流(高级流/过滤流):是对一个已存在的流的连接和封装,通过所封装的流的功能调用实现数据读写;
e.InputStream:是所有字节输入流的父类,其定义了基本的读取read方法;
f.OutputStream:是所有字节输出流的父类,其定义了基本的写出write方法;
g.处理流的构造方法总是要带一个其他的流对象做参数。一个流对象经过其他流的多次包装,称为流的链接;
2.文件流:
a.FileOutputStream:是文件的字节输出流,使用该流可以以字节为单位将数据写入文件;
b.FileInputStream:是文件的字节输入流,使用该流可以以字节为单位从文件中读取数据;
c.默认情况下,FOS写入操作会将文件中原有数据全部清除;
d.实现文件的复制操作案例:
FileInputStream fis = new FileInputStream("yx.txt");
FileOutputStream fos = new FileOutputStream("yx_copy.txt");
int len = -1;
byte[] buf = new byte[32];
while((len = fis.read(buf))!=-1) {
fos.write(buf, 0, len);
}
fis.close();
fos.close();
3.缓冲流:
a.BufferedOutputStream:缓冲输出流内部维护一个缓冲区,当缓冲区满时,一次性全部写出;
b.BufferedInputStream:是缓冲字节输入流,内部维护一个缓冲区(字节数组);
c.void flush():清空缓冲区,将缓冲区中的数据强制写出;
d.实现基于缓存区的文件复制案例:
FileInputStream fis = new FileInputStream("fos.dat");
BufferedInputStream bis = new BufferedInputStream(fis);
FileOutputStream fos = new FileOutputStream("fos_copy.dat");
BufferedOutputStream bos = new BufferedOutputStream(fos);
int d = -1;
while((d = bis.read())!= -1) {
bos.write(d);
}
System.out.println("复制完毕");
bis.close();
bos.close();
4.对象流:
a.对象序列化概念:有时要把对象保存在硬盘上,又有时我们需要将对象传输到另一台计算机上等等这样的操作;
b.ObjectOutputStream:是用来对对像进行序列化的输出流;
c.实现对象序列化的方法为:void writeObject(Object obj)。该方法可以将给定的对象转换为一个字节序列后写出;
d.ObjectInputStream:是用来对对象进行反序列化的输入流;
e.实现对象反序列化的方法为:Object readObject()。该方法可以从流中读取字节并转换为对应的对象;
f.Serializable接口:实现该接口不需要重写任何方法。其只是作为可序列化的标志;
g.serialVersionUID:通常实现该接口的类需要提供一个常量serialVersionUID,表明该类版本;
h.transient关键字:有时在对一个对象进行序列化时可以忽略某些不必要的属性,从而对序列化后得到的字节序列“瘦身”。被修饰的属性在序列化时其值被忽略;
补充:
a.序列化流程图:
b.案例实现序列化:
FileOutputStream fos = new FileOutputStream("emp.obj");
ObjectOutputStream oos = new ObjectOutputStream(fos);
Emp emp = new Emp("张山", 18, "男", 3000);
oos.writeObject(emp);
System.out.println("序列化完成");
oos.close();
c.案例实现反序列化:
FileInputStream fis = new FileInputStream("emp.obj");
ObjectInputStream ois = new ObjectInputStream(fis);
Emp emp = (Emp) ois.readObject();
System.out.println("反序列化完成");
System.out.println(emp);
ois.close();
5.基本IO操作知识结构图: