Java中的字符流

字符流=字节流+编码表

Java为什么可以区分字母和汉字

package day3;
​
import java.io.UnsupportedEncodingException;
import java.lang.reflect.Array;
import java.util.Arrays;
​
public class Test {
    public static void main(String[] args) throws UnsupportedEncodingException {
        String s1="abc";
        String s2="你好";
        byte[] byt1 = s1.getBytes();
        byte[] byt2 = s2.getBytes();
        byte[] byt3 = s2.getBytes("GBK");
​
        System.out.println(Arrays.toString(byt1));
        System.out.println(Arrays.toString(byt2));
        System.out.println(Arrays.toString(byt3));
    }
}
​

我们发现中文都是负数 而英文都是正数

UFT-8中 三个字节对应一个中文字

GBK里面两个字节对应一个中文字

字符流的乱码现象

package day3;
​
import java.io.UnsupportedEncodingException;
import java.lang.reflect.Array;
import java.util.Arrays;
​
public class Test {
    public static void main(String[] args) throws UnsupportedEncodingException {
        String s1 = new String("你好");
        byte[] bytes = s1.getBytes("UTF-8");
        String s2 = new String(bytes,"GBK");
        System.out.println(s2);
    }
}
​

为什么会产生乱码现象呢?

因为将字符串转换成字节数组的时候用的是UTF-8一个汉字三个字节

而将字节数组转换为字符的时候我们用的是GBK两个字节 一个汉字

当两者都是一样的时候不会乱码

package day3;
​
import java.io.UnsupportedEncodingException;
import java.lang.reflect.Array;
import java.util.Arrays;
​
public class Test {
    public static void main(String[] args) throws UnsupportedEncodingException {
        String s1 = new String("你好");
        byte[] bytes1 = s1.getBytes("UTF-8");
        String s2 = new String(bytes1,"UTF-8");
        System.out.println(s2);
        byte[] bytes2 = s1.getBytes("GBK");
        String s3 = new String(bytes2,"GBK");
        System.out.println(s3);
    }
}
​

*Java中默认采用UTF-8

字符流写数据的五种方式

  1. void write(int c)写一个字符

  2. void write(char[] cbuf)写入一个字符数组

  3. void write(char[] cbuf,int off,int len)写入一个字符数组的一部分

  4. voif write(String str)写入一个字符串

  5. void (String str,int off,int len)写入一个字符串的一部分

package day3;
​
import java.io.*;
​
public class Test {
    public static void main(String[] args) throws IOException {
        FileOutputStream fos = new FileOutputStream("write.txt");
        OutputStreamWriter osw = new OutputStreamWriter(fos);
        osw.write(97);
        osw.write(98);
        osw.write(99);
        osw.flush();
        char[] c = {'\n','c','b','s'};
        osw.write(c);
        osw.flush();
        osw.write("\nhello\n");
        osw.write("wworldd",1,5);
        osw.close();
    }
}
​

注意: 字符流写完要输出刷新 不然文本上不会有显示 close()是先刷新再关闭 所有close()有刷新的功能

字符流读数据

  1. int read()一次读一个数据

  2. int read(char[] cbuf)一次读一个字符串数组

package day3;
​
import java.io.*;
​
public class Test {
    public static void main(String[] args) throws IOException {
        FileInputStream fis = new FileInputStream("write.txt");
        InputStreamReader isr = new InputStreamReader(fis);
        int r;
        while ((r=isr.read())!=-1){
            System.out.print((char)r);
        }
        char[] c = new char[1024];
        isr.close();
    }
}
​
package day3;
​
import java.io.*;
​
public class Test {
    public static void main(String[] args) throws IOException {
        FileInputStream fis = new FileInputStream("write.txt");
        InputStreamReader isr = new InputStreamReader(fis);
        char[] c = new char[1024];
        int len;
        while ((len=isr.read(c))!=-1){
            System.out.println(new String(c,0,len));
        }
        isr.close();
    }
}
​

两种读的方式

字符缓冲流

BufferedWriter 将文本写入字符输出流中

