Java中IO流详解

文章目录

  • 字符流
    • 问题导入
    • 编码表
      • **出现乱码的原因**
      • ASCII表
      • Unicode表
      • 汉字存储和展示过程解析
      • 问题导入解答
    • 介绍
    • 分类
      • 字符输出流
      • 字符输入流
      • 字符缓冲流
    • 特殊操作流
      • 转化流
      • 对象操作流
      • 打印流
  • 工具包Commons-io
    • 介绍
    • 分类
      • IOUtils类
      • FileUtils类

字符流

问题导入

既然字节流能操作所有文件,那为什么还要学习字符流?
使用字节流,将纯文本文件中的数据读取到内存中,可能会出现乱码;同一将中文写入到纯文本文件中,也可能会出现乱码。所以学习字符流,可以针对纯文本文件中的中文数据,进行读写操作

编码表

编码:将看得懂的数据变成看不懂的
解码:将看不懂的数据变成看得懂的
看不懂的数据是指通过编码表后字符存储到计算机的二进制数

出现乱码的原因

编码和解码

ASCII表

  • ASCII:包括了数字,英文大小写,还有一些常见的标点符号
  • GBK:windows系统默认的码表,兼容ASCII表,包含了汉字等。是中国的码表,一个中文以俩个字节形式存储。

Unicode表

由国际组织ISO制定,是统一的万国码表。最为常见的编码形式:UTF-8
以UTF-8编码后,一个中文以三个字节的形式存储
image-20210415215927246.png

汉字存储和展示过程解析

image-20210415215943288.png

问题导入解答

字节流读取文本文件中文会出现乱码:根据上诉编码表的学习,知道了一个中文在GBK是两个字节,在UTF-8中是三个字节,而字节流一次读取一个字节,相当于只读取一个中文的一部分,所有就会出现乱码
字节流拷贝不会出现乱码:这是因为拷贝文件时将源文件中的字节都原封不动的拷贝到目标文件中,在中间没有进行打印

介绍

以字符为单位进行读写操作
可以读取中文的原因
字符流 = 字节流 + 编码表
底层还是使用字节流读取数据,但是由于指定了编码表,那么第一次就可以读取两个或三个字节数据
注意:不管在哪张码表中,中文的第一个字节一定是负数

分类

字符输出流

  1. 创建

Writer类:父类,是一个抽象类,不能实例化
FileWriter类:Writer的子类

public FileWriter(File file);
public FileWriter(String fileName);
  1. 写入

Snipaste_2024-04-06_10-55-06.png

  1. 释放资源

Snipaste_2024-04-06_10-56-31.png
在字符流中内置了缓冲区(字节数组),刷新了会将缓冲区数据写入到文件中;而关闭流关闭之前会先进行刷新流,确保缓冲区的数据都写入到文件中

字符输入流

  1. 创建

Reader:父类,是一个抽象类,不能实例化
FileReader:Reader的子类

  1. 读取

Snipaste_2024-04-06_11-26-16.png

  1. 释放资源

fe.close();

字符缓冲流

Snipaste_2024-04-06_15-11-37.png
特殊方法
Snipaste_2024-04-06_15-21-42.png

特殊操作流

转化流

作用:读写特定编码表的文件;进行字节流和字符流间的转换
输入流:InputStreamReader
输出流:OutputStreamWriter
注意:自身没有读写数据的能力,需要依靠字节流

//InputStreamReader(InputStream 字节输入流, String 编码表名字) 
//创建输入流,并指定关联文件使用的编码表
InputStreamReader isr = new InputStreamReader(new FileInputStream("关联文件"),"GBK");



//OutputStreamWriter(OutputStream 字节输出流, String 编码表名字)
//创建输出流, 并指定关联文件使用的编码表
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("文件"),"GBK");
BufferedWriter bw = new BufferedWriter(osw);

字符流读写数据工作原理
Snipaste_2024-04-06_16-27-14.png

对象操作流

对象操作输入流:从文件中读取存储的对象
对象操作输出流:把内存中创建的对象写入到文件中

IN:ObjectInputStream
方法:Object  readObject()
OUT:ObjectOutputStream
方法:void  writeObject()

