最全面IO流介绍

news2024/11/8 15:33:14

1.字符集介绍

  • 标准ASCII字符集:使用1个字节存储一个字符,首尾是0,总可以表示128个字符。是美国信息交换标准代码,包含英文、符号等等。

  • GBK汉字编码字符集,包含2万多个汉字等字符,GBK中一个中文字符编码成2个字节的形式存储,GBK兼容了ACSII字符集。GBK规定:汉字的第一个字节的第一位必须是1

  • Unicode字符集:是国际组织规定的,可以容纳世界所有文字、符号的字符集。叫万国码。

    • UTF-32: 4个字节表示一个字符,固定长度,可能只需要1个字节的英文字符现在要用4个字节来存储,太奢侈

    • UTF-8:采取可变长编码方案:共分为4个长度区:1(0xxxxxxx)、2(110xxxxx 10xxxxx)、3(1110xxxx 10xxxxx)、4(11110xxx 10xxxxx 10xxxxx 10xxxxx)个字节

      • 英文字符、数字只占用1个字节,汉字占用3个字节

注意:

  • 开发人员最好都是用UTF-8编码。

  • 字符编码时使用的字符集,和解码时使用的字符集必须一致,不然会出现乱码

  • 英文数字一般不会乱码,英文很多字符集都兼容了ASCII码

2. IO流分类

  • 按流的方向

    • 输入流:将数据从磁盘输入到程序中

    • 输出流:将数据从程序中保存到磁盘上

  • 按数据的最小单位

    • 字节流:适合操作所有类型的文件

    • 字符流:适合读写txt,java文件

3.总体概览图

4.IO流体系

  • 字节流(适合文件的复制)

    • 字节输入流:InputStream---->FileInputStream

      • 作用:把磁盘文件中的数据以字节的形式读取到内存中

      • 常用方法:

        //构造方法:创建字节输入流管道与源文件接通
         public FileInputStream(File file);
         public FileInputStream(String name)
         
         //方法
         //每次读取一个字节返回,如果发现没有数据可读会返回-1
         public int read();
         //每次用一个字节数组去读取数据,返回字节数组读取了多少个字节,如果发现没有数据可读会返回-1
         public int read(byte[] buffer);
    • 字节输出流: OutputStream---->FileOutputStream

      • 作用:把数据写入文件中并保存在磁盘 

      • 常用方法:

        //构造方法:创建字节输出流管道与源文件接通
         public FileOutputStream(File file);
         public FileOutputStream(String filePath)
         //以下构造方法可以追加数据
          public FileOutputStream(File file,boolean append);
         public FileOutputStream(String filePath,boolean append)
         //方法
         //写一个字节出去
         public void write(int a);
         //写一个字节数组出去
         public void write(byte[] buffer);
          //写字节数组的一部分出去
         public void write(byte[] buffer,int pos, int len);

  • 字符流(适合数据的读取)

    • 文件字符输入流: Reader---->FileReader

      • 作用:把磁盘文件中的数据以字符的形式读取到内存中

      • 常用方法:

        //构造方法:创建字符输入流管道与源文件接通
         public FileReader(File file);
         public FileReader(String pathname)
         
         //方法
         //每次读取一个字符返回,如果发现没有数据可读会返回-1
         public int read();
         //每次用一个字符数组去读取数据,返回字符数组读取了多少个字符,如果发现没有数据可读会返回-1
         public int read(char[] buffer);
    • 文件字符输出流: Writer---->FileWriter
      • 作用:把数据写入文件中并保存在磁盘

      • 常用方法:

        //构造方法:创建符节输出流管道与源文件接通
         public FileWriter(File file);
         public FileWriter(String filePath)
         //以下构造方法可以追加数据
          public FileWriter(File file,boolean append);
         public FileWriter(String filePath,boolean append)
         //方法
         //写一个字符出去
         public void write(int a);
         //写一个字符串出去
         public void write(String s);
          //写一个字符串的一部分出去
         public void write(String s,int off, int len);
         //写一个字符数组出去
         public void write(byte[] buffer);
          //写字符数组的一部分出去
         public void write(byte[] buffer,int pos, int len);
  • 缓冲流

    • 作用:包装原始字节流和字符流,提升原始流的读写数据的性能。

    • 字节输入缓冲流:BufferedInputStrea

      InputStream bis = new BufferedInputStream(FileInputStream is,int size);
    • 字节输出缓冲流: BufferedOutputStream

      OutputStream bos = new BufferedOutputStream(FileOutputStream os,int size);
    • 字符输入缓冲流: BufferedReader(新增读取某一行的数据)

    • 字符输出缓冲流: BufferedWriterzz(新增添加一行数据的方法)

  • 转换流

    • 引起问题:如果程序的编码方式和文本文件的编码方式不一致,就会出现乱码问题。解决该问题有以下两种方式:

    • 字符输入转换流:InputStreamReader:

      • 解决思路:先获取文件的原始字节流,然后按照指定的编码转为字符输入流。

        //构造函数
        public InputStreamReader(InputStream is,String charset);
    • 字符输出转换流: OutputStreamWriter:

      • 作用:可以控制写入文件的字符使用什么字符编码。

      • 解决:先获取字节输出流,再按照指定的编码转为字符输出流。

        //构造函数
        public OutputStreamWriter(OutputStream is,String charset);
  • 打印流

    • 作用:更方便更高效的打印数据出去,打印什么就输出什么

    • 字节输出打印流:PrintStream

      //构造方法
      //打印流直接通向字节输出流、文件、文件路径
      public PrintStream(OutputStream/File/String);
      //可以指定写出去的字符编码
      public PrintStream(String fileName,Charset charset);
      //可以指定实现自动刷新
      public PrintStream(OutputStream out,boolean autoFlush);
      //指定自动刷新,并指定字符编码
      public PrintStream(OutputStream out,boolean autoFlush,String encoding);
      
      //打印方法
      //打印任意类型的数据
      public void printIn(Xxx xx);
    • 字符输出打印流: PrintWriter

      //构造方法
      //打印流直接通向字节输出流、文件、文件路径
      public PrintWriter(OutputStream/Writer/File/String);
      //可以指定写出去的字符编码
      public PrintWriter(String fileName,Charset charset);
      //可以指定实现自动刷新
      public PrintWriter(OutputStream out/Writer,boolean autoFlush);
      //指定自动刷新,并指定字符编码
      public PrintWriter(OutputStream out,boolean autoFlush,String encoding);
      
      //打印方法
      //打印任意类型的数据
      public void printIn(Xxx xx);
  • 数据流

    • 数据输入流:DataInputStream(读取数据输出流写出去的数据)

    • 数据输出流:DataOutputStream(允许把数据及其类型一并写出去)

  • 序列化流(字节流下的)

    • 对象反序列化:ObjectInputStream(读取文件中的对象)

      //构造器
      //创建对象字节输入流,包装基础的字节流
      public ObjectInputStream(InputStream is);
      
      //读取存储在文件中的对象的方法
      public final Object readObject();
    • 对象序列化: ObjectOutputStream(把java对象序列化存储到文件中去)

      //构造器
      //创建字节输出流,包装基础的字节输出流
      public ObjectOutputStream(OutputStream os);
      
      //把对象写入文件的方法
      public final void writeObject(Object o);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2129895.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

