IO
1.IO框架介绍
IO(input/output)是计算机输入输出的接口,java核心类库java.io提供了全面的io接口,包括文件系统的操作(File),文件的读写以及标准设备输出(电脑屏幕)等等
标准设备输入指键盘输入(System.in)
2.File类及使用
代表了磁盘上的文件或目录,提供了与平台无关的方法来对磁盘上的文件或目录进行操作
没有提供方法从文件读取数据或向文件存储数据
3.在Windows下的路径分隔符和Linux下的路径分隔符是不一样的,当直接使用绝对路径时,跨平台会暴出“No such file or diretory”的异常。
比如说要在temp目录下建立一个test.txt文件,在Windows下应该这么写:
File file1 = new File (“C:\tmp\test.txt”);
在Linux下则是这样的:
File file2 = new File (“C:/tmp/test.txt”);
如果要考虑跨平台,则最好是这么写:
File myFile = new File(“C:” + File.separator + “tmp” + File.separator+“test.txt”);
4.递归算法
防止死循环
Eg:求阶乘
练习:斐波那契数列
案例:
递归遍历文件,输出文件后缀名为.docx的目录
案例:删除文件夹/文件
5.流的概念及分类
流是有顺序的,是有开始和结尾的一组数据的集合,程序需要数据的时候使用输入流读取数据,保存时需要输出流完成(输入输出是针对内存的)。
输入流/输出流,是以“内存”为参照物。
从磁盘上的文件读到内存中来,是输入流;
把内存中的数据写入磁盘文件,是输出流。
6.流的分类
节点流/过滤流:区分关键点:是否直接操作目标设备(内存或者磁盘上的文件)。
过滤流操作的是节点流,节点流直接操作目标设备。
备注:如果是文件夹复制,则字节流通用。(字符流常用于将文本文件中的内容展示到屏幕上.)
7.字节流类
InputSream抽象类
常用方法:
8.OutputStream
字节输出流,抽象类
常用方法
9.FileInputSream和FileOutputStream
常用构造方法
Eg:复制文件(不是文件夹)
FileInputStream类的read()方法,返回的是读取的那个字节,用int类型接收。
FileInputStream类的read(byte[])方法,返回的是读取字节数(读取的内容存到byte数组),也用int类型接收。
10.过滤流
对输入输出流进行包装的流
常用过滤流:BufferedInputStream和BufferedOutputStream
当写入数据不满足内部缓冲区(8k 8192字节)时,不会写到文件,需要强制刷新,调用flush或者close,都可以
缓冲区读满了会自动刷新缓冲区
“包装流”关闭会顺便关闭其包装的流,并且关闭时会自动刷新缓冲区(可参见源码)。
11.案例使用字节流复制文件/文件夹
递归、缓冲流
12.字符流
提问:字符流可以用于复制媒体文件(比如图片、音乐、视频)吗?
答:文件无法打开,数据丢失。
Reader和Writer为字符流顶层的抽象类
13.FileReader和FileWriter
//字符数组
14.BufferedReader和BufferedWriter
注意:readLine()读到的内容不包含结束符,因此将读到的内容写入另一个文件时,为保证内容一致性,需要手动调用newLine()写入换行符。
15.ObjectInputStream和ObjectOutputStream(对象输入流和对象输出流)
序列化:将对象转成二进制串
反序列化:将二进制串还原成对应的对象
Java序列化的好处:其好处一是实现了数据的持久化,通过序列化可以把数据永久地保存到硬盘上(通常存放在文件里),二是,利用序列化实现远程通信,即在网络上传送对象的字节序列。
与FileInputStream或FileOutputStream配合使用时,可以对Object对象进行持久化存储,把对象以某种特定的格式写入文件称之为序列化,把写入的编码格式内容还原为对象称之为“反序列化”
要写入的对象需要实现Serializable接口
理解模型:运送大花瓶,打破原有数据结构,按照设计图纸(序列号)还原。设计图纸版本号要和打碎之前的版本号一致。
Eg:
创建一个Student,只要版本号不变,就可以反序列化,如果版本号发生变化,就会报异常
存的是集合
ArrayList、LinkedList、HashMap、TreeMap、HashSet、TreeSet、String、数组全部实现序列化接口
如果需要序列化,那么涉及到的所有的类都要实现序列化接口
16. InputStreamReader和OutputStreamWriter
转换流:字节流与字符流之间的转换
转换流一般都是配合字符流使用的
接受键盘输入存入文件:
如果用到指定编码格式保存或读取文件时,需要用到转换流,因为FileReader和FileWriter是使用默认编码格式保存的,而字节流有指定编码格式的构造方法
在电脑内存里只有字节这一说,其实字符流也是通过字节流来操作的
16.编写转码工具:GBK文件转码为UTF-8文件