java--io流(一)

1. 前置知识

字符集是什么?

字符集(Character Set)是一组字符的集合,它定义了可以在计算机系统中使用的所有字符。字符集可以包括字母、数字、标点符号、控制字符、图形符号等。字符集使得计算机能够存储、处理和显示各种语言和符号。

字符集的分类:

一般认识这几种:ASCII(美国标准信息交换码),GBK(汉字内码扩展规范),Unicode(统一码,也叫万国码),UTF-8(使用广泛),UTF-16

理解字符集:

1.ASCII(美国标准信息交换码):包含128个字符,主要包括英文字母、数字和一些特殊字符,使用1个字节存储一个字符,首位是0。(2^7 = 128)

2.GBK(汉字内码扩展规范):包含两万多汉字,一个汉字编码为两个字节,同时兼容ASCII编码,汉字编码首位为1。

3.Unicode(统一码,也叫万国码):还有另外一种叫法(UTF-32),就是32位二进制数也就是4个字节表示一个字符,不管是汉字还是其他符号,过于奢侈(浪费内存)。

4.UTF-8(使用广泛):采取可变长编码方案,共分为4个长度区:字节长度1,2,3,4。英文、数字等只占用1个字节(兼容ASCII码),汉字占用3个字节:具体看下图:

字符集相关的方法及用法:

字符集的编码、解码操作:(java完成了对字符的编码和解码,String提供了以下方法:)

编码:

1.byte[] getBytes():使用平台默认字符集,将String编码为字节数组存储到新的字节数组中

2.byte[] getBytes(String charsetName):使用指定字符集,将String编码为字节数组存储到新的字节数组中

解码:(String的构造器)

1.String(byte[] bytes)

2.String(byte[] bytes,String charsetName)

以下是示例图:

2. io流

什么是io流?

 i就是input(叫做输入流)就是网络或者磁盘文件等中读取数据到程序中;o就是output(叫做输出流)就是将程序中的数据写入到网络或者磁盘文件等中。

io流的分类:

按照流向分:输入流、输出流

按照流中数据的最小单元分:字节流、字符流

大类:字节输入流,字节输出流,字符输入流,字符输出流

io流有什么用?

io流一般应用场景:

       记事本记事,游戏最高分存储,通信等

io流怎么用?

首先我们要知道四大类:字节输入流,字节输出流,字符输入流,字符输出流。他们其实都是抽象类,使用时需要使用其子类(实现类),下面将分别介绍两大类(字节输入输出流)的实现类及其用法:

3. FileInputStream实现类

使用步骤:

1.创建输入流管道(对象),建立与源文件的连接(构造器中写文件路径【绝对/相对】)

2.以字节形式从文件中读取数据read()方法返回编码(可以转换类型为显而易见的类型);可以使用while循环读取大量字节

注意事项:

1.不能读取汉字,会出现乱码现象(read()只读取一个字节,在UTF-8中汉字占3个字节)

2.读取数据的性能太差

3.任何流的使用后都要关闭流,调用close方法

