Java SE : 第19章 IO流

食用前说明:

本文章内容来自B站韩顺平老师的课堂笔记,本人只是将其进行自我整理,内容有所删减,韩顺平老师的B站课程AV号:BV1fh411y7R8

本文章内容来自韩顺平老师的课堂笔记的 第19章 IO流

19.1 文件流

流:数据在数据源(文件)和程序(内存)之间经历的路径 输入流:数据从数据源(文件)到程序(内存)的路径 输出流:数据从程序(内存)到数据源(文件)的路径

19.2 常用的文件操作

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

相关方法

  • new File(String pathname) //根据路径构建一个File对象 new

  • File(File parent,String child) //根据父目录文件+子路径构是 new

  • File(String parent,String child) //根据父目录+子 子路径

  • reateNewFile 创建新文件

19.2.2 获取文件的相关信息

getNamegetAbsolutePath
getParentlengh
isFileexists
isDirectory

19.2.3 目录的操作和文件删除

功能
mkdir创建一级目录
mkdirs创建多级目录
delete删除空目录或文件

19.3 IO 流原理及流的分类

19.3.1 Java IO 流原理

  1. I/O是 Input / Output 的缩写,I/O技术是非常实用的技术,用于处理数据传输。如读/写文件,网络通讯等。

  2. Java 程序中,对于数据的输入/输出操作以 ”流(stream)” 的方式进行。

  3. java.io包下提供了各种 “流” 类和接口,用以获取不同种类的数据,并通过方法输入或输出数据

  4. 输入 input:读取外部数据(磁盘、光盘等存储设备的数 据)到程序(内存)中。

  5. 输出 output:将程序(内存)数据输出到磁盘、光盘等存储设备中

19.3.2 流的分类

  1. 按操作数据单位不同分为:字节流 (8 bit) 二进制文件字符流 (按字符) 文本文件

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

  3. 流的角色的不同分为:节点流,处理流/包装流

(抽象基类)字节流字符流
输入流InputStreamReader
输出流OutputStreamWriter
  1. Java 的 IO流共涉及40多个类,实际上非常规则,都是从如上4个抽象基类派生的。

  2. 由这四个类派生出来的子类名称都是以其父类名作为子类名后缀

19.4 IO 流体系图-常用的类

19.4.1 FileReader 相关方法

  1. new FileReader (File / String)

  2. read:每次读取单个字符,返回该字符,如果到文件末尾返回 -1

  3. read(char[]):批量读取多个字符到数组,返回读取到的字符数,如果到文件未尾返回 -1

  • 相关API:

    1. new String(char[]):将 char[] 转换成 String

    2. new String(char[],off,len):将 char[] 的指定部 换成 String

19.4.2 FileWriter 常用方法

功能
new FileWriter(File/String)覆盖模式,相关于流的值针在尾端
new FileWriter(File/String,true)追加模式,相当于流的指针在尾端
write(int)写入单个字符
write(char[])写入指定数组
write(char[],off,len)写入指定数组的指定部分
write(string)写入整个字符串
write(string,off,len)写入字符串的指定部分

相关API

  • String类: toCharArray

    • 将 String 转换成 char[]

❗ 注意:

  • FileWriter使用后,必须要关闭 (close) 或 刷新 (flush),否则写入不到指定文件

19.5 节点流和处理流

19.5.1 节点流和处理流的区别和联系

节点流是底层流/低级流,直接跟数据源相接。 处理流(包装流)包装节点流,既[源码理解] 处理流(也叫包装流)

区别 / 联系
节点流底层流 (低级流) ,直接跟数据源相接
处理流(包装流)1. 包装 节点流 ,可以消除不同节点流的实现差异,也可以提供更方便的方法来完成输入输出。
  1. 节点流 进行包装,使用了修饰器设计模式,不会直接与数据 |

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

  1. 性能的提高:主要以增加缓冲的方式来提高输入输出的效率。

  2. 操作的便捷:处理流可能提供了一系列便捷的方法来一次输入输出大批量的数据,使用更加灵活方便

