Readable 接口:用于定义一个可以被读取的对象

Readable 接口位于 java.lang 包中。它主要用于定义一个可以被读取的对象。该接口是一个字符输入流相关的接口,用于表示能够提供字符序列以便读取的源。它为字符输入操作提供了一种抽象,使得不同类型的字符源(如文件、网络连接、字符串缓冲区等)可以以统一的方式被读取。

Readable 接口位于 java.lang 包中。它主要用于定义一个可以被读取的对象。

该接口是一个字符输入流相关的接口,用于表示能够提供字符序列以便读取的源。它为字符输入操作提供了一种抽象,使得不同类型的字符源(如文件、网络连接、字符串缓冲区等)可以以统一的方式被读取。

Readable 接方法

Readable 接口中的方法:

int read(CharBuffer cb)

read 方法用于尝试将字符读取到指定的 CharBuffer 中,CharBuffer 是一个字符缓冲区,用于存储读取的字符序列。

注意,read 方法返回读取的字符数。如果已到达流的末尾,则返回 -1。如果因为其他原因(如 I/O 错误)而无法读取,则可能抛出 IOException 异常。

Readable 示例

自定义实现Readable接口的类

以下是一个简单的自定义类 StringReaderWrapper,它实现了 Readable 接口,用于读取一个给定的字符串。代码如下:

package com.hxstrive.java_lang.readable;

import java.io.IOException;
import java.nio.CharBuffer;

/**
 * Readable 示例,简单的字符串读取器类
 * @author hxstrive.com
 */
public class StringReaderWrapper implements Readable {
    private String content;
    private int position;
    
    public StringReaderWrapper(String content) {
        this.content = content;
        this.position = 0;
    }

    @Override
    public int read(CharBuffer cb) throws IOException {
        if (position >= content.length()) {
            return -1;
        }

        int remaining = content.length() - position; // 剩余字符数量
        int length = Math.min(cb.remaining(), remaining); // 读取字符数量

        // 从 content 字符串中读取字符到 CharBuffer 中
        content.getChars(position, position + length, cb.array(), cb.arrayOffset() + cb.position());
        cb.position(cb.position() + length);
        position += length;

        return length;
    }

}

在这个类中,content 是要读取的字符串,position 用于记录当前读取的位置。

read(CharBuffer cb) 方法首先检查是否已经到达字符串的末尾,如果是,则返回 -1。然后计算还剩下多少字符需要读取,以及CharBuffer 还能容纳多少字符,取两者中的较小值作为实际要读取的长度。

接着,将字符串中的字符复制到 CharBuffer 中,更新 CharBuffer 的位置和当前读取位置 position,最后返回实际读取的字符数。

使用示例

读取自定义的 StringReaderWrapper 类中的内容,代码如下:

package com.hxstrive.java_lang.readable;

import java.io.IOException;
import java.nio.CharBuffer;

/**
 * Readable 示例,简单的字符串读取器类
 * @author hxstrive.com
 */
public class ReadableDemo {
    public static void main(String[] args) throws IOException {
        String content = "Hello, World!";

        // 创建自定义的读取器
        StringReaderWrapper reader = new StringReaderWrapper(content);

        // 读取数据
        CharBuffer buffer = CharBuffer.allocate(4);
        int read;
        do {
            buffer.clear();
            read = reader.read(buffer);
            buffer.flip(); // 反转
            for (int i = 0; i < buffer.limit(); i++) {
                System.out.print(buffer.get(i));
            }
            System.out.println();
        } while (read != -1);
    }
}

运行效果:

883e130d23e2f50a3b1608e09ae832cf_1736998277196-73d79095-37d0-493f-b4b1-f5c479d997aa_x-oss-process=image%2Fformat%2Cwebp.png

在这个示例中,首先创建了一个 StringReaderWrapper 对象,传入要读取的字符串 "Hello, World!"。然后创建了一个容量为 4 的 CharBuffer。通过循环调用 reader.read(buffer) 方法来读取字符到 CharBuffer 中。每次读取前先清空 CharBuffer,读取后翻转 CharBuffer(用于正确读取其中的字符),然后将 CharBuffer 中的字符逐个打印出来,直到 read 方法返回 -1,表示已经读取完所有字符。

业精于勤,荒于嬉。——韩愈《进学解》
0 不喜欢
说说我的看法 -
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
其他应用
公众号