IO流内容详解

文件:就是保存数据的地方

文件流:文件在程序中是以流的形式来操作的

流:数据在数据源(文件)和程序(内存)这间经历的路程

输入流:数据从数据源(文件)到程序(内存)的路径

输出流:数据从程序(内存)到数据源(文件)的路径

创建文件对象相关构造器和方法

创建多级目录用mkdirs,创建一级目录用mkdir

IO流原理

  1. I/O是Input/Output的缩写,I/O技术是非常实用的技术,用于出路数据传输,如读写,网络通讯等
  2. Java程序中,对于数据的输入/输出操作以流(stream)的方式进行
  3. Java.io包下提供了各种“流”类和接口,用以获取不同种类的数据,并通过方法输入或输出数据
  4. 输入input:读取外部数据(磁盘,光盘,数据库等存储设备的数据)到程序(内存)中。
  5. 输出同理

流的分类:

按照操作数据单位不同分为:字节流(8 bit)二进制文件,字符流(按字符,对应字符,适合文本文件)

按数据流的流向不同分为:输入流,输出流

按流的校色的不同分为:结点流,处理流/包装流

抽象基类       字节流       字符流

输入流        InputStream    Reader

输出流        OutputStream   Writer

Java的IO流共涉及40多个类,实际上非常规则,都是从如上4个抽象基类派生的

流就是外卖小哥(数据搬运工)

InputSream常用的子类

  1. FileInputStream文件输入流
  1. read 只能一个一个读取,效率比较低,而且返回数字,需要转型,不能读取汉字,返回-1表示读取结束
  2. Read[byte[]]返回值是读取了多少字节数
  1. BufferedInputStream缓冲字节输入流
  2. ObjectInputStream对象字节输入流

注意的的点

先声明一个空对象,方便close

异常改成这个

释放的操作

Close和flush底层都一样,close = flush+关闭

Close底层writeBytes就是把数据写入文件的地方,所以最后不写close就写不进文件

节点流和处理流

  1. 节点流可以从一个特定的数据源读取数据,如FileReader、FileWriter

处理流()(包装流)是”连接“在已存在的流(节点流或处理流)之上,为程序提供更为强大的读写功能,如BufferedReader、BufferedWriter

节点流不够灵活,所以有了处理流(包装流)

Buffered不在乎数据源是文件,数组...,该节点流可以是任意的,只要是Reader,Wrieter子类,就是装饰者模式!!!

  1. 结点流是底层流/低级流们直接跟数据源相接
  2. 处理流包装结点,既可以消除不同节点流的实现差异,也可以提供更方便的方法完成输入输出
  3. 处理流对节点流进行包装,使用修饰器设计模式,不会直接与数据源相怜

处理流的功能主要体现在以下两个方面:

  1. 性能的提高:主要以增加缓冲的方式来提高输入输出的效率
  2. 操作的便捷:处理流可能提供了一系列便捷的方法来一次输入输出大批量的数据,使用更加灵活方便

  1. BufferedReader和BufferedWriter属于字符流,是按照字符来读取数据的
  2. 关闭时,只需要关闭外层流即可

Write的一个细节,如果你要输出的文件不存在,他会按照你输入的地址帮你创建一个

使用字符流的去传输视频,图片,二进制文件,会造成文件损坏(应该使用字节流)

BufferedInputStream和BufferedInputStream适合输视频,图片,二进制文件

对象流-ObjectInputStream和.....

目标:将基本数据类型或者对象进行序列化和反序列化

序列化

  1. 序列话就是在保存数据时,保存数据的值和数据类型
  2. 反序列化就是在回复数据时,回复数据的值和数据类型
  3. 需要让某个对象支持序列化机制,则必须让其类是可序列化的,为了让摸一个类是可序列化的,该类必须实现如下这两个接口之一:

Serializable标记接口,没有方法     Externalizable

ObjectInputStream-反序列化  ObjectOutputStream序列化

序列化过程中的细节:

序列化和反序列化的注意事项:

  1. 读写顺序要一致
  2. 要求实现序列化或反序列化对象,需要实现Serializable
  3. 序列化的类中建议添加SerialVersionUID(序列化号)可以提高序列化的兼容性(有利于后面修改)
  4. 序列化对象时,默认将里所有的属性都进行序列化,除了static或transient修饰的成员
  5. 序列化对象时,要求里面的属性的类型也需要实现序列化接口
  6. 序列化具备可继承性,也就是说如果某类已经实现了序列化,则它的所有子类也已默认实现了序列化

System.in  System.out标准输入流

InputStreamReader转换流,将字节流转换成字符流

IO流最难就是在什么地方你需要直到用什么流

  1. .InputStreamReader:Reader的子类,可以将InputStream(字节流)包装(转换)成Reader(字符流)
  2. OutputStreamWriter:Write的子类,实现将OutputStream(字节流)包装成Writer(字符流)
  3. 当处理纯文本数据时,如果使用字符流效率更高,并且可以有效解决中文问题,所以建议将字节流转换成字符流
  4. 可以在使用时指定编码格式(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码

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值