BufferedReader 从字符输入流读取文本

package day3;
​
import java.io.*;
​
public class Test {
    public static void main(String[] args) throws IOException {
        FileWriter fw = new FileWriter("write.txt");
        BufferedWriter bw = new BufferedWriter(fw);
        bw.write("hello\n");
        bw.flush();
        FileReader fr = new FileReader("write.txt");
        BufferedReader br = new BufferedReader(fr);
        char[] ch = new char[1024];
        int len;
        while ((len=br.read(ch))!=-1){
            System.out.println(new String(ch,0,len));
        }
        br.close();
        bw.close();
    }
}
​

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

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

相关文章

【Mybatis 】什么是mybatis?如何在普通项目中使用?(超详细建议收藏)

文章目录 mybatis第一章1、什么是mybatis2、idea中配置环境3、创建一个普通工程 第二章1、mybatis基本步骤2、导入log4j日志3、使用lombok注解4、mapper.xml文件详情1、parameterType属性2、resultType属性 5、对实体包进行扫描6、SQL语句中的占位符及转义符7、接口方法包含多个…

Flutter笔记:Widgets Easier组件库(5)使用加减器

Flutter笔记 Widgets Easier组件库(5):使用加减器 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite:http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress…

【校招】校园招聘中的签约环节,面完HR后的流程(意向书,offer选择与三方协议)

【校招】校园招聘中的签约环节,面完HR后的流程(意向书,offer选择与三方协议) 文章目录 一、面完HR后的流程1、口头oc、谈薪(两个电话)2、邮件意向书、带薪offer(两封邮件)3、签三方&…

算法训练营第十三天 | LeetCode 239 滑动窗口最大值、LeetCode 347 前K个高频元素

LeetCode 239 滑动窗口最大值 本体初始思路是这样的,首先看下给定数组长度和维持一个滑动窗口所需要花费的时间复杂度之间的关系。初步判断是还行的,当然后面被样例打脸了。需要更新成优先队列的解法。原本的解法能通过37/51和46/51的测试用例。但这还不…

基于Spring Boot的校园疫情防控系统设计与实现

基于Spring Boot的校园疫情防控系统设计与实现 开发语言:Java框架:springbootJDK版本:JDK1.8数据库工具:Navicat11开发软件:eclipse/myeclipse/idea 系统部分展示 管理员登录首页界面图,管理员进入校园疫…

AI大模型探索之路-训练篇10:大语言模型Transformer库-Tokenizer组件实践

系列篇章💥 AI大模型探索之路-训练篇1:大语言模型微调基础认知 AI大模型探索之路-训练篇2:大语言模型预训练基础认知 AI大模型探索之路-训练篇3:大语言模型全景解读 AI大模型探索之路-训练篇4:大语言模型训练数据集概…

msmpi 高性能并行计算 移植并行细胞自动机报错

报错情况如图 代码来源 元胞自动机生命游戏C语言并行实现 – OmegaXYZ 稍微修改,因为相对路径在 msmpi 10.1.1 中失效 Microsoft Windows [版本 10.0.22000.2538] (c) Microsoft Corporation。保留所有权利。C:\Users\ASUS>mpiexec -n 9 "C:\Users\ASUS\D…

四信数字孪生水库解决方案,加快构建现代化水库运行管理矩阵

近年,水利部先后出台《关于加快构建现代化水库运行管理矩阵的指导意见》与《构建现代化水库运行管理矩阵先行先试工作方案》等文件,明确总体要求及试点水库、先行区域建设技术要求等,为全面推进现代化水库运行管理矩阵建设工作提供依据。 《2…

自定义Maven项目模板Archetype,快速创建模板项目。

自定义Archetype 创建好模板项目,在项目根目录执行命令对模板做出响应调整将模板安装到本地、远程仓库使用自定义模板 创建好模板项目,在项目根目录执行命令 mvn archetype:create-from-project对模板做出响应调整 如果是多模块项目,可能需…

【数据结构】:链表的带环问题