import java.io.FileInputStream;
import java.io.IOException;public class Main {public static void main(String[] args) throws IOException {//完成 FileInputStream实现类 的 1)使用流程 2)检查read() 和 read(byte[] buffer)的注意事项:关于汉字是否可以读取//1.FileInputStream实现类是InputStream类的一个实现类,具体是字节输入流,以字节的形式从磁盘或网络上读取数据到程序中;//read()具体的使用步骤如下://1)第一步:建立程序和源文件(获取源)的管道,也就是创建FileInputStream实现类的一个对象;//2)第二步:用对象调用read()方法,得到数据的编码,每次只能得到一个字节的数据;//3)第三步:关闭流;FileInputStream is = new FileInputStream("hellomodule\\src\\com\\yym\\test\\yjwj.txt");//后面的路径可以是:绝对路径、相对路径(当前工作目录下的)//一个一个字节读入;
//        int ch = is.read();
//        int ch1 = is.read();
//        int ch2 = is.read();
//        System.out.print((char)ch);
//        System.out.print((char)ch1);
//        System.out.print((char)ch2);//        int b;
//        while((b = is.read()) != -1){
//            System.out.print((char)b);
//        }//2.使用read(byte[] buffer)//1.第一步:建立程序和源文件(获取源)的管道,也就是创建FileInputStream实现类的一个对象;//2.准备byte[] buffer的大小;//3.is调用read(byte[] buffer),得到大量的编码,并返回读取的字节数;byte[] buffer = new byte[6];//读取一次读取5个字节到字节数组中;
//        int len = is.read(buffer);//        for (int i = 0; i < buffer.length; i++) {
//            System.out.print((char)buffer[i]);
//        }
//        System.out.println();//for循环可以改变为String类型;//String rs = new String(buffer);//        System.out.println(len);int len;while((len = is.read(buffer))!=-1){//String rs = new String(buffer);String rs = new String(buffer,0,len);System.out.println(rs);System.out.println(len);}//但是现在有一个问题是覆盖之后,会将之前读到的字节保留并一并读出,现在的目的是:想要读多少字节就倒出多少字节;//只需要使用String的另外一个构造器:String rs = new String(buffer,0,len);//3.关于能不能读汉字问题:首先read()不可以读汉字,read(byte[] buffer)可以读入汉字,但是要保证一个汉字读入的字节数为3//所以有一个问题:在英文汉字都有的而且字数不确定的文章中,无法保证读入的正确性;除非已知文件字节数大小,一次性读出。//因此:会有字符输入流解决相关问题;is.close();}
}

 对于在英文汉字都有的而且字数不确定的文章中,无法保证读入的正确性的问题,有以下两种解决措施:

 方法一:

 方法一中,size作为参数时需要强制转换为int,原因如下:

byte数组的定义中,大小不能超过int类型,size的类型是一个long类型,直接用会报错,所以要强制转换。一般文件不会特别大,因此可以用这样的代码;但是有100GB大小的文件,然而,内存只有32GB甚至更小,这样就不能new出一个字节很大的byte数组来一次读取文件。

 方法二:直接替换定义size开始的四行代码(更方便,但是仍然没有解决文件过大时的读取问题)

 

4. FileOutputStream实现类

使用步骤:

1.创建输入流管道(对象),建立与源文件的连接(构造器中写文件路径【绝对/相对】)

2.以字节形式从文件中读取数据:read(byte[] buffer)方法得到编码(可以转换类型为显而易见的类型);返回读取的字节数量

注意事项:

1.不能读取汉字,会出现乱码现象(read()只读取一个字节,在UTF-8中汉字占3个字节)

2.读取数据的性能太差

3.任何流的使用后都要关闭流,调用close方法

注意事项:

1.读取多少,倒多少(buffer数组可以多次使用,但是非首次使用时会覆盖前面位置的数据,为了防止后面出现bug,非首次读取定长后一定要倒出)eg:文件内容:abc66 ,buffer大小为3 ,第一次读取:【a,b,c】,第二次读取:【6,6,c】。其实第二次读了2个字节,应该倒出2个字节的数据【6,6】.

2每次读取完毕返回-1

使用流程几乎相同,只有划红线部分:如果是true,那么就支持向文件中追加,不然默认是false,就是先清空再写入。

注意

1.在new出一个输出流管道时,可以直接跟一个不存在的路径,会自动创建文件。

2.write方法可以写入任何内容文件,在前后文件结构相同的情况下不出现乱码。

原因:

1.write方法可以写入任何类型的字节数据,因为它本质上不关心数据的语义或结构——它只负责将字节序列写入到输出目的地。

2.字节输出流是字节为中心的,它不涉及字符编码转换。无论你传递给它的是文本数据、

图片视频还是其他任何二进制文件,他都会写入这些字节

5. 文件复制demo

字节流适合做数据的转移,如:文件复制等

使用字节输入输出流进行文件复制,适用于任何文件:
import java.io.FileInputStream;
import java.io.FileOutputStream;public class Main {public static void main(String[] args) throws Exception {//目的:完成复制文件的操作;这里举例一张图片的复制;//基本思路://1.字节输入流连通源文件//2.字节输出流连通目标文件//3.将读入的字节放到字节数组中,再写入到目标文件中FileInputStream is = new FileInputStream("C:\\Users\\11067\\Pictures\\Screenshots\\屏幕截图 2023-10-20 175018.png");FileOutputStream os = new FileOutputStream("D:\\学习文档\\屏幕截图 2023-10-20 175018.png");//1.不管文件多大,直接用数组装
//        byte[] buffer = new byte[3];
//        int len;
//        while((len = is.read(buffer)) != -1){
//            os.write(buffer,0,len);
//        }
//        System.out.println("复制完成!");//2.直接用readAllBytesbyte[] buffer = is.readAllBytes();os.write(buffer);System.out.println("复制完成!");os.close();is.close();}
}

6. 释放资源的方式

 最初,我们会手动的用close方法释放资源对象,但是如果在释放前程序异常终止,那么资源就得不到释放,已知占用内存,此时就提出了:try-catch-finally(用于捕获异常,并且不论是否有异常,程序都可以执行finally区去释放资源对象,除非JVM终止),如:

这是一段核心代码,可见他的结构臃肿,不方便。因此,我们又提出了 try-with-resouces,使用框架:

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

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

相关文章

嵌入式Linux学习第四天启动方式学习

嵌入式Linux学习第四天 今天学习I.MX6U 启动方式详解。I.MX6U有多种启动方式&#xff0c;可以从 SD/EMMC、NAND Flash、QSPI Flash等启动。 启动方式选择 BOOT 的处理过程是发生在 I.MX6U 芯片上电以后&#xff0c;芯片会根据 BOOT_MODE[1:0]的设置来选择 BOOT 方式。BOOT_M…

Linux——基础IO2

引入 之前在Linux——基础IO(1)中我们讲的都是(进程打开的文件)被打开的文件 那些未被打开的文件呢&#xff1f; 大部分的文件都是没有被打开的文件&#xff0c;这些文件在哪保存&#xff1f;磁盘(SSD) OS要不要管理磁盘上的文件&#xff1f;(如何让OS快速定位一个文件) 要…

数据仓库与数据挖掘实验练习3-4(实验二2024.5.8)

练习3 1.简单文件操作练习 import pandas as pd # 读取文件 pd.read_csv(pokemon.csv) # 读取 CSV 文件的函数调用&#xff0c;它将文件中的数据加载到 DataFrame 中&#xff0c;并指定了 Pokemon 列作为索引列。 pd.read_csv(pokemon.csv,index_colPokemon)#查看类型 type(p…

React:Router-2. createBrowserRouter函数式

参考文档&#xff1a;ReactRouter官网 前边的文章 BrowserRouter组件式路由 提供了组件式路由的方式&#xff0c;在react-router6.4.0及以上版本&#xff0c;提供了 createBrowserRouter 函数式路由创建方式。 一、创建路由 1. 新建router.js文件&#xff0c;使用createBrow…

十二届蓝桥杯Python组1月中/高级试题 第五题

** 十二届蓝桥杯Python组1月中/高级试题 第五题 ** 第五题&#xff08;难度系数 5&#xff0c;35 个计分点&#xff09; 提示信息&#xff1a; 平均数&#xff1a;是指在一组数据中所有数据之和再除以这组数据的个数。 如&#xff1a;“1&#xff0c;2&#xff0c;3&#xf…

命令行方式将mysql数据库迁移到达梦数据库(全步骤)

因项目需求&#xff0c;需要将mysql数据库转换为国产达梦数据库&#xff0c;但由于安全问题&#xff0c;正式环境只能用命令行方式连接&#xff0c;下列是操作全步骤 目录 一、操作逻辑二、操作步骤1、本地安装达梦相关工具2、将服务器mysql导出到本地a) 服务器命令行导出mysql…

如何添加、编辑、调整WordPress菜单

我们最近在使用WordPress建站建设公司网站。我们是使用的hostease的主机产品建设的WordPress网站。在建设网站使用遇到了一些WordPress菜单使用方面的问题。好在hostease提供了不少帮助。 下面把WordPress菜单使用心得分享一下。 本文将详细介绍WordPress菜单的各种功能&#x…

音频录制软件有哪些?这2种推荐给你

音频在当今数字化世界中扮演着至关重要的角色。无论是音乐创作、语音记录、会议记录还是其他任何需要捕捉声音的场景&#xff0c;音频录制软件都是能为我们提供强大功能的工具。 那么到底哪一种软件才最适合您呢&#xff1f;下面小编将为您介绍2款音频录制软件。 方法一&#…

Ansys Mechanical|绳索仿真技术

绳索&#xff0c;俗称绳子&#xff0c;是通过扭或编等方式加强后&#xff0c;连成一定长度的纤维。其拉伸强度很好但没有压缩强度&#xff0c;可用来做连接、牵引的工具。绳索的用途数不胜数&#xff1a;从建筑中的材料固定、到岩土工程中的柔性锚索、汽车门窗的升降拉索、电缆…

在系统学习C语言之前所需要了解的知识

C语言常见概念 前言1. C语言是什么2. C语言的历史和辉煌3. 编译器的选择VS20223.1 编译和链接3.2 编译器的对比3.3 VS2022的优缺点优点&#xff1a;缺点&#xff1a; 4. VS项目和源文件、头文件介绍5. 第⼀个C语言程序6. main函数7. printf和库函数8. 关键字介绍9. 字符和ASCII…

Spring Cloud Kubernetes 本地开发环境调试

一、Spring Cloud Kubernetes 本地开发环境调试 上面文章使用 Spring Cloud Kubernetes 在 k8s 环境中实现了服务注册发现、服务动态配置&#xff0c;但是需要放在 k8s 环境中才能正常使用&#xff0c;在本地开发环境中可能没有 k8s 环境&#xff0c;如何本地开发调试呢&#…

【优选算法】—Leetcode—11—— 盛最多水的容器

1.题目 11. 盛最多水的容器 给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 说明&#…

探索MySQL数学宝库:常用数学函数的秘密操作

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 探索MySQL数学宝库&#xff1a;常用数学函数的秘密操作 前言ABS函数&#xff08;绝对值&#xff09;ROUND函数&#xff08;四舍五入&#xff09;CEIL和FLOOR函数&#xff08;向上取整和向下取整&#…

酷开科技AI技术支持,酷开系统根据你的喜好量身定制节目

在当今数字化时代&#xff0c;个性化推荐已成为提升消费者体验的关键因素。酷开科技的智慧AI&#xff0c;为消费者提供了精彩的内容推荐服务&#xff0c;更大地丰富了消费者的娱乐生活。 酷开系统中的AI推荐引擎通过学习消费者的观看习惯和偏好&#xff0c;能够快速识别其兴趣…

【C++】-【QT】类库使用-001

1主窗口创建 1.1【makefile】配置 1 源码 QT widgetsSOURCES main.cpp2 图示 1.2源码 1 源码 #include <QWidget> #include <QApplication>using namespace std;int main(int argc,char *argv[]) {QApplication a(argc,argv);QWidget w;w.show();return a…

nginx代理原理(端口复用)探究

前言&#xff1a;对于一些常用的插件&#xff0c;我们应该学会如何使用。同时&#xff0c;其实现原理也要进行深究&#xff0c;可以为其他的项目开发做借鉴。 探究方案&#xff1a; 一、发布两个不同的服务&#xff0c;这两个服务的端口不致 二、配置nginx&#xff0c;让这两…

C语言——文件描述符、系统调用操作文件

文件描述符 在Unix-like操作系统中&#xff0c;文件描述符&#xff08;file descriptor&#xff09;是一个用于标识打开文件或I/O设备的整数值。它是对底层文件系统的抽象&#xff0c;用于在应用程序和操作系统之间传递文件信息。 文件描述符是一个非负整数&#xff0c;通常是…

透明桌面便签便笺怎么设置 透明的便签在哪

在繁忙的工作与生活中&#xff0c;我一直渴望找到一种能够轻松管理待办事项的方式。最近&#xff0c;我发现了一个让我爱不释手的工具。它不仅有着出色的提醒功能&#xff0c;更独特的是&#xff0c;它提供了透明便签的设计。 那么&#xff0c;透明便签的好处究竟有哪些呢&…

第十三届蓝桥杯决赛(国赛)真题 Java A 组【原卷】

文章目录 发现宝藏【考生须知】试题 A: 火柴棒数字试题 B: 小蓝与钥匙试题 C: 内存空间试题 D: 斐波那契数组试题 E: 交通信号试题 F: 数组个数试题 G: 六六大顺试题 H : \mathrm{H}: H: 选素数试题 I: 图书借阅试题 J \mathrm{J} J : 括号序列树 发现宝藏 前些天发现了一个…

EPSON推出可定制晶振技术支持

什么叫做定制晶振呢?定制晶振又可以称为订制&#xff0c;订做晶振&#xff0c;爱普生可编程晶振可在0.67MHz~166MHz频率范围内实现任意频率烧录订制。定制频率晶振是基于PLL技术的一次频率烧录的振荡器&#xff0c;在没有温补的情况下也能够产生稳定的频率输出。单CMOS频率输出…