首页 > 编程语言 >[Java基础]IO

[Java基础]IO

时间:2024-09-28 15:46:29浏览次数:5  
标签:编码 Java 字节 字符 处理 基础 IO new 转换

在 Java 中,IO(输入输出)操作 是指对数据的读写操作,通常涉及文件、网络、控制台等。Java 提供了丰富的 IO 类和接口,主要分为两大类:字节流 和 字符流。它们的主要区别如下:

1. 字节流(Byte Stream)

字节流用于处理 原始二进制数据,通常适合于处理所有类型的文件,包括文本文件、图片、音频、视频等。它直接操作 字节(8 位),不考虑字符编码。

常用的字节流类:

  • InputStream:所有字节输入流的超类,负责读取字节数据。

    • 常见子类:FileInputStream, BufferedInputStream, ByteArrayInputStream
  • OutputStream:所有字节输出流的超类,负责写入字节数据。

    • 常见子类:FileOutputStream, BufferedOutputStream, ByteArrayOutputStream

适用场景:

  • 适合处理 非文本 文件,比如图片、音频、视频等。
  • 处理 二进制文件 时,直接使用字节流效率更高,因为它不会考虑字符编码的问题。

示例代码:

FileInputStream fis = new FileInputStream("input.txt");
FileOutputStream fos = new FileOutputStream("output.txt");

int data;
while ((data = fis.read()) != -1) {  // 按字节读取
    fos.write(data);                 // 按字节写入
}

fis.close();
fos.close();

2. 字符流(Character Stream)

字符流用于处理 文本数据,它专门为处理字符而设计,通常适用于 文本文件。字符流依赖于字符编码(如 UTF-8, UTF-16 等)来将字节转换为字符,或者将字符转换为字节。

常用的字符流类:

  • Reader:所有字符输入流的超类,负责读取字符数据。

    • 常见子类:FileReader, BufferedReader, InputStreamReader
  • Writer:所有字符输出流的超类,负责写入字符数据。

    • 常见子类:FileWriter, BufferedWriter, OutputStreamWriter

适用场景:

  • 适合处理 文本文件,因为它能正确处理不同字符集的编码和解码。
  • 当处理字符串或文本时,使用字符流更方便,避免了手动处理字节到字符的转换。

示例代码:

FileReader fr = new FileReader("input.txt");
FileWriter fw = new FileWriter("output.txt");

int data;
while ((data = fr.read()) != -1) {  // 按字符读取
    fw.write(data);                 // 按字符写入
}

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

3. 字节流与字符流的区别

特性 字节流(Byte Stream) 字符流(Character Stream)
数据单位 以字节(byte, 8 位)为单位 以字符(char, 16 位)为单位
处理对象 处理所有类型的文件,包括文本和二进制文件 专门用于处理文本数据
编码问题 不考虑字符编码,直接读写二进制数据 需要处理字符编码和解码
常用基类 InputStreamOutputStream ReaderWriter
适用场景 处理图片、音频、视频等二进制文件 处理文本文件,如 .txt, .csv

4. 两者的关系

尽管字节流和字符流处理的数据单位不同,但字符流本质上是基于字节流实现的。字符流是对字节流的封装,它通过字符编码(如 UTF-8)将字节转换为字符或将字符转换为字节。因此,在实际使用中,字符流依赖于字节流。

字符流与字节流的桥梁:

  • InputStreamReaderOutputStreamWriter 是字符流和字节流之间的桥梁,它们将字节流转换为字符流,或者将字符流转换为字节流。

    • InputStreamReader:将 InputStream 转换为 Reader,即字节流转换为字符流。
    • OutputStreamWriter:将 OutputStream 转换为 Writer,即字符流转换为字节流。

示例代码(使用转换流):

InputStream inputStream = new FileInputStream("input.txt");
Reader reader = new InputStreamReader(inputStream, "UTF-8");  // 将字节流转换为字符流

OutputStream outputStream = new FileOutputStream("output.txt");
Writer writer = new OutputStreamWriter(outputStream, "UTF-8");  // 将字符流转换为字节流

总结:

  • 字节流 处理二进制数据,适合图片、视频、音频等文件的操作。
  • 字符流 处理文本数据,专门为字符操作设计,能正确处理字符编码。
  • 字符流本质上是对字节流的封装,依赖于字节流的底层操作,并通过字符编码实现字节到字符的转换。

