Java字符流

news2024/10/5 21:18:26

5 字符流

5.1 为什么出现字符流

  • 由于字节流操作中文不是特别的方便,所以Java就提供字符流
  • 字符流=字节流+编码表
  • 用字节流复制文本文件时,文本文件也会有中文,但是没有问题,原因是最终底层操作会自动进行字节拼接成中文,如何识别是中文的呢?
    • 汉字在存储的时候, 无论选择哪种编码存储,第一个字节都是负数

5.2 字符流中编码解码问题

  • 字符流抽象基类
    • Reader:字符输入流的抽象类
    • Writer:字符输出流的抽象类
  • 字符流中和编码解码问题相关的两个类
    • InputStreamReader
    • OutputStreamWriter
package test;

    /*InputStreamReader:是从字节流到字符流的桥梁
        它读取字节,并使用指定的编码将其解码为字符
        它使用的字符集可以由名称指定,也可以被明确指定,或者可以接受平台的默认字符集
    OutputStreamhriter:是从字符流到字节流的桥梁
        是从字符流到字节流的桥梁,使用指定的编码将写入的字符编码为字节
        它使用的字符集可以由名称指定,也可以被明确指定,或者可以接受平台的默认字符集*/

import java.io.*;

public class Demo {
    public static void main(String[] args) throws IOException {
//        OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("E:\\test\\fos.txt"));
        OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("E:\\test\\fos.txt"),"GBK");
        osw.write("中国");
        osw.close();

//1,        InputStreamReader isr = new InputStreamReader(new FileInputStream("E:\\test\\fos.txt"));
        InputStreamReader isr = new InputStreamReader(new FileInputStream("E:\\test\\fos.txt"),"GBK");
        int ch;
        while((ch= isr.read()) !=-1) {
            System.out.print((char)ch); //1:�й�;2:中国,因为第二次和编码格式GBK一样
        }
        isr.close();
    }
}

5.3 字符输出流

方法名说明
void write(int c)写一个字符
void write(char[ ] cbuf)写一个字符数组
void write(char[ ] cbuf,int off,int len)写一个字符数组的一部分
void write(String str)写一个字符串
void write(String str,int off,int len)写一个字符串的一部分
方法名说明
flush()刷新流还可以写数据
close()关闭流,释放资源,但在关闭之前先刷新。关闭后不能写数据
  • 范例
package test;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;

public class OutputStreamWriterDemo {
    public static void main(String[] args) throws IOException {
        OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("E:\\test\\fos.txt"));

        //1,void write(int c) 	写一个字符
        /*osw.write(97);
        osw.write(98);
        //ab
        //void flush():刷新流
        osw.flush();*/

        //2,void write(char[ ] cbuf) 	写一个字符数组
        /*char[] chs = {'a','b','c'};
//        osw.write(chs);
        //abc

        //3,void write(char[ ] cbuf,int off,int len) 	写一个字符数组的一部分
        osw.write(chs,1, 2); //bc,1索引开始,写两个*/

        //4,void write(String str) 	写一个字符串
//        osw.write("abcef"); //abcef

        //5,void write(String str,int off,int len) 	写一个字符串的一部分
        osw.write("abcdef",0, "abcdef".length()); //abcdef
        osw.close();
    }
}

5.4 字符输入流

