1.File
file类是文件和目录路径名的抽象表示形式。
//1.创建文件夹,父文件夹不存在会自动创建
File filedir = new File("E:\\demo1\\demo2\\demo3");
System.out.println("mkdir:" + filedir.mkdirs());
//2.创建文件,目录不存在
File file = new File(filedir, "a.txt");
System.out.println("file:" + file.createNewFile());
//3.创建文件,目录已存在
File file2 = new File("E:\\demo1\\demo2\\demo3\\b.txt");
System.out.println("file:" + file2.createNewFile());
2. 过滤器功能
File[] listFiles(FilenameFilter filter)
public static void main(String[] args) throws IOException {
File file = new File("e:\\");
// 1.先获取所有的,在遍历的时候判断,再输出
// 2.先判断,再获取
File[] listFiles = file.listFiles(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
boolean condition = new File(dir,name).isFile() && name.endsWith(".jpg");
return condition;
}
});
for (File file2 : listFiles) {
System.out.println(file2.getName());
break;
}
}
3. IO流知识点
4. FileOutputStream写数据的的注意事项
a: 创建字节输出流对象做了几件事情?
- 调用系统功能去创建文件
- 创建fos对象
- 把fos对象指向这个文件
b: 为什么要close()?
- 让流对象变成垃圾,这样就可以被垃圾回收器回收了
- 通知系统去释放跟该文件相关的资源
c: 如何实现数据的换行?
- 在数据添加后写入换行符
- 换行符:windows:
\r\n
,linux:\n
,Mac:\r
d: 如何实现数据的追加写入?
- 创建一个向具有指定 name 的文件中写入数据的输出文件流。如果第二个参数为 true,则将字节写入文件末尾处,而不是写入文件开始处。
FileOutputStream fos = new FileOutputStream("test.txt", true);
5. 字节缓冲区流
BufferedOutputStream(OutputStream out)
通过定义数组的方式确实比以前一次读取一个字节的方式快很多,所以,看来有一个缓冲区还是非常好的。
为什么传递一个OutputStream对象呢?因为字节缓冲区流仅仅提供缓冲区,为高效而设计的。但是呢,真正的读写操作还得靠基本的流对象实现。
这种类被称为:缓冲区类(高效类)
- 写数据:BufferedOutputStream
- 读数据:BufferedInputStream
6.常见编码表
7.打印流
(1) 类型
字节流打印流 PrintStream
字符打印流 PrintWriter
(2)特点:
A:只操作目的地,不操作数据源
B:可以操作任意类型的数据
C:如果启用了自动刷新,在调用println()方法的时候,能够换行并刷新
PrintWriter(OutputStream out, boolean autoFlush)
D:可以直接操作文件(此时不能设置刷新)
PrintWriter(String fileName)
(3)复制文本文件
BufferedReader br = new BufferedReader(new FileReader("a.txt"));
PrintWriter pw = new PrintWriter(new FileWriter("b.txt"),true);
String line = null;
while((line=br.readLine())!=null) {
pw.println(line);
}
pw.close();
br.close();
8.序列化
(1)定义
序列化流:对象 —>流数据(ObjectOutputStream)
把对象按照流一样的方式存入文本文件或者在网络中传输。
反序列化流:流数据 —> 对象(ObjectInputStream)
把文本文件中的流对象数据或者网络中的流对象数据还原成对象。
(2)实现
// 写入序列化对象
private static void write() throws Exception {
// 创建序列化流对象
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("a.txt"));
Person p = new Person("小xiao", 18);
oos.writeObject(p);
oos.close();
}
// 读取序列化对象
private static void read() throws Exception {
// 创建反序列化流对象
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("a.txt"));
Object obj = ois.readObject();
ois.close();
System.out.println(obj);
}
(3)serialVersionUID的作用
看到类实现了序列化接口的时候,要想解决黄色警告线问题,就可以自动产生一个序列化id值。serialVersionUID固定以后,我们对类进行任何改动,它读取以前的数据是没有问题的。如果没有固定,那么修改类文件后就ID就会变化,无法读取以前存储的数据。
(4)transient关键字的作用
可用于声明不需要序列化的成员变量
// private int age;
private transient int age;