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

网站建设岗位茂名百度seo公司

网站建设岗位,茂名百度seo公司,宽带公司,如何自己创建购物网站文章目录1. 前言2. 字符输入流3. 字符输出流4. 字符流底层原理解析4.1 字符输入流4.2 字符输出流1. 前言 在上一篇字符集详解中我们说到了产生乱码的原因,要么是读取数据时未读完整个汉字,要么是因为编码和解码的方式不统一,对于后者我们只需…

文章目录

  • 1. 前言
  • 2. 字符输入流
  • 3. 字符输出流
  • 4. 字符流底层原理解析
    • 4.1 字符输入流
    • 4.2 字符输出流

1. 前言

在上一篇字符集详解中我们说到了产生乱码的原因,要么是读取数据时未读完整个汉字,要么是因为编码和解码的方式不统一,对于后者我们只需要规定好编码和解码的方式,而要解决读取数据时未读完整个汉字的问题,我们必须要有一个在遇到汉字时一次读取多个字节的方法,字符流应运而生。

其实,字符流的底层依然是字节流的方式,在读取英文等字符时一次读取一个字节,不同的是,当遇到中文时,会一次读取多个字节。我们已经学习了字节流中的文件 FileOutputStream 类和 FileInputStream 类,现在我们可以按照前面的方法继续学习。

image-20230116215921721

首先,在字符流中有两个基本类,分别是字符输入流 Reader 类和字符输出流 Writer 类,这两个类都是抽象类,不能实例化对象,我们一般使用其子类创建对象完成数据的写出和读取。

2. 字符输入流

我们可以使用字符输入流 FileReader 把本地文件中的数据读取到程序中,该类在使用时分为以下三个步骤:

  1. 创建流对象
  2. 读取数据
  3. 释放资源/关流

示例:

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;public class Test {public static void main(String[] args) throws IOException {//创建流对象FileReader fileReader = new FileReader("test.txt");//读取数据int b;while((b=fileReader.read())!=-1){System.out.print((char)b);}//释放资源fileReader.close();}
}

在 read() 方法中,程序会把读取到的数据进行解码并转换成 字符集表中对应的十进制数,其底层还是字节流的方式,只是在遇到中文时一次读取多个字节并解码转为字符集表中对应的十进制数。程序中的异常直接抛出即可。

同样,我们也可以往 read() 方法中传入一个数组,表示一次读取多个字符并存入数组中,与空参的 read() 方法不同的是,带参数的方法返回每次读取的数据个数,这个数字由数组的大小决定。读取到文件末尾时返回 -1。

示例:

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;public class Test {public static void main(String[] args) throws IOException {//创建流对象FileReader fileReader = new FileReader("test.txt");//读取数据char[] chars = new char[2];int len;while((len=fileReader.read(chars))!=-1){System.out.println(new String(chars,0,len));}//释放资源fileReader.close();}
}

读取数据是一个解码的过程。

3. 字符输出流

使用字符输出流 FileWriter 往本地文件中写出数据有两种方式:

  • 清空文件,把数据写入文件中
  • 把数据追加到文件末尾

在创建 FileWriter 类对象时,参数既可以是 String 类型也可以是 File 类对象,如果传入String 类型,其底层同样会创建 File 类对象。写入数据时,如果文件不存在,则会创建文件并写入数据,但是要保证父级路径正确,如果文件存在,默认会清空 文件并写入数据,如果想要追加写入,则传入参数 true 。

示例:

import java.io.FileWriter;
import java.io.IOException;public class Test {public static void main(String[] args) throws IOException {//创建流对象FileWriter fileWriter = new FileWriter("test.txt",true);String s="Java你好";char[] chars=s.toCharArray();//写入数据fileWriter.write(97);//写出一个字符fileWriter.write(s);//写出一个字符串fileWriter.write(s,1,2);//写出一个字符串的一部分fileWriter.write(chars);//写出一个字符数组fileWriter.write(chars,2,3);//写出一个字符数组的一部分//释放资源fileWriter.close();}
}

写出一个字符时,write() 方法传入的参数是要写入文件的字符在字符集中对应的十进制数,写出数据其实是一个编码的过程。

4. 字符流底层原理解析

接下来我们一起探讨一下字符流的底层原理,

4.1 字符输入流

当我们创建一个文件字符输入流的对象时,其底层会在内存中创建一个缓冲区,该缓冲区是一个大小为 8192 的字节数组,在读取数据时,Java 首先会判断缓冲区中是否有数据,如果缓冲区中没有数据,则会从文件中读取数据,并且尽量充满缓冲区,如果缓冲区中有数据,则会从缓冲区中读取数据,直到读取完该区的数据,Java 会继续从文件中往缓冲区读取数据并且尽量充满缓冲区,直到读取到文件末尾,返回 -1。

使用Debug的方法查看缓冲区:

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;public class Test {public static void main(String[] args) throws IOException {//创建流对象FileReader fileReader = new FileReader("test.txt");//读取数据fileReader.read();//释放资源fileReader.close();}
}

image-20230116234500447

4.2 字符输出流

同样的,在我们创建文件字符输出流的同时,其底层会在内存中创建一个大小为 8192 的缓冲区,该缓冲区是一个字节数组。在写出数据时,首先会把数据按照UTF-8 的编码方式编码,然后写到这个缓冲区中,那么什么时候数据会被写到文件中呢?

image-20230116234043097

以下三种情况缓冲区数据会被写入文件:

  1. 缓冲区装满了
  2. 调用成员方法 flush() 刷新
  3. 关流

我们下期见!

http://www.dtcms.com/wzjs/459495.html

相关文章:

  • wordpress网站弹出垃圾广告最新免费网站收录提交入口
  • 网站开发建设专业短视频关键词优化
  • 手机网站建设语言app拉新推广一手接单平台
  • 做网站推广邢台什么叫seo
  • 如何建网站快捷方式近两年网络营销成功案例
  • 怎么用支付宝做发卡网站手机网站怎么优化关键词
  • 网站建设需要什么设备搜索推广公司
  • 软件网站建设长春网站建设公司哪家好
  • wordpress 创建自定义面板类文件刷关键词优化排名
  • 个人网站设计论文摘要安徽网络优化公司
  • 如何做色流量网站网站搜索引擎
  • 地方门户南宁优化网站网络服务
  • 北京网站制作网络营销策划书的结构
  • 色彩搭配 网站成都网站制作关键词推广排名
  • 信誉好的东莞网站建设优化营商环境心得体会
  • 如何申请域名注册长春网站优化指导
  • 重庆网站建设网站自助建站网站模板
  • 前端用什么框架做网站关键词挖掘查询工具
  • 壮族自治区桂林疫情情况 最新消息湖南竞价优化哪家好
  • 手机网站什么意思萧山区seo关键词排名
  • 自己怎做网站网页设计参考网站
  • 有没有电商设计的网站参考宽带推广方案
  • 在线做venn图网站如何策划一个营销方案
  • 做网站公司 汉狮网络seo公司厦门
  • 专门做市场调查的网站北京网站优化体验
  • 这样做的网站百度的网址是什么
  • 互联壹佰做企业网站10条重大新闻事件
  • 中国网站建设公司有哪些方面前端优化
  • 餐饮网站建设教程建站模板平台
  • 网站建设和管理的总结怎么写哈尔滨网站建设