方法名说明
int read()一次读一个字符数据
int read(char([ ] cbuf)一次读一个字符数组数据
  • 范例
package test;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;

public class InputStreamReaderDemo {
    public static void main(String[] args) throws IOException {
        InputStreamReader isr = new InputStreamReader(new FileInputStream("E:\\test\\fos.txt"));
        
        //1,int read() 	一次读一个字符数据
        /*int ch;
        while((ch= isr.read()) != -1) {
            System.out.print((char)ch);
//            Java
//            Python
//            Scala
        }*/

        //2,int read(char([ ] cbuf) 	一次读一个字符数组数据
        char[] chs = new char[1024];
        int len;
        while((len= isr.read(chs)) != -1) {
            System.out.print(new String(chs,0,len));
//            Java
//            Python
//            Scala
        }
        isr.close();
    }
}
  • 案例:Copy文件
    在这里插入图片描述
package test;

import java.io.*;

public class CopyJavaDemo {
    public static void main(String[] args) throws IOException {
        FileReader fr = new FileReader("E:\\test\\Demo.java");
        FileWriter fw = new FileWriter("E:\\test\\Demo\\Demo.java");

        //读写数据,一次一个
        /*int ch;
        while((ch=fr.read()) != -1) {
            fw.write(ch);
        }*/

        char[] chs = new char[1024];
        int len;
        while((len=fr.read(chs)) != -1) {
            fw.write(chs,0,len);
        }

        fw.close();
        fr.close();
    }
}

5.5 字符缓冲流

  • BufferedReader:从字符输入流读取文本,缓冲字符,以提供字符,数组和行的高效读取,可以指定缓冲区大小,或者可以使用默认大小。默认值足够大,可用于大多数用途
  • BufferedWriter:将文本写入字符输出流,缓冲字符,以提供单个字符,数组和字符串的高效写入,可以指定缓冲区大小,或者可以接受默认大小。默认值足够大,可用于大多数用途
  • 构造方法
    • BufferedReader(Reader in)
    • BufferedWriter(Writer out)
package test;

import java.io.*;

public class BufferedStreamDemo {
    public static void main(String[] args) throws IOException {
        //2,BufferedWriter(Writer out)
        BufferedWriter bw = new BufferedWriter(new FileWriter("E:\\test\\fos.txt"));
        bw.write("java\r\n");
        bw.write("python\r\n");
        bw.close();
        //java
        // python

        //1,BufferedReader(Reader in)
        BufferedReader br = new BufferedReader(new FileReader("E:\\test\\fos.txt"));
        //一次读一个字符数据
        /*int ch;
        while((ch=br.read()) != -1) {
            System.out.print((char)ch);
//            java
//            python
        }
        br.close();*/

        //一次读一个字符数组
        char[] chs = new char[1024];
        int len;
        while((len=br.read(chs)) != -1) {
            System.out.println(new String(chs,0,len));
//            java
//            python
        }
        br.close();
    }
}

5.6 字符缓冲流特有功能

BufferedReader

  • public String readLine():读一行文字。结果包含行的内容的字符串,不包括任何行终止字符,如果流的结尾已经到达,则为null

BufferedWriter

  • void newLine():写一行行分隔符, 行分隔符字符串由系统属性定义
package test;

import java.io.*;

public class BufferedStreamDemo {
    public static void main(String[] args) throws IOException {
        //创建字符缓冲流输出流
        /*BufferedWriter bw = new BufferedWriter(new FileWriter("E:\\test\\fos.txt"));

        for(int i=0;i<5;i++) {
            bw.write("hello"+i);
//            bw.write("\r\n");
            //2,void newLine():写一行行分隔符, 行分隔符字符串由系统属性定义
            bw.newLine();
            bw.flush();
        }
        bw.close();*/

        //创建字符缓冲输入流对象
        BufferedReader br = new BufferedReader(new FileReader("E:\\test\\fos.txt"));
        //2,public String readLine():读一行文字
        String line;
        while((line=br.readLine()) != null) {
            System.out.println(line);
            /*
            hello0
            hello1
            hello2
            hello3
            hello4*/
        }
        br.close();
    }
}

5.7 字符缓冲流Copy文件(推荐使用)

package test;

import java.io.*;

public class BufferedStreamDemo {
    public static void main(String[] args) throws IOException {
        //根据数据源创建字符缓冲流输入对象
        BufferedReader br = new BufferedReader(new FileReader("E:\\test\\fos.txt"));
        //根据数据源创建字符缓冲流输出对象
        BufferedWriter bw = new BufferedWriter(new FileWriter(("E:\\test\\Demo\\copy.txt")));

        String line;
        while((line=br.readLine()) !=null){
            bw.write(line);
            bw.newLine();
            bw.flush();
        }

        bw.close();
        br.close();
    }
}

5.8 IO流小结

  • 字节流小结
    在这里插入图片描述
    在这里插入图片描述

  • 字符流小结
    在这里插入图片描述
    在这里插入图片描述

5.9 案例大全

  • 案例1:集合到文件
    在这里插入图片描述
package test;

import java.io.*;
import java.util.ArrayList;

public class Demo {
    public static void main(String[] args) throws IOException {
        ArrayList<String> array = new ArrayList<>();

        array.add("java");
        array.add("python");
        array.add("scala");

        BufferedWriter bw = new BufferedWriter(new FileWriter("E:\\test\\java.txt"));

        for(String s:array) {
            bw.write(s);
            bw.newLine();
            bw.flush();
        }

        bw.close();
    }
}
  • 案例2:文件到集合
    在这里插入图片描述
package test;

import java.io.*;
import java.util.ArrayList;

public class Demo {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new FileReader("E:\\test\\java.txt"));

        ArrayList<String> array = new ArrayList<>();

        String line;
        while((line=br.readLine()) !=null) {
            array.add(line);
        }

        br.close();

        for(String s:array) {
            System.out.println(s);
            /*java
            python
            scala*/
        }
    }
}
  • 案例3:点名器
    在这里插入图片描述
