Java中的字符流

news2024/12/23 16:22:26

字符流=字节流+编码表

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();
    }
}
​

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

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

相关文章

文件批量高效管理,批量将PDF类型文件移动到指定文件夹里,实现文件高效管理

文件的管理与整理成为了我们生活中不可或缺的一部分。面对堆积如山的PDF文件,你是否也曾感到手足无措、焦头烂额?现在,有了我们的批量文件管理工具,PDF文件的管理将变得前所未有的高效与简单! 首先,我们要…

用龙梦迷你电脑福珑2.0做web服务器

用龙梦迷你电脑福珑2.0上做web服务器是可行的。已将一个网站源码放到该电脑,在局域网里可以访问网站网页。另外通过在同一局域网内的一台windows10电脑上安装花生壳软件,也可以在外网访问该内网服务器网站网页。该电脑的操作系统属于LAMP。在该电脑上安装…

Android 开发部分基础工具使用

c调试 在NDK调试的时候,如果找不到 符号的话,我们可以在调试配置中添加符号地址的全路径一直到根目录:,xxx/armeabi-v7a: You must point the symbol search paths at the obj/local/ directory. This is also not a …

C++奇迹之旅:C++内存管理的机制初篇

文章目录 📝C/C内存分布🌠 C语言中动态内存管理方式🌉C内存管理方式 🌠new/delete操作内置类型🌉C与C链表构建对比 🚩总结 📝C/C内存分布 这是C/C中程序内存区域划分图: 数据段&am…

基于springboot+vue+Mysql的网上商城购物系统

开发语言:Java框架:springbootJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:…

蓝桥杯练习系统(算法训练)ALGO-951 预备爷的悲剧

资源限制 内存限制:512.0MB C/C时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s 问题描述 英语预备爷gzp是个逗(tu)比(hao),为了在即将到来的英语的quiz中不挂科,gzp废寝忘食复习英语附录单词…

V23 中的新增功能:LEADTOOLS React Medical Web 查看器

LEADTOOLS (Lead Technology)由Moe Daher and Rich Little创建于1990年,其总部设在北卡罗来纳州夏洛特。LEAD的建立是为了使Daher先生在数码图象与压缩技术领域的发明面向市场。在过去超过30年的发展历程中,LEAD以其在全世界主要国家中占有的市场领导地位…

JUC常见类

背景 JUC是java.util.concurrent的简称,这个包里面存放的都是和多线程相关的类,在面试中非常的重要 目录 1.Callable接口 2.ReentrantLock 3.信号量Semaphore 4.CountDownLatch 5.集合的线程安全问题 1.Callable接口 1.1.认识Callable接口 &#x…

phpstudy 搭建 upload-labs 文件上传靶场

phpstudy 搭建靶场:下载安装好phpstudy后,下载靶场源码: upload-labs下载地址: https://github.com/c0ny1/upload-labs 下载完压缩文件,解压文件,解压后的文件夹命名为upload--labs 将解压后到文件夹放…

爱普生晶振在物联网LoRa通讯中的应用

LoRa 是LPWAN通信技术中的一种,是美国Semtech公司采用和推广的一种基于扩频技术的超远距离无线传输方案。这一方案改变了以往关于传输距离与功耗的折衷考虑方式,为用户提供一种简单的能实现远距离、长电池寿命、大容量的系统,进而扩展传感网络…

频分复用系统设计及其MATLAB实现

引言 随着通信技术的飞速发展,通信系统的容量需求不断增长。频分复用(Frequency Division Multiplexing, FDM)作为一种重要的多路复用技术,被广泛应用于现代通信系统中。本文将介绍频分复用系统的设计原理,并展示如何…

springboot 自动配置源码解读

什么是自动装配 当我们程序依赖第三方功能组件时,不需要手动将这些组件类加载到IOC容器中。例如 当程序需要用到redis时,在pom.xml文件中引入依赖,然后使用依赖注入的方式直接从IOC容器中拿到相应RedisTemplate实例。 SpringBootApplication …

cuda非root用户安装及mamba库安装报错问题

1、先检查是不是cuda版本的问题(cuda≥11.6) 非root用户安装指南: (1)先去NVIDIA官网CUDA Toolkit Archive | NVIDIA Developer 选一个版本 查看architecture的命令 uname -m 查看version的命令 lsb_release -a 下…

探索AIGC技术:创新、挑战与责任

🎥 个人主页:Dikz12📕格言:那些在暗处执拗生长的花,终有一日会馥郁传香欢迎大家👍点赞✍评论⭐收藏 #如何看待AIGC技术? 目录 AIGC简单介绍 创新 责任 未来展望和挑战 AIGC简单介绍 A…

34.基础乐理-简谱需要移调吗?

首先需要具备 首调 与 固定调的知识,才能理解,以两只老虎为例子,如下图: 首调:可以看到C大调、D大调、E大调三种方式的乐谱,记录的数字,记录的唱名,都是1231,唯一不同的…

深度学习中的归一化:BN,LN,IN,GN的优缺点

目录 深度学习中归一化的作用常见归一化的优缺点 深度学习中归一化的作用 加速训练过程 归一化可以加速深度学习模型的训练过程。通过调整输入数据的尺度,归一化有助于改善优化算法的收敛速度。这是因为归一化后的数据具有相似的尺度,使得梯度下降等优化…

开源框架 NanUI 项目宣布将暂停开发,作者转行卖钢材

NanUI 界面组件是一个开源的 .NET 窗体应用程序界面框架,适用于希望使用 HTML5 / CSS3 等前端技术来构建 Windows 窗体应用程序用户界面的 .NET 开发人员。 该项目的作者林选臣日前在 GitHub 上发布了停更公告,称因去年被裁员失业,他目前已经…

VBA技术资料MF147:从Excel运行PowerPoint演示文稿

我给VBA的定义:VBA是个人小型自动化处理的有效工具。利用好了,可以大大提高自己的工作效率,而且可以提高数据的准确度。“VBA语言専攻”提供的教程一共九套,分为初级、中级、高级三大部分,教程是对VBA的系统讲解&#…

毫米波雷达多人呼吸心跳检测MATLAB仿真

本文基于TI的IWR1642毫米波雷达 2T4R MIMO阵列,通过实际采集数据算法仿真,实现多人呼吸心跳检测。 文章末尾给出了本文的仿真代码。 主要内容包含: (1)雷达参数设定 (2)ADC数据导入 &#xff08…

uniapp0基础编写安卓原生插件和调用第三方jar包和编写语音播报插件之使用jar包插件

前言 如果你不会编写安卓插件,你可以先看看我之前零基础的文章(uniapp0基础编写安卓原生插件和调用第三方jar包和编写语音播报插件之零基础编写安卓插件), 我们使用第三方包,jar包编写安卓插件 开始 把依赖包,放到某个模块的/libs目录(myTestPlug/libs) 还要到build…