文件:就是保存数据的地方
文件流:文件在程序中是以流的形式来操作的
流:数据在数据源(文件)和程序(内存)这间经历的路程
输入流:数据从数据源(文件)到程序(内存)的路径
输出流:数据从程序(内存)到数据源(文件)的路径
创建文件对象相关构造器和方法
创建多级目录用mkdirs,创建一级目录用mkdir
IO流原理
- I/O是Input/Output的缩写,I/O技术是非常实用的技术,用于出路数据传输,如读写,网络通讯等
- Java程序中,对于数据的输入/输出操作以流(stream)的方式进行
- Java.io包下提供了各种“流”类和接口,用以获取不同种类的数据,并通过方法输入或输出数据
- 输入input:读取外部数据(磁盘,光盘,数据库等存储设备的数据)到程序(内存)中。
- 输出同理
流的分类:
按照操作数据单位不同分为:字节流(8 bit)二进制文件,字符流(按字符,对应字符,适合文本文件)
按数据流的流向不同分为:输入流,输出流
按流的校色的不同分为:结点流,处理流/包装流
抽象基类 字节流 字符流
输入流 InputStream Reader
输出流 OutputStream Writer
Java的IO流共涉及40多个类,实际上非常规则,都是从如上4个抽象基类派生的
流就是外卖小哥(数据搬运工)
InputSream常用的子类
- FileInputStream文件输入流
- read 只能一个一个读取,效率比较低,而且返回数字,需要转型,不能读取汉字,返回-1表示读取结束
- Read[byte[]]返回值是读取了多少字节数
- BufferedInputStream缓冲字节输入流
- ObjectInputStream对象字节输入流
注意的的点
先声明一个空对象,方便close
异常改成这个
释放的操作
Close和flush底层都一样,close = flush+关闭
Close底层writeBytes就是把数据写入文件的地方,所以最后不写close就写不进文件
节点流和处理流
- 节点流可以从一个特定的数据源读取数据,如FileReader、FileWriter
处理流()(包装流)是”连接“在已存在的流(节点流或处理流)之上,为程序提供更为强大的读写功能,如BufferedReader、BufferedWriter
节点流不够灵活,所以有了处理流(包装流)
Buffered不在乎数据源是文件,数组...,该节点流可以是任意的,只要是Reader,Wrieter子类,就是装饰者模式!!!
- 结点流是底层流/低级流们直接跟数据源相接
- 处理流包装结点,既可以消除不同节点流的实现差异,也可以提供更方便的方法完成输入输出
- 处理流对节点流进行包装,使用修饰器设计模式,不会直接与数据源相怜
处理流的功能主要体现在以下两个方面:
- 性能的提高:主要以增加缓冲的方式来提高输入输出的效率
- 操作的便捷:处理流可能提供了一系列便捷的方法来一次输入输出大批量的数据,使用更加灵活方便
- BufferedReader和BufferedWriter属于字符流,是按照字符来读取数据的
- 关闭时,只需要关闭外层流即可
Write的一个细节,如果你要输出的文件不存在,他会按照你输入的地址帮你创建一个
使用字符流的去传输视频,图片,二进制文件,会造成文件损坏(应该使用字节流)
BufferedInputStream和BufferedInputStream适合输视频,图片,二进制文件
对象流-ObjectInputStream和.....
目标:将基本数据类型或者对象进行序列化和反序列化
序列化
- 序列话就是在保存数据时,保存数据的值和数据类型
- 反序列化就是在回复数据时,回复数据的值和数据类型
- 需要让某个对象支持序列化机制,则必须让其类是可序列化的,为了让摸一个类是可序列化的,该类必须实现如下这两个接口之一:
Serializable标记接口,没有方法 Externalizable
ObjectInputStream-反序列化 ObjectOutputStream序列化
序列化过程中的细节:
序列化和反序列化的注意事项:
- 读写顺序要一致
- 要求实现序列化或反序列化对象,需要实现Serializable
- 序列化的类中建议添加SerialVersionUID(序列化号)可以提高序列化的兼容性(有利于后面修改)
- 序列化对象时,默认将里所有的属性都进行序列化,除了static或transient修饰的成员
- 序列化对象时,要求里面的属性的类型也需要实现序列化接口
- 序列化具备可继承性,也就是说如果某类已经实现了序列化,则它的所有子类也已默认实现了序列化
System.in System.out标准输入流
InputStreamReader转换流,将字节流转换成字符流
IO流最难就是在什么地方你需要直到用什么流
- .InputStreamReader:Reader的子类,可以将InputStream(字节流)包装(转换)成Reader(字符流)
- OutputStreamWriter:Write的子类,实现将OutputStream(字节流)包装成Writer(字符流)
- 当处理纯文本数据时,如果使用字符流效率更高,并且可以有效解决中文问题,所以建议将字节流转换成字符流
- 可以在使用时指定编码格式(utf-8 , gbk, gb2312 , ISO8859-1等)
转换流程:
将字节流FileInputStream转换成字符流InputStreamReader,对文件进行读取(按utf-8格式),进而再转换成BufferedReader
这个InputStreamReader在中间作为一个转换器
打印流-PrintStream和PrintWriter
打印流只有输出流,没有输入流
printStream字节打印流
Print的底层是write
Properties类
它继承HashTable,专门用于读写配置文件的集合类 配置文件的格式:
键 = 值
键值对不需要有空格,值不需要用引号,默认类型是String
Properties:
Load:加载配置文件的键值对到Properties对象
list:将数据显示到指定设备
getProperty(key):根据键获取值
SetProperity(key,value):设置键值到Preoerties对象,如果已经有了这个key,那就修改此key的value
Store:将Properties中的键值对存储都配置文件,在idea中,保存信息到配置文件,如果含有中文,会存储为unicode码