package test;

import java.io.*;
import java.util.ArrayList;
import java.util.Random;

public class Demo {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new FileReader("E:\\test\\java.txt"));

        ArrayList<String> array = new ArrayList<>();

        String line;
        while((line=br.readLine()) !=null) {
            array.add(line);
        }

        br.close();

        Random r = new Random();
        int index = r.nextInt(array.size());

        String name = array.get(index);
        System.out.println(name); //第一次:Java;第二次:Python;第三次:Python;第四次:Scala
    }
}
  • 案例4:集合到文件(改进版)
    在这里插入图片描述
package test;

import java.io.*;
import java.util.ArrayList;

public class Demo {
    public static void main(String[] args) throws IOException {
        ArrayList<Student> array = new ArrayList<>();

        Student s1 = new Student("小明",10);
        Student s2 = new Student("小白",20);
        Student s3 = new Student("小黑",30);

        array.add(s1);
        array.add(s2);
        array.add(s3);

        BufferedWriter bw = new BufferedWriter(new FileWriter("E:\\test\\java.txt"));

        for(Student s:array) {
            StringBuilder sb = new StringBuilder();
            sb.append(s.getName()).append(",").append(s.getAge());

            bw.write(sb.toString()); //需要的是一个字符串
            bw.newLine();
            bw.flush();
        }

        bw.close();
        /*小明,10
        小白,20
        小黑,30*/
    }
}
  • 案例5:文件到集合(改进版)
    在这里插入图片描述
package test;

import java.io.*;
import java.util.ArrayList;

public class Demo {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new FileReader("E:\\test\\java.txt"));

        ArrayList<Student> array = new ArrayList<>();

        String line;
        while((line=br.readLine()) != null) {
            String[] strArray = line.split(","); //获取line数据按照逗号进行分割,存入字符串数组

            Student s = new Student();
            s.setName(strArray[0]);
            s.setAge(Integer.parseInt(strArray[1])); //需要的是int类型的数据

            array.add(s);
        }
        br.close();

        for(Student s:array) {
            System.out.println(s.getName()+","+s.getAge()); //字符串转为int
            /*小明,10
            小白,20
            小黑,30*/
        }
    }
}

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

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

相关文章

【面试题】对JS中的事件冒泡、事件捕获、事件委托的理解

大厂面试题分享 面试题库后端面试题库 &#xff08;面试必备&#xff09; 推荐&#xff1a;★★★★★地址&#xff1a;前端面试题库DOM事件流&#xff08;event flow &#xff09;存在三个阶段&#xff1a;事件捕获阶段、处于目标阶段、事件冒泡阶段。Dom标准事件流的触发的先…

