Java面试要点42 - Java IO:字节流与字符流详解

在这里插入图片描述


一、引言

在Java编程中,IO(输入/输出)操作是一个非常重要的概念,它使得程序能够与外部世界进行数据交互。Java的IO体系设计精妙,主要分为字节流和字符流两大体系,它们分别用于处理不同类型的数据传输。

二、IO流的基本概念

Java的IO流设计基于装饰器模式,通过层层包装来扩展功能。所有的流都分为两个方向:输入流和输出流。输入流用于从外部读取数据到程序中,输出流用于从程序写出数据到外部。字节流以字节为单位传输数据,而字符流以字符为单位传输数据,这使得字符流更适合处理文本内容。

三、字节流体系

字节流是最基本的IO流,它直接处理字节数据。InputStream和OutputStream是所有字节流的抽象基类。

字节流适合处理二进制文件,如图片、音频、视频等。

public class ByteStreamExample {
   
    public void copyFile(String source, String target) {
   
        try (FileInputStream fis = new FileInputStream(source);
             FileOutputStream fos = new FileOutputStream(target)) {
   
            
            byte[] buffer = new byte[1024];
            int length;
            
            while ((length = fis.read(buffer)) > 0) {
   
                fos.write(buffer, 0, length);
            }
            
            fos.flush();
        } catch (IOException e) {
   
            e.printStackTrace();
        }
    }
    
    public void readBinaryFile() {
   
        try (BufferedInputStream bis = new BufferedInputStream(
                new FileInputStream("image.jpg"))) {
   
            
            byte[] content = bis.readAllBytes();
            // 处理二进制数据
            processImageData(content);
        } catch (IOException e) {
   
            e.printStackTrace();
        }
    }
    
    private void processImageData(byte[] data) {
   
        // 处理图片数据的具体实现
    }
}

四、字符流体系

字符流是Java为了更好地处理文本数据而设计的,它的基本单位是字符而不是字节。Reader和Writer是所有字符流的抽象基类。

字符流内部会进行字符编码的转换,因此更适合处理文本文件。

public class CharacterStreamExample {
   
    public void textFileProcessing() {
   
        try (BufferedReader reader = new BufferedReader(
                new FileReader("input.txt", StandardCharsets.UTF_8));
             BufferedWriter writer = new BufferedWriter(
                new FileWriter("output.txt", StandardCharsets.UTF_8))) {
   
            
            String line;
            while ((line = reader.readLine()) != null) {
   
                // 处理文本行
                String processed = processLine(line);
                writer.write(processed);
                writer.newLine();
            }
            
            writer.flush();
        } catch (IOException e) {
   
            e.printStackTrace();
        }
    }
    
    public void characterStreamBuffering() {
   
        try (BufferedReader reader = new BufferedReader(
                new InputStreamReader(System.in, StandardCharsets.UTF_8))) {
   
            
            StringBuilder content = new StringBuilder();
            int character;
            
            while ((character = reader.read()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值