序列化流:把对象序列化后写入到文件或在网络中传输 out
反序列化流:将文件中存储对象(序列化后)读取到内存中或者接收网络中传输的对象 int
注意:一个类要想被序列化,那么此类需要实现Serializable接口
标记接口(空接口)

  • 仅有接口的定义,接口内没有任意内容
  • 给类的实例添加一个标记(servialVersionUID)
  • 只要一个类实现了此接口,表示此类的对象可以被序列化

当想要存储多个对象时,可以将多个对象放到集合中
Snipaste_2024-04-06_19-04-10.png
注意:自身没有读写数据的能力,需要依靠字节流

打印流

作用

  1. 在写入数据后可实现自动换行
  2. 通常用于日志记录

:PrintStream
public PrintStream(String filePath)
常用方法
public void print(数据) 打印不换行
public void println(数据) 打印换行

工具包Commons-io

介绍

第三方组织针对IO中大量的API进行简化,只提供一些简单的API方法,就可以实现IO读写操作

分类

IOUtils类

针对IO流进行读写操作(单文件vs单文件)

public static int copy(InputStream in, OutputStream out):
	把input输入流中的内容拷贝到output输出流中,返回拷贝的字节个数(适合文件大小为2GB以下)
    
public static long copyLarge(InputStream in, OutputStream out):
	把input输入流中的内容拷贝到output输出流中,返回拷贝的字节个数(适合文件大小为2GB以上)

FileUtils类

针对File对象进行读写操作(单文件vs单文件,目录vs目录)

public static void copyFileToDirectory(final File srcFile, final File destFile): 
	复制文件到另外一个目录下。
public static void copyDirectoryToDirectory(File src , File dest ):
	复制src目录到dest位置。

小扩展
通常Java程序开发完成之后,要进行打包:把程序压缩为一个文件

  • jar包:普通的Java程序
  • war包:Java Web程序

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

探索Linux的挂载操作

在Linux这个强大的操作系统中,挂载操作是一个基本而重要的概念。它涉及到文件系统、设备和数据访问,对于理解Linux的工作方式至关重要。那么,挂载操作究竟是什么,为什么我们需要它,如果没有它,我们将面临什…

递归学习第一个课

一、递归定义 基本定义 函数自己调用自己(通俗第一印象)大问题可以拆分小问题(拆分,边界)大问题与小问题的关系(递归关系) 为什么拆分小问题? 小问题更容易求解大问题与小问题内部…

基于Spark中随机森林模型的天气预测系统

基于Spark中随机森林模型的天气预测系统 在这篇文章中,我们将探讨如何使用Apache Spark和随机森林算法来构建一个天气预测系统。该系统将利用历史天气数据,通过机器学习模型预测未来的天气情况,特别是针对是否下雨的二元分类问题。 简介 Ap…

SpringBoot3整合RabbitMQ之四_发布订阅模型中的fanout模型

SpringBoot3整合RabbitMQ之四_发布订阅模型中的fanout模型 文章目录 SpringBoot3整合RabbitMQ之四_发布订阅模型中的fanout模型3. 发布/订阅模型之fanout模型1. 说明1. 消息发布者1. 创建工作队列的配置类2. 发布消费Controller 2. 消息消费者One3. 消息消费者Two4. 消息消费者…

实际项目中如何使用Git做分支管理

前言 Git是一种强大的分布式版本控制系统,在实际项目开发中使用Git进行分支管理是非常常见的做法,因为它可以帮助团队高效的协作和管理项目的不同版本,今天我们来讲讲在实际项目中最常用的Git分支管理策略Git Flow。 常见的Git分支管理策略…

IDEA2024.1版本震撼来袭,手把手教你激活!

前言 作为一个Java程序猿,必不可少的一款开发IDE神器:IntelliJ IDEA,简称“IDEA”。就在前天(2024.4.4)终于推出了心心念念的2024.1版本。 IntelliJ IDEA 2024.1 引入了一系列令人期待的升级,可以帮助您简…

Nuxt 3 项目中配置 Tailwind CSS

官方文档:https://www.tailwindcss.cn/docs/guides/nuxtjs#standard 安装 Tailwind CSS 及其相关依赖 执行如下命令,在 Nuxt 项目中安装 Tailwind CSS 及其相关依赖 npm install -D tailwindcss postcss autoprefixerpnpm install -D tailwindcss post…

深度剖析扫雷游戏的各个知识点(1)

哈喽,小伙伴,大家好,今天我来水一篇文章。害,也不算真的水吧,这次带大家深度剖析初次写扫雷游戏程序时还未接触到的知识点。废话不多说,直接进入正题 不知小伙伴们是否还记得当时我说过扫雷游戏我们是以多个…