ChatGPT的原理:机器人背后的模型

ChatGPT的原理&#xff1a;机器人背后的模型 翻译&#xff1a;老齐 本文将深入讲解支持 ChatGPT 的机器学习模型。从介绍大语言模型&#xff08;Large Language Models&#xff09;开始&#xff0c;深入探讨革命性的自注意力机制&#xff0c;该机制使 GPT-3 得以被训练。然后&a…

数据库查询计划:获取与分类

数据库在得到一个查询后&#xff0c;先将查询转化为一个逻辑查询计划&#xff0c;对其进行优化&#xff0c;然后转为物理执行计划&#xff0c;最后按照物理执行计划进行操作&#xff0c;最终得到最终结果。本篇博客介绍获得数据库查询计划的语法与物理计划的分类。 目录得到查询…

文件描述符fd

目录文件描述符fd系统文件IO接口介绍openclosewriteopen的函数返回值0 & 1 & 2文件描述符的分配规则重定向dup2系统调用FILE文件描述符fd 操作系统是文件的管理者&#xff0c;所有语言上的对“文件”的操作&#xff0c;都必须贯穿OS&#xff0c;又因为操作系统不相信任…

A_A07_003 AS608指纹模块上位机软件使用

A_A07_003 AS608指纹模块上位机软件使用一、软件获取二、测试用模块与接线三、上位机界面分块和功能1、指纹图像显示区域2、硬件信息3、打开设备4、设备配置5、信息显示6、图像管理7、指纹处理8、辅助功能四、注意事项一、软件获取 网盘链接 直戳跳转 二、测试用模块与接线 …

【Kubernetes】【五】资源管理和YML

第三章 资源管理 本章节主要介绍yaml语法和kubernetes的资源管理方式 资源管理介绍 在kubernetes中&#xff0c;所有的内容都抽象为资源&#xff0c;用户需要通过操作资源来管理kubernetes。 ​ kubernetes的本质上就是一个集群系统&#xff0c;用户可以在集群中部署各种服务…

软件测试面试刷题app包含了各种难题

软件测试的生命周期&#xff1a; V模型&#xff1a;与软件开发阶段呼应 软件开发&#xff1a;需求分析-->概要设计-->详细设计-->编码阶段软件测试&#xff1a;单元测试-->集成测试-->系统测试-->验收测试从基本流程的角度讲&#xff1a; 需求阶段&#xff…

Java基础:接口

1.接口的概念 当不是所有子类, 而是多个子类都包含一个方法时, 为了代码书写规范性, 可以用自定义的接口来统一该方法的书写规范. 所以接口可以看作是一种书写规则. 接口是对行为的抽象 抽象类一般是书写在父类当中, 接口是单独书写的, 不是一种类 2.接口的定义和使用 3.接口…

MATLAB/Simulink 通信原理及仿真学习(一)

文章目录MATLAB/Simulink 通信原理及仿真学习&#xff08;一&#xff09;基本操作 (23.2.16)MATLAB 变量矩阵运算画图工具函数函数文件操作MATLAB/Simulink 通信原理及仿真学习&#xff08;一&#xff09; 基本操作 (23.2.16) MATLAB 变量 变量以字母开头&#xff0c;后接字…

Ubuntu16.04搭建Fabric1.4环境

一、换源 为了提高下载速度&#xff0c;将ubuntu的源改成国内的源&#xff08;推荐阿里云源和清华源&#xff09; apt源保存在 /etc/apt/sources.list / 代表根目录 /etc 这个文件夹几乎放置了系统的所有配置文件 1.备份 sudo cp /etc/apt/sources.list sources_backup.l…

媒体邀约之企业如何加强品牌的宣传力度

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。胡老师分享了许多媒体传播方面的经验&#xff0c;今天就跟大家分享下我对企业宣传方面的看法。企业如何加强品牌的宣传力度&#xff1a;1&#xff0c;网络宣传在社交媒体上建立企业账户&am…