🎁个人主页:我们的五年 🔍系列专栏:数据结构 🌷追光的人,终会万丈光芒 前言: 链表的带环问题在链表中是一类比较难的问题,它对我们的思维有一个比较高的要求,但是这一类…

【模板】前缀和

原题链接:登录—专业IT笔试面试备考平台_牛客网 目录 1. 题目描述 2. 思路分析 3. 代码实现 1. 题目描述 2. 思路分析 前缀和模板题。 前缀和中数组下标为1~n。 前缀和:pre[i]pre[i-1]a[i]; 某段区间 [l,r]的和:pre[r]-pre[l-1] 3.…

【C语言】atoi和atof函数的使用

人生应该树立目标,否则你的精力会白白浪费。💓💓💓 目录 •🌙知识回顾 🍋知识点一:atoi函数的使用和实现 • 🌰1.函数介绍 • 🌰2.代码演示 • 🌰3.atoi函数的…

【高校科研前沿】云南大学陈峰研究员联合多家单位在Sci. Bull发文揭示了明末特大干旱背景下北京降水变化及其以太平洋海温变化为主导的驱动新机制

文章简介 论文名称:Coupled Pacific Rim megadroughts contributed to the fall of the Ming Dynasty’s capital in 1644 CE(环太平洋地区的特大干旱影响了公元 1644 年明朝的灭亡) 第一作者及通讯作者:陈峰研究员&王涛研究…

38-4 Web应用防火墙 - WAF的使用及规则

准备:38-3 Web应用防火墙 - 安装配置WAF-CSDN博客 WAF的使用 启动 Nginx /usr/local/nginx/sbin/nginx 为了测试未启动 ModSecurity 时的访问效果,我们可以模拟攻击。要查看当前虚拟机的 IP 地址,可以使用命令 ifconfig 浏览器中访问ip,如果要在真实机中访问就需要关闭…

Linux 学习 --- 编辑 vi 命令

1、vi 基本概念(了解) 基本上 vi 可以分为三种状态,分别是命令模式 (command mode)、插入模式 (Insert mode) 和底行模式 (last line mode),各模式的功能区分如下: 命令行模式 command mode)  控制屏幕光标的移动&a…

c3 笔记7 css基本语法

相关内容:字体、段落、词间距、文字效果(对齐、上下标、阴影)、背景图、背景渐变、…… 单位pt与px的差别pt是印刷使用的字号单位,不管屏幕分辨率是多少,打印到纸上看起来都是相同的,lot的长度是0.01384英寸…

[PS小技能学习]抠图和切图

详情见视频教程:PS小技巧--抠图与切图 今天我们来学习如何使用PS对表情包合辑进行抠图和裁剪保存 1、首先,将图片导入,双击图层新建一个图层 2、然后点击工具栏的魔棒工具,再点击顶部菜单栏的添加到选区 3、点击图片的空白区域即…

《QT实用小工具·五十一》带动画的 CheckBox

1、概述 源码放在文章末尾 该项目实现了带动画效果的多选框&#xff0c;鼠标放在上面或者选中都会呈现炫酷的动画效果&#xff0c;demo演示如下&#xff1a; 项目部分代码如下所示&#xff1a; #ifndef LINEARCHECKBOX_H #define LINEARCHECKBOX_H#include <QCheckBox> …

C/C++不定参函数使用

C语言中不定参函数的使用和访问 例子 例如&#xff0c;这里想写一个打印的函数&#xff0c;但是参数并不确定该怎么办呢&#xff0c;这就要用到不定参函数 #include<stdarg.h> void printNum(int count,...){va_list ap;va_start(ap,count);//获取指定参数的起始地址&…

【CTF Reverse】XCTF GFSJ0492 insanity Writeup(反汇编+字符串搜索)

insanity 菜鸡觉得前面的题目太难了&#xff0c;来个简单的缓一下 解法 拖进 Exeinfo PE 中分析。 -> Compiler : GCC: (Debian 4.4.7-2) 4.4.7用 IDA 打开。 按 shift F12 打开 String 页面。找到 flag。 Flag 9447{This_is_a_flag}声明 本博客上发布的所有关于网络攻…