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

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

字节流

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

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

常用的字节流类

  • FileInputStreamFileOutputStream
  • BufferedInputStreamBufferedOutputStream
  • DataInputStreamDataOutputStream

代码演示:使用FileInputStreamFileOutputStream复制文件

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中的字符流由ReaderWriter这两个抽象类定义,它们是所有字符输入流和输出流的超类。

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

常用的字符流类

  • FileReaderFileWriter
  • BufferedReaderBufferedWriter
  • PrintWriter

代码演示:使用BufferedReaderBufferedWriter复制文本文件

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将读取的行写入另一个文件中,每写完一行就添加一个新行。

深入理解

性能考量

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

字符编码

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

总结

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

相关推荐
武子康2 小时前
Java-72 深入浅出 RPC Dubbo 上手 生产者模块详解
java·spring boot·分布式·后端·rpc·dubbo·nio
椰椰椰耶3 小时前
【Spring】拦截器详解
java·后端·spring
brzhang4 小时前
我操,终于有人把 AI 大佬们 PUA 程序员的套路给讲明白了!
前端·后端·架构
wan_da_ren7 小时前
JVM监控及诊断工具-GUI篇
java·开发语言·jvm·后端
【本人】7 小时前
Django基础(一)———创建与启动
后端·python·django
lifallen7 小时前
Kafka 时间轮深度解析:如何O(1)处理定时任务
java·数据结构·分布式·后端·算法·kafka
你的人类朋友7 小时前
【✈️速通】什么是SIT,什么是UAT?
后端·单元测试·测试
程序无bug10 小时前
后端3行代码写出8个接口!
java·后端
绝无仅有10 小时前
使用LNMP一键安装包安装PHP、Nginx、Redis、Swoole、OPcache
后端·面试·github
他日若遂凌云志10 小时前
C++ 与 Lua 交互全链路解析:基于Lua5.4.8的源码剖析
后端