Java基础(11)字节流和字符流

在Java中,I/O(输入/输出)是处理数据流的核心机制,主要分为两大类:字节流(Byte Streams)和字符流(Character Streams)。这两种流的主要区别在于处理数据的单位不同:字节流以8位字节为单位处理数据,适用于处理所有类型的数据(如图片、视频等二进制数据);字符流以16位Unicode字符为单位处理文本数据,适合处理文本文件。

字节流

Java中的字节流主要由InputStream和OutputStream这两个抽象类定义,它们是所有字节输入流和输出流的超类。

  • InputStream - 该抽象类是表示字节输入流的所有类的超类。
  • OutputStream - 该抽象类是表示字节输出流的所有类的超类。

常用的字节流类

  • FileInputStream和FileOutputStream
  • BufferedInputStream和BufferedOutputStream
  • DataInputStream和DataOutputStream

代码演示:使用FileInputStream和FileOutputStream复制文件

java 复制代码
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class ByteStreamTest {
    public static void main(String[] args) {
        try (FileInputStream in = new FileInputStream("source.dat");
             FileOutputStream out = new FileOutputStream("dest.dat")) {
            int c;
            while ((c = in.read()) != -1) {
                out.write(c);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

在上述示例中,我们使用FileInputStream来读取文件中的数据,每次读取一个字节,然后使用FileOutputStream将读取的字节写入另一个文件中。这里使用了Java 7的try-with-resources语句自动管理资源。

字符流

Java中的字符流由Reader和Writer这两个抽象类定义,它们是所有字符输入流和输出流的超类。

  • Reader - 该抽象类是表示字符输入流的所有类的超类。
  • Writer - 该抽象类是表示字符输出流的所有类的超类。

常用的字符流类

  • FileReader和FileWriter
  • BufferedReader和BufferedWriter
  • PrintWriter

代码演示:使用BufferedReader和BufferedWriter复制文本文件

java 复制代码
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class CharStreamTest {
    public static void main(String[] args) {
        try (BufferedReader reader = new BufferedReader(new FileReader("source.txt"));
             BufferedWriter writer = new BufferedWriter(new FileWriter("dest.txt"))) {
            String line;
            while ((line = reader.readLine()) != null) {
                writer.write(line);
                writer.newLine(); // 添加新行
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

在这个示例中,我们使用BufferedReader读取文本文件的每一行,并使用BufferedWriter将读取的行写入另一个文件中,每写完一行就添加一个新行。

深入理解

性能考量

  • 对于需要读写二进制数据的场景,应优先考虑使用字节流。
  • 对于处理文本数据,字符流更加方便和高效,因为它们直接处理字符,可以自动处理字符编码问题。
  • 在处理大量数据时,包装流(如BufferedInputStream、BufferedReader等)可以显著提高I/O操作的效率。

字符编码

字符流的一个重要特性是它们能够自动处理字符编码转换,使得读写文本文件时不必担心平台间的编码差异。当使用字符流读写文件时,可以指定字符集,如FileReader和FileWriter的构造函数就允许传入字符集名称。

总结

字节流和字符流是Java I/O库的基石,理解它们的区别和使用场景对于开发高效、健壮的I/O相关应用程序非常重要。通过上述示例和解析,希望能够帮助你更深入地理解Java中的字节流和字符流。

相关推荐
子兮曰4 天前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
子兮曰4 天前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
爱勇宝4 天前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
胡写代码4 天前
别再前后端各写一套表单校验了
java·后端
大勇前进4 天前
原生 PHP 还是 Laravel?小项目到底要不要上框架
后端
yuzhi_liu4 天前
我用 LangGraph4j 实现 Multi-Agent Supervisor
后端
alsmile4 天前
Node-RED 之外,国产规则引擎的新方案:基于标准语法,Go 先行实现
后端·开源·go
大白804 天前
PHP 内存溢出排查思路:看懂报错日志,精准定位问题
后端
二月龙4 天前
PHP 接口返回统一响应封装,让前后端对接更省心
后端
盖伦发发4 天前
软件工程SOLID 五大设计原则
后端·软件工程