在选择使用字节流还是字符流时,通常基于数据的类型来决定:如果是文本数据,优先选择字符流;如果是二进制数据或不需要考虑编码的情况,使用字节流更合适。

标签:编码,Java,字节,字符,处理,基础,IO,new,转换
From: https://www.cnblogs.com/DCFV/p/18438034

相关文章

  • [Java并发]线程的并行等待
    在Java中,线程的并行等待(即等待多个线程并行执行完毕)通常可以通过以下几种方式来实现。我们要确保多个线程能够并行执行,并在所有线程执行完毕后再继续后续的操作。这种场景通常可以用在并发任务的协调中。以下是几种常见的实现方式:1.使用Thread.join()方法join()方法是最直......
  • javascript 数组对象解构
    传统的写法不好记忆,书写麻烦,此时可以使用结构赋值的方法让代码更加简洁。数组结构是将数组中的单元值快速批量赋值给一系列变量的简介语法。变量的顺序对应数组单元值位置一次进行赋值操作。如下:应用一:交换两个变量Js前面有那种情况需要加分号。(不加分号解析器认为和上......
  • Manifesto of Open Source Project Protection (MOSPP)
    Version1,September2024https://CLimber-Rong.github.io/resource/mospp/mospp_en-us.txtThefundamentalpurposeoftheopensourcespiritistopromoteamorestabledevelopmentofacademicresearch,ratherthanbeingused,criticized,anddestroyedbype......
  • css基础
    一:CSS介绍css被称为重叠样式表重叠在于css拥有合并来自多个源的属性值的算法像衣服一样,层层叠叠很多件穿在身上,别人看到的是露在表面上的衣服样式表则是对网页设计元素,如字体,大小,颜色,间距的定义插入图片?我将在原html网页上进行css的装饰二:css基本语法选择器1,选择器2{属......
  • DC00020基于springboot新闻网站系统java web项目MySQL新闻管理系统
    1、项目功能演示DC00020基于springboot新闻网站系统javaweb项目MySQL2、项目功能描述  基于springboot+vue新闻网站包括用户和系统管理员两个角色。2.1用户功能1、用户登录、用户注册2、新闻信息:点赞、点踩、收藏、查看3、用户分享:点赞、点踩、收藏、查看、添加......
  • Java lambda表达式
    概述:今天推荐一篇!Java1.8的新特性之lambda表达式,它非常的方便,可以用来简化匿名内部类哦。能够以更清晰、直观的方式表达代码的逻辑。极大的简化了代码的数量。⌨️⌨️⌨️不会匿名内部类的小伙伴可以博主下面这篇文章哦:Java匿名内部类https://blog.csdn.net/ouhexie/article/deta......
  • Bootstrap基础教程
    Bootstrap介绍Bootstrap是一个由Twitter开发的开源前端框架,它基于HTML、CSS和JavaScript。Bootstrap的设计初衷是为了快速开发响应式和移动设备优先的Web应用程序。自Bootstrap3版本起,框架中融入了移动设备优先的样式,这意味着开发人员可以轻松地创建在不同设......
  • 《Python 基础篇》一:初相识
    Author:ACatSmilingSince:2024-09-27基础语法Python的语法比较简单,采用缩进方式,写出来的代码就像下面的样子:#printabsolutevalueofaninteger:a=100ifa>=0:print(a)else:print(-a)Python程序是大小写敏感的,如果写错了大小写,程序会报错。Pyth......
  • FFmpeg 初学者需要掌握的基础知识和实用技能。每个部分可以深入讲解,提供具体的命令示
    FFmpeg初级使用教程大纲1. FFmpeg简介什么是FFmpegFFmpeg的主要功能安装FFmpeg2. 基本命令格式FFmpeg的基本命令结构输入与输出文件的指定常用选项的介绍3. 常用命令示例转换视频格式示例:将MP4转换为AVI提取音频示例:从视频中提取音频压缩视......
  • 2024java社招面试(亲身经历8w字,更新中)
    一、Java基础部分面试题1.Java面向对象的三个特征封装:对象只需要选择性的对外公开一些属性和行为。继承:子对象可以继承父对象的属性和行为,并且可以在其之上进行修改以适合更特殊的场景需求。多态:允许不同类的对象对同一消息做出响应。2.Java中基本的数据类型有哪些以......