1.File类的使用
1.1构造一个File文件。
构造方法2,就是在父路径下,造一个子路径。
IDEA里面相对路径在module。


分隔符,在java层面单杠有转义字符的作用。这里用双杠。不同系统下有不同的写法。

第二行调用separator后,用加号就能相连接。

1.2File类里的方法。

main方法里的路径,是在project里找的。module在project里面。
单元测试里面是直接测的module里的文件。 

![]()
获得毫秒数的文件包进Date,可以看看现在的时间。
后面两个方法就是获取
这个目录下的子目录或者这个目录下的文件。

JavaSenior目录下的目录,挨个放进字符串数组。要求这个JavaSenior存在,不然报错

这个用的File数组装的。


输出出来,是一个完整的路径。
renameTo,改名加移动,把file1移动到file2的位置,并且改成file2的名字。
file2是不存在的。(即是预定格式)。

对文件的几个判定方法。

第一个是判断是否是文件目录,可以用于遍历所有文件目录以及其子目录。(递归)

如何获得一个文件的大小?
对于目录,不能直接file.length。记录一个变量,递归的时候,把所有文件的大小记录。
删除目录,只能删一个空目录,IO4,里不能有子目录和子文件。
如果想要,删除这个目录和它所有的子目录和文件呢?


获得上层路径即可。

2.IO流的原理以及分类。


节点流,直接作用在文件上。
处理流,作用在节点流上的流。



2.1读数据
步骤

4.还有流的关闭。
读一个内容为helloword,的txt文件。
总结:一共三个read
1.无参read,一次读一个,读完一个指针往下一个。
2.read(数组),一次读一个数组。
3.read(数组,数组起始位,,数组终止位)。左开右闭。

read方法,相当于读完一个指针下移。、
流必须手动进行关闭。

JVM无能为力。
alt shift Z快捷加上try catch finally
在read的时候,如果阻塞,这个数据读不过来,直接抛出异常,但是没能在执行到
close();关闭流这一步。
对流进行操作的时候,必须要有try catch finally ,保证流资源一定可以关闭。

用一个read的重载方法,,每次输出一个字符数组。
len是每次读入这个数组里字符的个数。
遍历的时候不能用数组的长度,应该用这次读入的个数,因为字符数组的赋值是覆盖的,可能有上一轮的值在里面。

方式二也错,因为这样还是把字符数组里面的值全取出来了。

这个重载的方法也行。左开右闭。

2.2写数据到硬盘的文件里
一个简单的例子

False的意思是不在原有的数据上添加,是直接重写,覆盖原文件。
如果是true,在现有文件内容的基础上再加。
结果为

写和读同时存在,如何关闭。try catch就是处理了这个异常。还会接着往下走。两个都能关。

2.3复制文件

文本文件也可以用字节流复制,但不能在控制台读,文件里是可以实现复制的。
2.3.1复制字符文件(txt)
字符流,读取的单位是字符。

4.资源的关闭。
2.3.2图片的复制
这俩类对字节处理。
处理字符的类不能用来处理字节。
处理字节的可以对字符文件txt进行复制(如果里面都是英文和数字)。UTF-8,兼容ascii码。
但不能有中文。

数组换成Byte数组即可。
2.4对指定路径下文件的复制。
写个copy方法即可。

2.5缓冲流
相当于在内存里自己开了个缓冲区。先把文件一次读到缓冲区,然后,对缓冲区进行操作。
中间定义个小数组进行中转操作。
对左边的流进行包装。
作用:提高文件读写效率。
读用bis,写用bos指针。
资源关闭关四个,先关外层,再关内层。
关外层的时候,内层顺便也关闭了。所以内层两个不用关。


比较这个方法快的Test,写一个缓冲流复制文件的方法。

BufferReader和BufferWriter
传统读写方法。

readline,有就读,没有就是null。

2.6图片加密操作。

2.7获取文本上每个字符出现的次数。

存进map的步骤。

将map里的东西写出来的步骤。

3.转换流(字符集GBK,UTF-8,Unicode)


fis 是输入的字节流。
操作后isr就转成了字符流。
这俩编码都兼容ASCII码,所以读英文和数字不会乱码。
GBK,可能是一个字节表示一个字符,也可能是两个字节表示一个字符。
如何区分?
看首位,首位如果是0,则表明这个字符只有一个字节。
是1,则...两个字节表示一个字符。

Unicode,每个字符两个字节

Unicode转UTF-8,给unicode的二进制表达,塞进UTF-8编码格式里。
4.标准的输入输出流(了解)
IDEA里面不支持在控制台system in 写数据。
4.1输入
4.1.1输入写法1
题目1:输入字符串读到e或者exit就退出。

记得关闭br。readline,按了回车之后a接受这一行的数据。
题目2:读个各种类型的数据。比如int 或者double。
4.1.2输入写法2
用Scanner。读String 调用next(),读Int,用nextInt。

5.打印流(了解)

Setout的作用是,本应该打印到控制台的数据,打印在一个新 的文件里。
6.数据流(了解)
6.1写到文件里,按类型写。

写完就flush更新。
6.2从文件中按类型读出数据。
按写的顺序读

7.对象流(网络编程)
把对象写入数据源。
对象是可序列化,才能存到文件里,也可以通过网络传承对象。
那这个对象属于的类一定是可序列化。
图中例子是String 类,是可序列化的。


7.1用objectOutputStream实现序列化
黑线的地方,写要序列化的对象存在哪的文件路径。
将文件还原为一个对象。
7.2用objectInputStream进行反序列化。
黑线标记为要反序列化的文件路径。
因为前面序列化的是String 类型对象,这里接收到了强转回来。

7.3自定义类的序列化

1.这个类必须实现这两个接口之一

2.实现IO接口下的接口,然后定义一个版本号(可以不定义,JVM里自动生成,根据类里的细节,但容易出问题,因为对类一修改,版本号可能变化。)。就可以序列化这个类的对象。
版本号的作用是反序列化的时候,识别是哪个类的对象。
3.自定义类里所有属性也必须是可序列化的。
例如 private Account A;定义一个变量
那么这个Account 也必须是可序列化。
7.4 static,transient修饰的成员变量不可序列化。
从内存加载的角度。static,和transient修饰的归类所有,不归对象所有。
在持久化对象时,对于一些特殊的数据成员(如用户的密码,银行卡号等),我们不想用序列化机制来保存它。就用transient修饰这个变量。(transient也只能修饰变量)。
8.随机存取文件流
意义:进入文件指定位置修改。
例子:浏览器下资源下一半,停了,过两天重新开始下载。停的时候就会记录下到哪了。
既可以当输入流,也可以当输出流。
seek方法(角标),把指针调整到角标位置。
角标:第几个字符的下标。

两个构造器,mode,参数用来指明访问模式。

8.1复制文件,可作 输入与输出流

8.2把数据写进文件。
写的xyz,write里面要放字节数组。
如果要写的文件已经存在,要对文件进行覆盖。默认从头覆盖。
8.3把数据插入文件。(视觉的插入罢了)
原来文件

变成这样

可这一步没办法插入,顶多去角标那覆盖了xyz。
这个时候把后面内容保存下来,
write写xyz,然后接着覆盖写defghijklmn。
这样呈现出插入的效果。

保存到StringBuilder里。指针会自动跑到最后,这个时候把指针调回来。
8.3.1保存后面文件的方法一
8.3.2保存后面数据的方法二
将后面的数据存进流里。
不需要管类型,直接存下后面的字节。
这里的fis可以通过seek方法,调整下标。

8.3.3 将存进的数组写入。