(Java企业 / 公司项目)点赞业务系统设计-批量查询点赞状态(二)

接着上一篇文章来搞,批量查询点赞状态。这个接口提供给其他的微服务调用所以这里会用到FeignClient 直接上接口 1. 接口信息 这里是查询多个业务的点赞状态,因此请求参数自然是业务id的集合。由于是查询当前用戶的点赞状态,因此无需传递用戶信息。当前用户指的是登录用户 …

小琳AI课堂:LLaMA 3.1 开源大模型的全新里程碑

引言 大家好,这里是小琳AI课堂!今天我们要聊的是Meta最新发布的开源大模型LLaMA 3.1。这个版本在AI界掀起了不小的波澜,不仅在参数规模上有显著提升,还在多项性能上实现了突破。让我们一起来看看LLaMA 3.1带来的新变化和意义吧&a…

UEFI基础概念2——Handle和Protocol

一、Handle Handle Database是由Handle和Protocol组成。Handle(句柄)是一个或多个协议的集合,Protocol(协议)是由GUID命名的数据结构。 在平台初始化过程中,系统固件、UEFI兼容驱动程序和UEFI应用程序创建…

香港科技大学工学2025/2026年度硕士研究生(MSc)项目招生宣讲会

🔔香港科技大学工学院2025/2026年度硕士研究生(MSc)项目招生宣讲会 🕙时间:2024年9月25日(星期三)19:00 🏠地点:华南理工大学五山校区33号楼403室 🎆2024Ti…

重修设计模式-结构型-桥接模式

重修设计模式-结构型-桥接模式 将抽象和实现解耦,让它们可以独立变化 桥接模式(Bridge Pattern)的主要目的是解耦,创建一个抽象层来隔离接口与实现,让它们之间的依赖关系可以通过对象的组合来替代继承,从而…

运维学习————运维日志分析系统es——Elasticsearch

目录 一、简介 1、全文检索 1、数据分类 2、非结构化数据搜索方法 2、什么是 Elasticsearch 3、用途 4、基本概念 二、下载配置,搭建集群 集群规划 解压 配置环境变量 es配置 由于es启动不能直接使用root用户 启动 三、常用集群命令 一、简介 …

可提示 3D 分割研究里程碑!SAM2Point:SAM2加持泛化任意3D场景、任意提示!

