当前位置:

首页 > 编程开发 > Java中字节流和字符流是什么

Java中字节流和字符流是什么

字节流和字符流在上图中,橙色部分是抽象类,而蓝色部分则是实现类字节流字节流,顾名思义就是将数据细分为字节对文件进行读和写的操作,主要分为字节输入流和字节输出流。字节输入流下面是字节输入流中经常会用到的构造器和方法:构造器说明publicFileInputStream(Filefile)创建字节输入流管道与源文件对象接通publicFileInputStream(Stringpathname)创建字节输入流管道与源文件路径接通方法名称说明publicintread()每次读取一个字节返回,如果字节已经没有可

本文目录

    字节流和字符流 

    Java中字节流和字符流是什么

    在上图中,橙色部分是抽象类,而蓝色部分则是实现类

    字节流 

    字节流,顾名思义就是将数据细分为字节对文件进行读和写的操作, 主要分为字节输入流和字节输出流。

    字节输入流 

    下面是字节输入流中经常会用到的构造器和方法:

    构造器说明
    public        FileInputStream(File file)创建字节输入流管道与源文件对象接通
    public        FileInputStream(String pathname)创建字节输入流管道与源文件路径接通
    方法名称说明
    public int read()每次读取一个字节返回,如果字节已经没有可读的返回-1
    public int read(byte[ ] buffer)每次读取一个字节数组返回,如果字节已经没有可读的返回-1

    接下来通过代码更好的加深对这一部分知识点的理解吧!

    File file = new File("File//data.txt");
            //第一种构造器,参数是File类
            InputStream inputStream = new FileInputStream(file);
            //第二种构造器,参数是文件的路径,可以是相对也可以是绝对的路径
            InputStream inputStream1 = new FileInputStream("File//data.txt");
            //通过字节读取文件中的数据
            int len;
            while ((len=inputStream.read()) != -1){
                System.out.print((char) len);
            }
            System.out.println();
            //通过字节数组读取文件中的数据
            byte [] buffer = new byte[3];
            while ((len=inputStream1.read(buffer))!=-1){
                String s = new String(buffer,0,len);
                System.out.print(s);
            }
    //输出结果:
    //ab1abab
    //ab1abab

    现在我们看到的输出结果和文件中的内容是一一对应的,那么它就一定是没有问题的了吗?其实并不是,只是还没有遇到问题而已,首先我们应该了解到的是,在utf-8中,字母和数字都是一个字节,而中文是由三个字节组成的,那么当我们的文件中出现汉字的时候,第一种方法就无法实现正常的读取了,因为每次都读取一个字节的原因会将汉字拆解,在输出的时候形成乱码的情况;而第二种则方法可以在特殊的情况下实现对汉字的输出,必须满足的条件是刚好中文的三个字节都在同一个字节数组中。

    字节输入流并不适合所有的文件数据,由此而引出了字符输入流。

    字节输出流 

    下面是字节输出流常用到的方法:

    方法说明
    public void write (int a)写一个字节出去
    public void write (byte [ ]buffer)写一个字节数组出去
    public void write (byte [ ]buffer,int off, int len)将一个字节数组中的一部分写出去
    file.close()流的关闭,不能再写数据
    file.flush()流的更新,还可以继续写数据

     接下来通过代码更好的加深对这一部分知识点的理解吧!

    OutputStream outputStream = new FileOutputStream("File//data.txt",true);
    //true表示可以对文件进行追加内容,若没有true则会在关闭文件之后,进行写文件的时候会对之前的内容进行覆盖。
            outputStream.write('a');
            outputStream.write(13);
            outputStream.write('美');
            outputStream.flush();
            byte[] buffer = {'s','y','l','m',99};
            outputStream.write(buffer);
            outputStream.write(buffer,1,3);
            outputStream.close();

    经过上面一系列操作以后,会将这些数据写进data.txt文件之中,但是仍然会出现问题,有时无法将中文正常的写进去,那么它也不是一个适合所有文件的,由此而引出了字符输出流。

    字符流

    字符流,顾名思义就是将数据细分为字符对文件进行读和写的操作, 主要分为字符输入流和字符输出流。 

    字符输入流 

     下面是字符输入流中经常会用到的构造器和方法:

    构造器说明
    public FileReader (File file)创建字符输入流管道与源文件对象接通
    public FileReader(String pathname)创建字符输入流管道与源文件路径接通
    方法说明
    public int read()每次读取一个字符返回,如果字符已经没有可读的返回-1
    public int read(char [ ]buffer)每次读取一个字符数组返回,返回读取的字符个数,如果字符没有可读的返回-1

    字符输入流的构造器和方法大致上和字节输入流的相同,不同的地方在于字符输入流是以字符为单位的读取,无论你是字母还是数字,都作为一个字符进行读取,这样便可以避免在读取中文的时候出现乱码的问题。

    接下来通过一部分代码来加深对它的理解吧!

    File file = new File("File//data.txt");
            //第一种构造器,参数是File类
            FileReader fileReader = new FileReader(file);
            //第二种构造器,参数是文件的绝对路径或者相对路径
            FileReader fileReader1 = new FileReader("File//data.txt");
            //第一种方法,一个一个字符读取
            int len;
            while ((len = fileReader.read())!=-1){
                System.out.print((char) len);
            }
            //第二种方法,以字符数组进行读取
            char []buffer = new char[3];
            while ((len = fileReader1.read(buffer))!=-1){
                String s = new String(buffer,0,len);
                System.out.println(s);
            }
    //输出结果:
    //110,119,120
    //110
    //,11
    //9,1
    //20

    通过以字符为单位的读写,便可以避免在读取中文的时候出现乱码的问题了。

    字符输出流 

     下面是字符输出流中经常会用到的构造器和方法:

    构造器说明
    public FileWriter(File file)创建字符输出流管道与源文件对象接通
    public FileWriter(File file,boolean append)创建字符输出流管道与源文件对象接通,可追加数据
    public FileWriter(String filepath)创建字符输出流管道与源文件路径接通
    public FileWriter(String filepath,boolean append)创建字符输出流管道与源文件路径接通,可追加
    方法说明
    void writer(int c)写入一个字符
    void writer (char [ ] buffer)写入一个字符数组
    void writer (char[ ]buffer,int off,int len)写入字符数组的一部分
    void writer(String str)        写入一个字符串
    void writer(String str,int off,int len)写入字符串的一部分
    close和flush输出流的关闭和刷新

    接下来就通过代码来加深对它的理解吧!

    FileWriter fileWriter = new FileWriter("File//data.txt");
            fileWriter.write('k');
            fileWriter.write('d');
            char []buffer = {'i','r','v','i','n','g'};
            fileWriter.write(buffer);
            fileWriter.flush();
            String s = "James";
            fileWriter.write(s);
            fileWriter.write(s,0,4);
            fileWriter.close();

    字符输出流的使用便可以很好地解决了中文不能正常写入文件的问题了。 

    附:字节流和字符流的区别

    字节流操作的基本单元为字节;字符流操作的基本单元为Unicode码元。

    字节流默认不使用缓冲区;字符流使用缓冲区。

    字节流在操作的时候本身是不会用到缓冲区的,是与文件本身直接操作的,所以字节流在操作文件时,即使不关闭资源,文件也能输出;字符流在操作的时候是使用到缓冲区的。如果字符流不调用close或flush方法,则不会输出任何内容。

    字节流通常用于处理二进制数据,实际上它可以处理任意类型的数据,但它不支持直接写入或读取Unicode码元;字符流通常处理文本数据,它支持写入及读取Unicode码元。

    字节流可用于任何类型的对象,包括二进制对象,而字符流只能处理字符或者字符串; 字节流提供了处理任何类型的IO操作的功能,但它不能直接处理Unicode字符,而字符流就可以。

    字节流和字符流的转换

    字节流是最基本的,所有的InputStream和OutputStream的子类都是,主要用在处理二进制数据,它是按字节来处理的,但实际中很多的数据是文本,又提出了字符流的概念,它是按虚拟机的encode来处理,也就是要进行字符集的转化,这两个之间通过 InputStreamReader,OutputStreamWriter来关联,实际上是通过byte[]和String来关联。在从字节流转化为字符流时,实际上就是byte[]转化为String时,而在字符流转化为字节流时,实际上是String转化为byte[]时。

    字符流处理的单元为2个字节的Unicode字符,分别操作字符、字符数组或字符串,而字节流处理单元为1个字节,操作字节和字节数组。所以字符流是由Java虚拟机将字节转化为2个字节的Unicode字符为单位的字符而成的,所以它对多国语言支持性比较好!如果是音频文件、图片、歌曲,就用字节流好点,如果是关系到中文(文本)的,用字符流好点。所有文件的储存是都是字节(byte)的储存,在磁盘上保留的并不是文件的字符而是先把字符编码成字节,再储存这些字节到磁盘。在读取文件(特别是文本文件)时,也是一个字节一个字节地读取以形成字节序列。

    字节流可用于任何类型的对象,包括二进制对象,而字符流只能处理字符或者字符串; 字节流提供了处理任何类型的IO操作的功能,但它不能直接处理Unicode字符,而字符流就可以。

    字节流与字符流主要的区别是他们的的处理方式。

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    编程开发 Java
    相关文章 更多
    Java单元测试入门:使用JUnit 5编写第一个测试用例
    Java单元测试入门:使用JUnit 5编写第一个测试用例

    面向初学者的JUnit 5实用入门指南。从测试概念、Maven依赖配置,到手把手编写首个单元测试用例及断言验证,助你掌握Java单元测试的核心流程。

    Java变量未初始化报错解析:局部变量与成员变量默认值差异
    Java变量未初始化报错解析:局部变量与成员变量默认值差异

    深入解析Java中局部变量未初始化编译报错与成员变量自动赋予默认值的机制差异,涵盖JVM内存分配、编译期确定性赋值检查与实际排查修复方案。

    Java获取当前时间并格式化输出:DateTimeFormatter与SimpleDateFormat
    Java获取当前时间并格式化输出:DateTimeFormatter与SimpleDateFormat

    详细讲解在Java中获取当前系统时间并进行格式化输出的两种核心方案:基于Java 8全新日期时间API的DateTimeFormatter与传统遗留的SimpleDateFormat,包含完整代码示例、线程安全机制对比及生产选型建议。

    Java中final与static final常量的定义及初始化规则
    Java中final与static final常量的定义及初始化规则

    深入解析Java中final变量与static final常量的定义、内存语义、初始化时机及合法赋值路径,涵盖编译期常量优化与实战避坑指南。

    Java抽象方法与接口方法的区别及选型建议
    Java抽象方法与接口方法的区别及选型建议

    深入对比Java中抽象类抽象方法与接口方法的语法演进、设计意图及运行期差异,并提供清晰的架构选型决策流程与实战范例。

    Java实现HTTP请求与JSON解析的完整代码示例
    Java实现HTTP请求与JSON解析的完整代码示例

    本文提供Java标准库HttpClient发起HTTP GET/POST请求并结合Jackson进行JSON数据反序列化与序列化的完整代码示例与工程实践指南。

    Java递归出现StackOverflowError的原因分析及栈空间优化方案
    Java递归出现StackOverflowError的原因分析及栈空间优化方案

    详细分析Java递归调用出现StackOverflowError的原因,结合代码说明线程栈、栈帧和递归深度之间的关系,并介绍终止条件排查、迭代改写、减少栈帧开销以及通过-Xss调整JVM栈空间的方法。

    Java空指针异常(NPE)的代码排查与修复实例
    Java空指针异常(NPE)的代码排查与修复实例

    针对Java中常见的NullPointerException(NPE),本文从堆栈日志定位、典型代码触发场景、具体修复代码对比到防御体系进行系统讲解,提供实用且易上手的排查与修复方案。

    selenium上传文件教程本地文件路径设置方法
    selenium上传文件教程本地文件路径设置方法

    深入解析Selenium处理文件上传的技术细节,涵盖标准HTML控件的路径直接注入法与非标准控件的系统级模拟方案,提供Windows与Linux环境下的路径设置最佳实践及常见异常排查。

    大数据开发语言选型:Java对比Scala与Python的优缺点及适用场景
    大数据开发语言选型:Java对比Scala与Python的优缺点及适用场景

    针对大数据工程场景,系统对比Java、Scala与Python在执行性能、生态结合、开发效率和维护成本上的核心差异,给出清晰的架构选型依据与落地方案。

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程
    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    Mac软件 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    Aperty macOS版
    Aperty macOS版
    macOS

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    WINDOWS 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    PixTV 网页版
    PixTV 网页版
    Windows

    PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。