19.5.3 处理流-BufferedReader 和 BufferedWriter

属于操作
BufferedReader字符流是关闭时处理流,只需要关闭外层流即可
BufferedWriter字符流是关闭时处理流,只需要关闭外层流即可

19.5.4 处理流-BufferedInputStream 和 BufferedOutputStream

  • BufferedInputStream 是字节流,在创建 BufferedInputStream 时,会创建一个内部缓冲区数组。

  • BufferedOutputStream 是字节流,实现缓冲的输出流,可以将多个字节写入底层输出流中,而不必对每次字节写入调用底层系统

19.5.5 对象流-ObjectInputStream 和 ObjectOutputStream

  • 序列化和反序列化

    1. 序列化就是在保存数据时,保存数据的值和数据类型

    2. 反序列化就是在恢复数据时,恢复数据的值和数据类型

    3. 需要让某个对象支持序列化机制,则必须让其类是可序列化的,为了让某个类是可序列化的,该类必须实现如下两个接口之一:

      • Serializable //这是一个标记接口,没有方法

      • Externalizable //该接口有方法需要实现,因此我们一般实现上面的 Serializable 接口

19.5.6 对象流介绍

功能:提供了对基本类型或对象类型的序列化和反序列化的方法

提供功能
ObjectOutputStream序列化功能
ObjectInputStream反序列化功能
  1. 读写顺序要一致

  2. 要求字列化或反序列化对象,需要 实现 Serializable

  3. 序列化的类中建议添加 SerialVersionUID,为了提高版本的兼容性

  4. 序列化对象时,默认将里面所有属性都进行序列化,但除了 static 或 transient 修饰的成员

  5. 序列化对象时,要求里面属性的类型也需要实现序列化接口

  6. 序列化具备可继承性,也就是如果某类已经实现了序列化,则它的所有子类也已经默认实现了序列化

19.5.7 标准输入输出流

类型默认设备
标准输入System.inInputStream键盘
标准输出System.outPrintStream显示器

19.5.8 转换流-InputStreamReader 和 OutputStreamWriter

  1. InputStreamReader :Reader 的子类,可以将 InputStream (字节流) 包装成(转换) Reader (字符流)

  2. OutputStreamWriter :Writer 的子类,实现将 OutputStream (字节流) 包装成 Writer (字符流)

  3. 当处理纯文本数据时,如果使用字符流效率更高,并且可以有效解决中文问题,所以建议将字节流转换成字符流

  4. 可以在使用时指定编码格式 (比如 utf-8,gbk,gb2312,ISO8859-1 等)

19.6 Properties 类

19.6.1 基本介绍

  1. 专门用于读写配置文件的集合类 配置文件的格式: 键 = 值 键 = 值

  2. 注意:键值对不需要有空格,值不需要用引号一起来。默认类型是 String

  3. Properties 的常见方法

功能
load加载配置文件的键值对到Properties对象
list将数据显示到指定设备
getProperty(key)根据键获取值
setProperty(key,value)设置键值对到Properties对象
store1. 将Properties中的键值对存储到配置文件
  1. 在idea中,保存信息到配置文件,如果含有中文,会存储为unicode码 |

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
com.fmall58.wechatsub.business.bizs.UException at com.fmall58.wechatsub.business.service.PubService.isBindWeChatSub(PubService.java:76) at com.fmall58.wechatsub.business.bizs.PubHelper.isBindWeChatSub(PubHelper.java:125) at com.fmall58.wechatsub.business.bizs.PubHelper.execute(PubHelper.java:38) at com.fmall58.wechatsub.server.handlers.ServerHandler.channelRead(ServerHandler.java:103) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348) at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:340) at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:102) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348) at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:340) at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:323) at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:297) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348) at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:340) at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1434) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348) at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:965) at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:163) at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:656) at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:591) at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:508) at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:470) at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:909) at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
06-11

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值