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.hqwc.cn/news/678863.html

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

相关文章

理解DPI:从数码到打印的深入分析

目录标题 1. DPI的定义2. DPI与图像质量2.1. 对于打印来说&#xff1a;2.2. 对于屏幕显示来说&#xff1a; 3. 如何计算DPI4. 调整DPI4.1. 提高DPI&#xff1a;4.2. 降低DPI&#xff1a; 5. DPI与图像文件大小的关系6. 实际应用中的DPI6.1. 专业打印&#xff1a;6.2. 屏幕设计&…

如何在Ubuntu系统上定制文件系统

基于全志T507H处理器设计研发的OKT507-C开发板为例进行介绍。 Forlinx Desktop(Ubuntu)系统基于Ubuntu官方为嵌入式设备制作的操作系统-Lubuntu&#xff0c;该操作系统具备apt-get、ldd等常用的命令&#xff0c;若需要安装软件则直接apt-get在线安装即可&#xff0c;不需进行交…

DDPM与扩散模型

很早之前就新建了一个专栏从0开始弃坑扩散模型 ,但发了一篇文章就没有继续这一系列&#xff0c;在这个AIGC的时代&#xff0c;于是我准备重启这个专栏。 整个专栏的学习顺序可以见这篇汇总文章 这是本专栏的第一章 目录 引言生成模型的发展历程 引言 扩散模型( Diffusion Mode…

数据结构-线性表-链表-2.3-6

有一个带头结点的单链表L&#xff0c;设计一个算法使其元素递增有序。 void sort(Linklist &L){LNode *pL->next,*pre;LNode *rp->next;p->nextNULL;pr;while(p){rp->next;preL;while(pre->next!NULL&&pre->next->data<p->data){prepre…

ACM实训冲刺第一天

目录 ACM实训课程考核 考核内容 备赛安排 推荐学习资源 ACM实训准备规划 前话 历届习题&#xff08;未曾改变&#xff09; 第0套 第1套 第2套 第3套 第4套 规划 5.8 - 5.12 &#xff08;11周&#xff09; 5.13-5.19&#xff08;12周&#xff09; 5.20-5.26&…

【计算机毕业设计】基于SSM++jsp的菜匣子优选系统【源码+lw+部署文档+讲解】

目录 第一章 绪 论 第二章 关键技术的研究 2.1 JSP技术介绍 2.2 JAVA简介 2.3 ECLIPSE 开发环境 2.4 Tomcat服务器 2.5 MySQL数据库 第三章 系统分析 3.1 系统设计目标 3.2 系统可行性分析 3.3 系统功能分析和描述 3.4系统UML用例分析 3.4.1管理员用例 3.4.2用户用例 3.5系统流…

远动通讯屏的作用

远动通讯屏的作用 远动通讯屏有时有称为调度数据网柜&#xff0c;远动通讯屏具体干啥作用&#xff1f;远动通讯屏是以计算机为基础的生产过程与调度自动化系统&#xff0c;可以对现场的运行设备进行监视和控制、以实现数据采集、设备测量、参数调节以及各类信号报警等各项功能。…

【Android】源码解析Activity的结构分析

源码解析Activity的结构分析 目录 1、Activity、View、Window有什么关联&#xff1f;2、Activity的结构构建流程3 源码解析Activity的构成 3.1 Activity的Attach方法3.2 Activity的OnCreate 4、WindowManager与View的关系总结 1、一个Activity对应几个WindowManage&#xff0…

软考143-下午题-【试题二】:E-R图、关系模式

一、分值与目标 15分&#xff0c;目标10 二、题目形式 示例&#xff1a; 三、E-R图的基本图形元素 示例&#xff1a; 3-1、实体 1、弱实体 在现实世界中有一种特殊的联系&#xff0c;这种联系代表实体间的所有 (Ownership) 关系&#xff0c;例如&#xff1a;职工与家属的联系…

Tuxera NTFS for Mac Mac用户无缝地读写NTFS格式的硬盘和U盘

在数字化时代&#xff0c;数据交换和共享变得日益重要。然而&#xff0c;对于Mac用户来说&#xff0c;与Windows系统之间的文件交换可能会遇到一些挑战。这是因为Mac OS默认不支持Windows常用的NTFS文件系统。幸运的是&#xff0c;Tuxera NTFS for Mac为我们提供了一个优雅的解…

使用电路仿真软件教学的优势分析

随着科技的飞速发展&#xff0c;电子工程领域对人才的需求与日俱增。为了满足这一需求&#xff0c;教育者们不断探索着更加高效、直观的教学方法。电路仿真软件的出现&#xff0c;为电子工程教学注入了新的活力&#xff0c;它以其独特的优势&#xff0c;成为现代电子工程教育中…

C语言 函数的嵌套与递归 调用

本文 我们来说函数的嵌套调用和递归调用 在很多大型项目中 我们肯定不可能将所有逻辑都写在一个函数中 肯定要按功能拆解成多个特定的功能函数 函数并不允许嵌套调用&#xff0c;但是 允许在逻辑代码中嵌套调用 所谓函数嵌套调用 就是在一个函数中调用另一个函数&#xff0c;而…