当前位置: 首页 > news >正文

最全面IO流介绍

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)//方法//每次读取一个字节返回,如果发现没有数据可读会返回-1public int read();//每次用一个字节数组去读取数据,返回字节数组读取了多少个字节,如果发现没有数据可读会返回-1public 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)//方法//每次读取一个字符返回,如果发现没有数据可读会返回-1public int read();//每次用一个字符数组去读取数据,返回字符数组读取了多少个字符,如果发现没有数据可读会返回-1public 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);

相关文章:

最全面IO流介绍

1.字符集介绍 标准ASCII字符集:使用1个字节存储一个字符,首尾是0,总可以表示128个字符。是美国信息交换标准代码,包含英文、符号等等。 GBK汉字编码字符集,包含2万多个汉字等字符,GBK中一个中文字符编码成…...

fastadmin 文件上传腾讯云

1-安装腾讯云SDK composer require qcloud/cos-sdk-v5 2-腾讯云配置 <?phpnamespace app\common\controller;use Qcloud\Cos\Client; use think\Controller; use think\Db;class Tencent extends Controller {/*** 上传文件* param $config* param $key* return array*/p…...

《机器学习》—— PCA降维

文章目录 一、PCA降维简单介绍二、python中实现PCA降维函数的介绍三、代码实现四、PCA降维的优缺点 一、PCA降维简单介绍 PCA&#xff08;主成分分析&#xff0c;Principal Component Analysis&#xff09;是一种常用的数据降维技术。它通过线性变换将原始数据转换到新的坐标系…...

植物三萜皂苷生物合成途径及调控机制研究进展-文献精读48

摘要 三萜皂苷(triterpenoids saponins)是由三萜皂苷元和一个或多个糖基和/或其他化学基团缩合而成的一系列结构多样的天然化合物[1], 主要分布在五加科、蝶形花科、石竹科、桔梗科、毛茛科、玄参科、葫芦科等植物中[2]. 植物中三萜皂苷常分布在特定的器官和组织, 如人参(Pana…...

server 2016搭建FTP服务

目录 一、实验环境 二、在server 2016上面安装FTP服务 三、在server 2016上面配置FTP服务 四、创建用户&#xff08;也可创建用户组&#xff0c;给用户组赋予权限&#xff09; 一、实验环境 windows server 2016用于安装ftp服务 windows 10作为客户端进行测试。 二、在s…...

物理学基础精解【4】

文章目录 运动和力质点运动机械运动的参考系运动的相对性运动学中坐标系 参考文献 运动和力 质点运动 一个物体相对于另一个物体的位置或一个物体的某些部分相对于其他部分的位置 &#xff0c;随着时间而变化的过程&#xff0c;叫机械运动 。质点是一个物理学中的理想化模型&…...

【区块链 + 人才服务】Blockchain Workshop- 区块链编程实践平台 | FISCO BCOS应用案例

Blockchain Workshop v2.0&#xff08;以下简称 BCW v2.0&#xff09;是点宽网络科技有限公司升级的全新区块链实践教育平台产品。 BCW v2.0 区块链实践教育平台面向高校区块链专业人才培养&#xff0c;用于区块链专业技术学习和智能合约编程学习&#xff0c;平台基于 FISCO BC…...

Java面试篇基础部分-Java中常用的I/O模型

阻塞I/O模型 阻塞式的I/O模型是一种非常常见的I/O模型机制,在进行数据读写操作的时候,客户端会发生阻塞等待。 工作流程如图所示,该用户线程一直阻塞,等待内存中的数据就绪;内存中的数据就绪之后,内核态的数据将拷贝到用户线程中,并且返回I/O的执行结果到用户线程。这个…...

如何使用python运行Flask开发框架并实现无公网IP远程访问

文章目录 1. 安装部署Flask2. 安装Cpolar内网穿透3. 配置Flask的web界面公网访问地址4. 公网远程访问Flask的web界面 本篇文章主要讲解如何在本地安装Flask&#xff0c;以及如何将其web界面发布到公网进行远程访问。 Flask是目前十分流行的web框架&#xff0c;采用Python编程语…...

第三届828 B2B企业节开幕,大腾智能携手华为云共谱数字化新篇章

8月27日&#xff0c;由华为携手上万家伙伴共同发起的第三届828 B2B企业节在贵州正式开幕。 本届企业节推出上万款数智产品&#xff0c;600多个精选解决方案&#xff0c;旨在融通数智供需&#xff0c;加速企业智改数转&#xff0c;助推中国数智产业实力再升级。中共贵州省委副书…...

Linux网络编程IO管理

网络 IO 涉及到两个系统对象&#xff0c;一个是用户空间调用 IO 的进程或者线程&#xff0c;一个是内核空间的内核系统&#xff0c;比如发生 IO 操作 read 时&#xff0c;它会经历两个阶段&#xff1a; 等待内核协议栈的数据准备就绪&#xff1b;将内核中的数据拷贝到用户态的…...

SpringCloud集成ELK

1、添加依赖 <dependency><groupId>net.logstash.logback</groupId><artifactId>logstash-logback-encoder</artifactId><version>6.1</version> </dependency>2、在logback-spring.xml中添加配置信息&#xff08;logback-sp…...

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

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

JS Web

Web API 元素通用属性 元素自身属性 事件处理...

【Linux】传输层协议——UDP

零、传输层的作用是负责数据能够从发送端传输到接收端 一、再来认识一下端口号 端口号&#xff08;Port&#xff09;标识了一个主机进行通信的不同的应用程序。在TCP/IP协议中&#xff0c;用“源IP”&#xff0c;“源端口号”&#xff0c;“目的IP”&#xff0c;“目的端口号”…...

算法学习攻略总结 : 入门至进阶,通关之路指南

❃博主首页 &#xff1a; <码到三十五> ☠博主专栏 &#xff1a; <mysql高手> <elasticsearch高手> <源码解读> <java核心> <面试攻关> ♝博主的话 &#xff1a; <搬的每块砖&#xff0c;皆为峰峦之基&#xff1b;公众号搜索(码到…...

《卷积神经网络 CNN 原理探秘》

CNN基本原理详解 卷积神经网络&#xff08;Convolutional Neural Network&#xff0c;简称CNN&#xff09;&#xff0c;是一种前馈神经网络&#xff0c;人工神经元可以响应周围单元&#xff0c;可以进行大型图像处理。卷积神经网络包括卷积层和池化层。 卷积神经网络是受…...

C#获取计算机信息

目录 效果 项目 代码 下载 效果 项目 代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Management; n…...

派遣函数 - 通过设备链接打开设备

利用文件IO相关的Wn32API对设备进行“打开”和“关闭”操作。要打开设备&#xff0c;必须通过设备的名字才能得到该设备的柄。前面介绍过&#xff0c;每个设备都有设备名称&#xff0c;如HelloDDK驱动程序的设备名为“Device\\MyDDKDevice”&#xff0c;但是设备名无法被用户模…...

Vue 2 中的 `$set` 方法详解

在 Vue 2 中&#xff0c;响应式数据的更新非常重要&#xff0c;因为它确保了当数据改变时&#xff0c;视图能够自动更新。Vue 使用一套高效的机制来追踪依赖并在数据变化时更新视图。然而&#xff0c;在某些情况下&#xff0c;直接修改对象的属性可能不会触发视图更新。这时&am…...

测试微信模版消息推送

进入“开发接口管理”--“公众平台测试账号”&#xff0c;无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息&#xff1a; 关注测试号&#xff1a;扫二维码关注测试号。 发送模版消息&#xff1a; import requests da…...

生成xcframework

打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式&#xff0c;可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...

Leetcode 3576. Transform Array to All Equal Elements

Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接&#xff1a;3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到&#xf…...

JavaScript 中的 ES|QL:利用 Apache Arrow 工具

作者&#xff1a;来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗&#xff1f;了解下一期 Elasticsearch Engineer 培训的时间吧&#xff01; Elasticsearch 拥有众多新功能&#xff0c;助你为自己…...

基于Flask实现的医疗保险欺诈识别监测模型

基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施&#xff0c;由雇主和个人按一定比例缴纳保险费&#xff0c;建立社会医疗保险基金&#xff0c;支付雇员医疗费用的一种医疗保险制度&#xff0c; 它是促进社会文明和进步的…...

Go 语言接口详解

Go 语言接口详解 核心概念 接口定义 在 Go 语言中&#xff0c;接口是一种抽象类型&#xff0c;它定义了一组方法的集合&#xff1a; // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的&#xff1a; // 矩形结构体…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作

一、上下文切换 即使单核CPU也可以进行多线程执行代码&#xff0c;CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短&#xff0c;所以CPU会不断地切换线程执行&#xff0c;从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...

[Java恶补day16] 238.除自身以外数组的乘积

给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O(n) 时间复杂度…...

使用Spring AI和MCP协议构建图片搜索服务

目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式&#xff08;本地调用&#xff09; SSE模式&#xff08;远程调用&#xff09; 4. 注册工具提…...

【从零学习JVM|第三篇】类的生命周期(高频面试题)

前言&#xff1a; 在Java编程中&#xff0c;类的生命周期是指类从被加载到内存中开始&#xff0c;到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期&#xff0c;让读者对此有深刻印象。 目录 ​…...