郑重声明:本解读已获得论文作者的原创解读授权 文章链接:https://arxiv.org/pdf/2408.16768 在线demo: https://huggingface.co/spaces/ZiyuG/SAM2Point code链接:https://github.com/ZiyuGuo99/SAM2Point 亮点直击 无投影 3D 分割&#xff1…

DAY14信息打点-JS 架构框架识别泄漏提取API 接口枚举FUZZ 爬虫插件项目

本课意义: 1.如何从表现中的JS提取价值信息 2.如何从地址中FUZZ提取未知的JS文件 3.如何从JS开放框架WebPack进行测试 一、JS 前端架构-识别&分析 在JS中寻找更多的URL地址,在JS代码逻辑(加密算法、APIKey配置、验证逻辑)中进…

C语言——静态链表和动态链表

一、静态链表 创建链表中的一个节点,用struct来创建,其中包含两个部分:数据域和指针域。 创建三个结点,node1、node2、node3,分别赋值,初始化为NULL。接着就是将这些节点进行连接,组成链表。连…

干货分享|分享一款完全免费的PDF工具箱 PDF24

PDF 24介绍: PDF 24是一个全面的PDF工具包,旨在简化和优化PDF文件的处理和管理。它提供了广泛的功能和工具,包括创建、编辑、转换、合并、拆分、加密、解密、压缩、优化、签名、水印等。 主要特点:完全免费,轻量便捷,…

现货黄金避险属性是怎么来的?

众所周知,黄金是一种可以规避风险的品种,当地缘局势冲突、经济下行,甚至是出现军事摩擦等等情况,黄金都会受到避险情绪支撑而上涨。典型的例子,我们可以看俄乌冲突,还有中东的地缘局势等,这些事…

TS 常用类型

我们经常说TypeScript是JavaScript的一个超级 TypeScript 常用类型 TypeScript 是 JS 的超集,TS 提供了 JS 的所有功能,并且额外的增加了:类型系统 所有的 JS 代码都是 TS 代码 JS 有类型(比如,number/string 等&…

OPENAIGC开发者大赛企业组AI黑马奖 | 包你面-AI面试助手

在第二届拯救者杯OPENAIGC开发者大赛中,涌现出一批技术突出、创意卓越的作品。为了让这些优秀项目被更多人看到,我们特意开设了优秀作品报道专栏,旨在展示其独特之处和开发者的精彩故事。 无论您是技术专家还是爱好者,希望能带给您…

Linux基础知识之用户和组

Linux基础知识之用户和组 01 1.什么是用户 用户账户为不同人员和运行的程序之间提供安全边界 用户使用 username 进行标识,操作系统为其分配唯一标识号(UID),用户可能含有密码 系统中的每个程序都以一个特定用户运行&#xff…

上/下三角矩阵的压缩存储

1.给自己出题:自己动手创造,画一个5行5列的下三角矩阵 2.画图:按“行优先”压缩存储上述矩阵,画出一维数组的样子 3.简答:写出元素 i,j 与 数组下标之间的对应关系 4.画图:按“列优先”压缩存储上述矩阵…

【卷起来】VUE3.0教程-06-组件详解

各位看官,点波关注和赞吧 组件允许我们将 UI 划分为独立的、可重用的部分,并且可以对每个部分进行单独的思考。在实际应用中,组件常常被组织成层层嵌套的树状结构: 这和我们嵌套 HTML 元素的方式类似,Vue 实现了自己的…

ssrf漏洞利用+CTF实例

引发ssrf漏洞的几个函数 file_get_contents() 把整个文件读入一个字符串中,获取本地或者远程文件内容fsockopen() 获得套接字信息curl_exec() 执行一个curl会话,由curl_init()初始化一个新的会话,返回一个curl句柄fopen() 打开文件或者URLre…

【数据结构与算法 | 灵神题单 | 插入链表篇】力扣2807, LCR 029, 147

1. 力扣2807:在链表中插入最大公约数 1.1 题目: 你一个链表的头 head ,每个结点包含一个整数值。 在相邻结点之间,请你插入一个新的结点,结点值为这两个相邻结点值的 最大公约数 。 请你返回插入之后的链表。 两个…

前端开发macbook——NVM环境配置以及git配置流程

本文主要针对前端使用mac电脑时需要安装nvm对应环境,一文解决环境安装问题 主要步骤如下: 安装homebrew 安装nvm 安装git 第一步:安装homebrew /bin/bash -c "$(curl -fsSL https:/raw.githubusercontent.com/Homebrew/install/HE…

C++基础(七):类和对象之深浅拷贝问题(中-3)

在C编程中,拷贝构造函数是对象复制的核心机制,尤其是在处理对象间的值传递时。当一个对象通过拷贝另一个对象来初始化时,浅拷贝只是简单地复制对象的成员变量的值。如果对象包含指针成员,浅拷贝只复制指针地址,这可能会…