字节流和字符流有哪些区别

简介: 字节流和字符流是Java中两种基本的I/O流类型。字节流以8位字节为单位处理数据,适用于所有类型的文件;字符流以16位Unicode字符为单位,专为文本文件设计,自动完成字符编码转换,更适合文本处理。
  1. 处理数据的单位不同
    • 字节流:字节流以字节(8位二进制)为单位处理数据。它可以用于处理任何类型的数据,因为所有的数据在计算机底层都是以字节的形式存储的。例如,读取或写入图像、音频、视频等二进制文件时,字节流是最合适的选择。像InputStream(输入字节流)的read()方法每次读取一个字节的数据,OutputStream(输出字节流)的write()方法每次写入一个字节的数据。例如,使用字节流读取一个二进制文件(如一张图片)的部分代码如下:
      ```java
      import java.io.FileInputStream;
      import java.io.FileOutputStream;
      import java.io.IOException;

public class ByteStreamExample {
public static void main(String[] args) {
try {
FileInputStream fis = new FileInputStream("image.jpg");
FileOutputStream fos = new FileOutputStream("new_image.jpg");
int data;
while ((data = fis.read())!= -1) {
fos.write(data);
}
fis.close();
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}

   - **字符流**:字符流以字符为单位处理数据。字符的大小在不同的字符编码下可能不同,例如在UTF - 8编码下,一个字符可能占用1 - 4个字节。字符流主要用于处理文本数据,它会考虑字符编码,能够正确地处理字符的读写,如读取和写入`.txt`文件等文本文件。例如`Reader`(输入字符流)的`read()`方法每次读取一个字符(以`int`类型表示,范围是0 - 65535),`Writer`(输出字符流)的`write()`方法每次写入一个字符。例如,使用字符流读取一个文本文件的部分代码如下:
```java
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class CharacterStreamExample {
    public static void main(String[] args) {
        try {
            FileReader fr = new FileReader("text.txt");
            FileWriter fw = new FileWriter("new_text.txt");
            int character;
            while ((character = fr.read())!= -1) {
                fw.write((char) character);
            }
            fr.close();
            fw.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
  1. 对文本数据的处理方式不同
    • 字节流:字节流在处理文本数据时,是将文本内容当作字节序列来处理,不会考虑字符编码。这意味着如果使用字节流来读取或写入文本文件,并且文本文件包含非ASCII字符(如中文、日文等),可能会出现乱码问题。例如,当使用字节流读取一个UTF - 8编码的中文文本文件并直接打印字节数据转换后的字符时,可能会出现乱码,因为字节流不知道字节数据对应的字符编码。
    • 字符流:字符流在处理文本数据时,会考虑字符编码。它内部会根据指定的字符编码(如UTF - 8、GBK等)或者使用默认的字符编码来正确地将字节序列转换为字符或者将字符转换为字节序列。这使得字符流在处理文本文件时更加方便和安全,能够正确地处理各种字符,避免乱码问题。例如,FileReaderFileWriter在构造函数中可以根据系统默认的字符编码来处理文本文件,也可以通过InputStreamReaderOutputStreamWriter来指定字符编码,如下面的代码可以指定使用UTF - 8编码来读取文本文件:
      ```java
      import java.io.BufferedReader;
      import java.io.FileInputStream;
      import java.io.IOException;
      import java.io.InputStreamReader;

public class CharacterEncodingExample {
public static void main(String[] args) {
try {
FileInputStream fis = new FileInputStream("utf8_text.txt");
InputStreamReader isr = new InputStreamReader(fis, "UTF-8");
BufferedReader br = new BufferedReader(isr);
String line;
while ((line = br.readLine())!= null) {
System.out.println(line);
}
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
```

  1. 应用场景不同
    • 字节流
      • 适用于处理二进制文件,如图片、音频、视频、可执行文件等。这些文件中的数据没有字符的概念,都是以字节为单位存储和传输的。
      • 在进行网络通信时,如果是传输二进制数据(如文件下载、上传等),字节流是常用的选择。
    • 字符流
      • 主要用于处理文本文件,如.txt文件、.java文件、.html文件等,能够确保文本内容的正确读写,避免字符编码带来的问题。
      • 在处理需要按字符进行操作的场景,如文本解析、文本编辑等,字符流更合适。例如,读取一个配置文件并解析其中的键值对,使用字符流可以更方便地按行读取并处理文本内容。
相关文章
第7节:Vue3 动态绑定多个属性
第7节:Vue3 动态绑定多个属性
608 0
|
XML 数据格式 Python
旋转标注工具roLabelImg使用教程
旋转标注工具roLabelImg使用教程
旋转标注工具roLabelImg使用教程
字节流与字符流的差异
【10月更文挑战第13天】总的来说,字节流和字符流各有其特点和适用范围,我们需要根据具体的需求来选择使用哪种类型的流。在实际应用中,还需要注意编码问题、性能优化等方面,以确保数据的正确处理和高效传输。
937 155
|
Java Spring
无法自动装配。找不到 ‘Service‘ 类型的 Bean。 Service 与 ServiceImpl 没有互相联系起来
文章讲述了一个Java开发中的问题,即Spring框架无法自动装配Bean,原因是ServiceImpl类未实现对应的Service接口,解决办法是让ServiceImpl实现Service接口。
2567 1
无法自动装配。找不到 ‘Service‘ 类型的 Bean。 Service 与 ServiceImpl 没有互相联系起来
|
Arthas 监控 Java
Arthas trace (方法内部调用路径,并输出方法路径上的每个节点上耗时)
Arthas trace (方法内部调用路径,并输出方法路径上的每个节点上耗时)
1841 10
|
人工智能 运维 关系型数据库
云栖大会|数据库与AI全面融合,迈入数据智能新纪元
2024年云栖大会「数据库与AI融合」专场,来自NVIDIA、宇视科技、合思信息、杭州光云科技、MiniMax等企业的代表与阿里云瑶池数据库团队,共同分享了Data+AI全面融合的最新技术进展。阿里云发布了DMS的跨云统一开放元数据OneMeta和智能开发OneOps,推出《云数据库运维》技术图书,并介绍了PolarDB、AnalyticDB、Lindorm和Tair等产品的最新能力,展示了AI在数据库领域的广泛应用和创新。
1264 15
|
JavaScript 前端开发 API
管理数据必备;侦听器watch用法详解,vue2与vue3中watch的变化与差异
一篇文章同时搞定Vue2和Vue3的侦听器,是不是很棒?不要忘了Vue3中多了一个可选项watchEffect噢。 博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
关系型数据库 MySQL Linux
MySQL数据库下载安装教程(Windows&Linux)
本文档详细介绍了MySQL的安装步骤,包括安装前的准备工作、下载安装包、Windows和Linux系统下的具体安装流程,以及如何配置MySQL服务、设置环境变量、启动服务和连接数据库等关键操作。
|
XML Java Maven
idea配置maven步骤及常见问题
本文介绍了在IDEA中配置Maven的详细步骤,包括Maven的下载、系统环境变量的配置、Maven本地仓库的设置、镜像加速的配置,以及在IDEA中指定Maven路径和配置文件。同时,还提供了解决每次新建项目需要重新手动配置Maven问题的方法。
idea配置maven步骤及常见问题
|
消息中间件 存储 负载均衡
RocketMQ消费者消费消息核心原理(含长轮询机制)
这篇文章深入探讨了Apache RocketMQ消息队列中消费者消费消息的核心原理,特别是长轮询机制。文章从消费者和Broker的交互流程出发,详细分析了Push和Pull两种消费模式的内部实现,以及它们是如何通过长轮询机制来优化消息消费的效率。文章还对RocketMQ的消费者启动流程、消息拉取请求的发起、Broker端处理消息拉取请求的流程进行了深入的源码分析,并总结了RocketMQ在设计上的优点,如单一职责化和线程池的使用等。
RocketMQ消费者消费消息核心原理(含长轮询机制)

热门文章

最新文章