AIGC实战——ProGAN(Progressive Growing Generative Adversarial Network)

AIGC实战——ProGAN 0. 前言1. ProGAN2. 渐进式训练3. 其他技术3.1 小批标准差3.2 均等学习率3.3 逐像素归一化 4. 图像生成小结系列链接 0. 前言 我们已经学习了使用生成对抗网络 (Generative Adversarial Network, GAN) 解决各种图像生成任务。GAN 的模型架构和训练过程具有…

2023 年网络安全热点技术发展态势

文章目录 前言一、人工智能信息技术迎来井喷式发展期二、零信任网络安全架构即将投入实际部署三、美国全面推动军政业务向云环境迁移四、专用太空软硬件与独立卫星网络并行发展五、量子信息技术与网络安全领域加速融合前言 在 2023 年取得进展的信息技术不在少数。从网络安全的…

从300亿分子中筛出6款,结构新且易合成,斯坦福抗生素设计AI模型登Nature子刊

ChatGPT狂飙160天,世界已经不是之前的样子。 新建了免费的人工智能中文站https://ai.weoknow.com 新建了收费的人工智能中文站https://ai.hzytsoft.cn/ 更多资源欢迎关注 全球每年有近 500 万人死于抗生素耐药性,因此迫切需要新的方法来对抗耐药菌株。 …

HTML5.Canvas简介

1. Canvas.getContext getContext(“2d”)是Canvas元素的方法,用于获取一个用于绘制2D图形的绘图上下文对象。在给定的代码中,首先通过getElementById方法获取id为"myCanvas"的Canvas元素,然后使用getContext(“2d”)方法获取该Ca…

音视频开发之旅(83)- 腾讯音乐开源高质量唇形同步模型--MuseTalk

目录 1.效果展示 2.原理学习 3.流程分析 4.资料 一、效果展示 -- (推理素材来源于网络,如有侵权,联系立删!) 唱歌效果(歌曲有suno生成) 用于推理的视频素材来源于网络,如有侵权&…

Java中常见的排序算法

常见算法可以分为两大类:   非线性时间比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此称为非线性时间比较类排序。   线性时间非比较类排序:不通过比较来决定元素间的相对次序…

Windows应急响应

1.排查隐藏账号 查看注册表 找到攻击者用户目录文件 排查用户异常 eventvwr.msc 分析用户登录日志 排查可疑端口 排查可疑进程 检查启动项、计划任务和服务 查看系统补丁信息 安装火绒,在安全工具里有火绒剑 计划任务 使用D盾对主机进行检测,发现隐藏账户…

python自定义库的打包和安装

要将自定义库安装到python的三方包地址site-packages中,除了可以直接的复制之外,更为合理科学的方法是通过build和install的方式进行。因为直接复制仅仅作为一种临时的简单的方法,而且只能针对源码进行,也不好进行科学管理&#x…

AJAX —— 学习(三)(完结)

目录 一、jQuery 中的 AJAX (一)get 方法 1.语法介绍 2.结果实现 (二)post 方法 1.语法介绍 2.结果实现 (三)通用型的 AJAX 方法 1.语法介绍 2.结果实现 二、AJAX 工具库 axios &#xff08…

简历复印--原型模式

1.1 夸张的简历 简历的打印。"对编程来说,简单的复制粘贴极有可能造成重复代码的灾难。我所说的意思你根本还没听懂。那就以刚才的例子,我出个需求你写写看,要求有一个简历类,必须要有姓名,可以设置性别和年龄&am…

第十四届蓝桥杯省赛大学C组(C/C++)填充

原题链接:填充 有一个长度为 n 的 01 串,其中有一些位置标记为 ?,这些位置上可以任意填充 0 或者 1,请问如何填充这些位置使得这个 01 串中出现互不重叠的 0 和 1 子串最多,输出子串个数。 输入格式 输入一行包含一…

SQLite 4.9的 OS 接口或“VFS”(十三)

返回:SQLite—系列文章目录 上一篇:SQLite字节码引擎(十二) 下一篇:SQLite 4.9的虚拟表机制(十四) 1. 引言 本文介绍了 SQLite OS 可移植性层或“VFS” - 模块位于 SQLite 实现堆栈底部 提供跨操作系统的可移植性。 VFS是Virtual File…