IO流 字节流/字符流

本文详细介绍了Java中的IO流,包括字节流和字符流的分类、使用场景及操作方法。针对字节流,文章讲解了字节输入流和输出流的构造及写入数据的三种方式,并探讨了字节流处理中文可能出现的乱码问题。对于字符流,文章解释了其出现的原因,涉及到字符编码表如ASCII、GBK和Unicode的UTF-8编码,并讨论了字符流在处理字符串编码解码时的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.字节流

1.1 IO流概述和分类

  • IO流介绍

  • IO:输入/输出(Input/Output)

  • 流:是一种抽象概念,是对数据传输的总称.也就是说数据在设备间的传输称为流,流的本质是数据传输

  • IO流就是用来处理设备间数据传输问题的.常见的应用: 文件复制; 文件上传; 文件下载

  • IO流的分类

  • 按照数据的流向

  • 输入流:读数据

  • 输出流:写数据

  • 按照数据类型来分

  • 字节流

  • 字节输入流

  • 字节输出流

  • 字符流

  • 字符输入流

  • 字符输出流

  • IO流的使用场景

  • 如果操作的是纯文本文件,优先使用字符流

  • 如果操作的是图片、视频、音频等二进制文件,优先使用字节流

  • 如果不确定文件类型,优先使用字节流.字节流是万能的流

1.2字节流写数据

  • 字节流抽象基类

  • InputStream:这个抽象类是表示字节输入流的所有类的超类

  • OutputStream:这个抽象类是表示字节输出流的所有类的超类

  • 子类名特点:子类名称都是以其父类名作为子类名的后缀

  • 字节输出流

  • FileOutputStream(String name):创建文件输出流以指定的名称写入文件

  • 使用字节输出流写数据的步骤

  • 创建字节输出流对象(调用系统功能创建了文件,创建字节输出流对象,让字节输出流对象指向文件)

  • 调用字节输出流对象的写数据方法

  • 释放资源(关闭此文件输出流并释放与此流相关联的任何系统资源

1.3字节流写数据的三种方式

  • 写数据的方法分类

1.4字节流写数据的两个小问题

  • 字节流写数据如何实现换行

  • windows:\r\n

  • linux:\n

  • mac:\r

  • 字节流写数据如何实现追加写入

  • public FileOutputStream(String name,boolean append)

  • 创建文件输出流以指定的名称写入文件。如果第二个参数为true ,则字节将写入文件的末尾而不是开头

1.5字节流写数据加异常处理

  • 异常处理格式

  • try-catch-finally

  • finally特点

被finally控制的语句一定会执行,除非JVM退出

1.6字节流读数据(一次读一个字节数据)

  • 字节输入流

  • FileInputStream(String name):通过打开与实际文件的连接来创建一个FileInputStream,该文件由文件系统中的路径名name命名

  • 字节输入流读取数据的步骤

  • 创建字节输入流对象

  • 调用字节输入流对象的读数据方法

  • 释放资源

1.7字节流读数据(一次读一个字节数组数据)【应用】

  • 一次读一个字节数组的方法

  • public int read(byte[] b):从输入流读取最多b.length个字节的数据

  • 返回的是读入缓冲区的总字节数,也就是实际的读取字节个数

2.字节缓冲流

2.1字节缓冲流构造方法【应用】

  • 字节缓冲流介绍

  • lBufferOutputStream:该类实现缓冲输出流.通过设置这样的输出流,应用程序可以向底层输出流写入字节,而不必为写入的每个字节导致底层系统的调用

  • lBufferedInputStream:创建BufferedInputStream将创建一个内部缓冲区数组.当从流中读取或跳过字节时,内部缓冲区将根据需要从所包含的输入流中重新填充,一次很多字节

  • 构造方法:

3.字符流

3.1为什么会出现字符流

  • 字符流的介绍

由于字节流操作中文不是特别的方便,所以Java就提供字符流

字符流 = 字节流 + 编码表

  • 中文的字节存储方式

用字节流复制文本文件时,文本文件也会有中文,但是没有问题,原因是最终底层操作会自动进行字节拼接成中文,如何识别是中文的呢?

汉字在存储的时候,无论选择哪种编码存储,第一个字节都是负数

3.2编码表

  • 什么是字符集

是一个系统支持的所有字符的集合,包括各国家文字、标点符号、图形符号、数字等

l计算机要准确的存储和识别各种字符集符号,就需要进行字符编码,一套字符集必然至少有一套字符编码。常见字符集有ASCII字符集、GBXXX字符集、Unicode字符集等

  • 常见的字符集

  • ASCII字符集:

lASCII:是基于拉丁字母的一套电脑编码系统,用于显示现代英语,主要包括控制字符(回车键、退格、换行键等)和可显示字符(英文大小写字符、阿拉伯数字和西文符号)

基本的ASCII字符集,使用7位表示一个字符,共128字符。ASCII的扩展字符集使用8位表示一个字符,共256字符,方便支持欧洲常用字符。是一个系统支持的所有字符的集合,包括各国家文字、标点符号、图形符号、数字等

  • GBXXX字符集:

GBK:最常用的中文码表。是在GB2312标准基础上的扩展规范,使用了双字节编码方案,共收录了21003个汉字,完全兼容GB2312标准,同时支持繁体汉字以及日韩汉字等

  • Unicode字符集:

UTF-8编码:可以用来表示Unicode标准中任意字符,它是电子邮件、网页及其他存储或传送文字的应用 中,优先采用的编码。互联网工程工作小组(IETF)要求所有互联网协议都必须支持UTF-8编码。它使用一至四个字节为每个字符编码

编码规则:

128个US-ASCII字符,只需一个字节编码

拉丁文等字符,需要二个字节编码

大部分常用字(含中文),使用三个字节编码

其他极少使用的Unicode辅助字符,使用四字节编码

3.3字符串中的编码解码问题

  • 相关方法

补充:

1.一般工具类最好用静态,不要用创建对象实例化去得到对象

2.字符转换为字节数组才能存入

3.一个字符占多少个字节

1)1个字节 gb2312

2)2个字节 GBK

3)3个字节 UTF-8

4)4个字节 16进制

4.复制文件:其实就算读取源文件,然后写入一个新文件:最好用字节流

5.字节流写入中文或者读取中文的时候一般会出现乱码,因为一个中文占用几个字节

6.读取纯文本用字符流:Reader reader = new FileReader(oldPath);

7.对于写字符流Writer writer = new FileWriter(file);需要刷新或者关系

8.建议以后手动去关闭流

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值