Jmeter常用断言之响应断言详解

响应断言是最常用的一种断言方法&#xff0c;主要是对响应结果中的文本内容进行断言&#xff0c;比如响应结果是否包含指定的值&#xff0c;或者是否等于指定的值。响应断言可以适用各种返回类型的响应结果&#xff0c;如&#xff1a;Test、html、application/json、applicatio…

安装 cplex 求解器

安装 cplex 求解器 安装 cplex 求解器和python-docplexcplex 安装matlab 用户安装 cplexpython 版本安装 cplex 求解器和python-docplex cplex 安装 cplex 是解决优化问题的一个工具箱&#xff0c;用来线性规划、混合整数规划和二次规划的高性能数学规划求解器。可以理解成&a…

《爆肝整理》保姆级系列教程python接口自动化(十六)--参数关联接口后传(详解)

简介 大家对前边的自动化新建任务之后&#xff0c;接着对这个新建任务操作了解之后&#xff0c;希望带小伙伴进一步巩固胜利的果实&#xff0c;夯实基础。因此再在沙场实例演练一下相关接口。我们用自动化发随笔之后&#xff0c;要想接着对这篇随笔操作&#xff0c;不用说就需 …

实现聊天消息绘制、图文混排(源码,支持Windows、Linux)

在实现聊天软件时&#xff0c;渲染文字表情图文混排是一项非常繁琐的工作&#xff0c;再加上还要支持GIF动图、引用消息、撤回消息、名片等不同样式的消息渲染时&#xff0c;就更加麻烦了。 好在我们可以使用 ESFramework 提供的 IChatRender 组件&#xff0c;使用它我们就能轻…

小众免费的短视频素材库

推荐5个小众但好用的视频素材网站&#xff0c;免费可商用&#xff0c;视频剪辑、自媒体必备~ 1、菜鸟图库 https://www.sucai999.com/video.html?vNTYxMjky ​ 菜鸟图库网素材非常丰富&#xff0c;网站主要还是以设计素材为主&#xff0c;高清视频素材也很多&#xff0c;像风…

(考研湖科大教书匠计算机网络)第四章网络层-第六节3:开放最短路径优先OSPF的基本工作原理

获取pdf&#xff1a;密码7281专栏目录首页&#xff1a;【专栏必读】考研湖科大教书匠计算机网络笔记导航 文章目录一&#xff1a;OSPF概述&#xff08;1&#xff09;概述&#xff08;2&#xff09;细节阐述A&#xff1a;链路状态和代价B&#xff1a;问候分组和邻居表C&#xff…

如何保证集合是线程安全的 ConcurrentHashMap如何实现高效地线程安全?

第10讲 | 如何保证集合是线程安全的? ConcurrentHashMap如何实现高效地线程安全&#xff1f; 我在之前两讲介绍了 Java 集合框架的典型容器类&#xff0c;它们绝大部分都不是线程安全的&#xff0c;仅有的线程安全实现&#xff0c;比如 Vector、Stack&#xff0c;在性能方面也…

智能家居项目(一)之基础概念引入

目录 一、智能家居功能整体流程 二、设计模式 三、C语言中结构体的新玩法&#xff0c;承接上一步 四、工厂模式概念引入 一、智能家居功能整体流程 1.控制区语音识别模块socket客户端 2.外设区继电器组控制灯&#xff0c;远程终端子系统&#xff0c;窗帘等&#xff0c;火灾…

数据分析面试---假设检验知识点

文章目录一、假设检验是干啥的二、假设检验基本原理/思想三、假设检验步骤显著性检验(significance test)统计显著性和置信度补充&#xff1a;第一类错误和第二类错误p值是啥链接1数理统计中的统计推断问题主要有两大类&#xff1a;参数估计问题和假设检验问题参数估计问题 所指…