MST

星途 面试题库

面试题:自定义Java输入输出流及与设计模式的结合应用

要求自定义一个继承自`FilterInputStream`的输入流,实现对读取的数据进行特定加密处理(如简单的移位加密)。同时,请阐述该自定义输入流在实际项目中可能与哪些设计模式结合使用,以及如何结合以提高代码的可维护性和扩展性。
13.6万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

自定义加密输入流代码

import java.io.FilterInputStream;
import java.io.IOException;
import java.io.InputStream;

public class EncryptedFilterInputStream extends FilterInputStream {
    private static final int SHIFT = 3;

    public EncryptedFilterInputStream(InputStream in) {
        super(in);
    }

    @Override
    public int read() throws IOException {
        int data = super.read();
        if (data != -1) {
            return (data + SHIFT) % 256;
        }
        return data;
    }

    @Override
    public int read(byte[] b, int off, int len) throws IOException {
        int bytesRead = super.read(b, off, len);
        if (bytesRead != -1) {
            for (int i = 0; i < bytesRead; i++) {
                b[off + i] = (byte) ((b[off + i] + SHIFT) % 256);
            }
        }
        return bytesRead;
    }
}

可能结合的设计模式及结合方式

  1. 装饰器模式
    • 结合方式:上述自定义的EncryptedFilterInputStream类本身就体现了装饰器模式。FilterInputStream是装饰器模式中的抽象装饰类,EncryptedFilterInputStream是具体的装饰类。在实际项目中,可以通过层层包装不同功能的装饰器(如不同加密方式的输入流装饰器、日志记录输入流装饰器等)来增强InputStream的功能,提高代码的可维护性和扩展性。例如,如果后续需要添加解密功能,可以再创建一个继承自FilterInputStreamDecryptedFilterInputStream装饰器,在读取数据时进行解密操作,与EncryptedFilterInputStream可以灵活组合使用。
  2. 策略模式
    • 结合方式:可以将不同的加密策略(如不同的移位值、不同的加密算法)封装成不同的策略类。在EncryptedFilterInputStream中,通过一个策略接口来引用具体的加密策略对象。这样,在实际项目中,如果需要更换加密算法,只需要创建新的策略类实现加密策略接口,然后在EncryptedFilterInputStream中切换使用的策略对象即可,无需修改EncryptedFilterInputStream的核心读取逻辑,提高了代码的扩展性和可维护性。例如,创建ShiftEncryptionStrategyXOREncryptionStrategy等不同策略类,在EncryptedFilterInputStream的构造函数中传入不同的策略对象来实现不同的加密策略。