适配器模式在java.io包中的使用

本文介绍如何使用 Java 的 InputStreamReader 类将 InputStream 对象转换为 Reader 对象,以支持 Unicode 字符的读取。通过示例代码展示了如何实现这一转换,并解释了 InputStream 和 Reader 在 Java I/O 库中的不同作用。

一.应用场景与案例

在java.io包中,有两个类:InputStream和Reader。他们构成了io包中的输入类。
利用他们都能读取文件,InputStream是字节输入流,通过它能得到byte[],Reader是字符输入流,通过它能得到char。
Reader 用于读入16位字符,也就是Unicode 编码的字符;而 InputStream 用于读入 ASCII 字符和二进制数据。Reader支持16位的Unicode字符输出InputStream支持8位的字符输出。
Reader和InputStream分别是I/O库提供的两套平行独立的等级机构。
有时候开发人员可能得到的是InputStream对象但需要一个Reader对象,这个时候就需要类型转换。

二.案例分析与问题

分析InputStream类,它实现了Closeable接口;分析Reader类,它实现了Readable和Closeable接口。虽然它们都实现了Closeable接口,但其实在具体业务逻辑上它们并没有什么关系。
这是使用适配器模式的保证:A类和B类没有层次关系。
在java.io包中,JDK开发人员已经为我们考虑了上述问题,java.io.InputStreamReader类就是为了解决这个问题的。InputStreamReader继承了Reader类,有2个构造函数:InputStreamReader(InputStream inputStream)和InputStreamReader(InputStream inputStream,String charsetName)。InputStream就是现有对象,charsetName是Reader对象中的字符的字符集(GBK,GB2312,UTF-8等)。
具体转换过程使用StreamDecoder. forInputStreamReader(InputStream inputStream,Object object,String charsetName)等底层方法。
通过使用InputStreamReader就能完成目标:输入一个InputStream对象,得到一个Reader的子类对象InputStreamReader,即完成了类型转换工作。

三.角色描述与UML图

FileioDemo是Client;
InputStream是Adaptee;
Reader是Target;
InputStreamReader是Adapter。
UML图

四.程序源代码

package example2;

import java.io.*;

/**
 * @author spencercjh
 * @date 2018年6月4日23:23:05
 */
public class FileioDemo {
    @SuppressWarnings("SpellCheckingInspection")
    public static void main(String[] args) {
        /*InputStream类实现了Closeable,Reader类实现了Readable, Closeable
         * 目前已经有了一个InputStream实例对象,需要一个Reader对象
         * InputStream和Reader是没有层次关系的,Closeable与此无关
         * Adaptee:InputStream->Target:Reader
         */
        InputStream inputStream = null;
        try {
            inputStream = new FileInputStream("D:/test/文件/small1.txt");
        } catch (FileNotFoundException e) {
            e.printStackTrace();
            System.err.println("InputSteam对象建立失败!");
        }
        Reader reader = null;
        try {
            /*InputStreamReader即为适配器模式中的Adapter,继承了Target即Reader类*/
            reader = new InputStreamReader(inputStream, "GBK");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
            System.err.println("read对象建立失败!");
        }
        try {
            assert reader != null;
            char result = (char) reader.read();
            while (result != 0) {
                System.out.print(result);
                int endFlag = reader.read();
                if (endFlag == -1) {
                    break;
                } else {
                    result = (char) endFlag;
                }

            }
        } catch (IOException e) {
            e.printStackTrace();
            System.err.println("read读失败!");
        } finally {
            try {
                assert reader != null;
                reader.close();
                inputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
                System.err.println("read/inputstream关闭失败!");
            }
        }

    }
}

五.程序运行结果

demo程序结果

原文件

Caused by: org.flowable.common.engine.api.FlowableException: Couldn't deserialize object in variable 'formData' at org.flowable.variable.service.impl.types.SerializableType.deserialize(SerializableType.java:154) at org.flowable.variable.service.impl.types.SerializableType.getValue(SerializableType.java:73) at org.flowable.variable.service.impl.persistence.entity.VariableInstanceEntityImpl.getValue(VariableInstanceEntityImpl.java:134) at org.flowable.variable.service.impl.persistence.entity.VariableInitializingList.initializeVariable(VariableInitializingList.java:66) at org.flowable.variable.service.impl.persistence.entity.VariableInitializingList.add(VariableInitializingList.java:41) at org.flowable.variable.service.impl.persistence.entity.VariableInitializingList.add(VariableInitializingList.java:29) at org.apache.ibatis.reflection.wrapper.CollectionWrapper.add(CollectionWrapper.java:93) at org.apache.ibatis.reflection.MetaObject.add(MetaObject.java:158) at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.linkObjects(DefaultResultSetHandler.java:1106) at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.applyNestedResultMappings(DefaultResultSetHandler.java:955) at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.getRowValue(DefaultResultSetHandler.java:422) at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.handleRowValuesForNestedResultMap(DefaultResultSetHandler.java:910) at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.handleRowValues(DefaultResultSetHandler.java:327) at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.handleResultSet(DefaultResultSetHandler.java:302) at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.handleResultSets(DefaultResultSetHandler.java:195) at org.apache.ibatis.executor.statement.PreparedStatementHandler.query(PreparedStatementHandler.java:65) at org.apache.ibatis.executor.statement.RoutingStatementHandler.query(RoutingStatementHandler.java:79) at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:63) at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:325) at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:156) at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:109) at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:89) at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:151) ... 156 common frames omitted Caused by: org.flowable.common.engine.api.FlowableClassLoadingException: Class not found: com.nbcio.modules.demo.test_demo.entity.TestDemo at org.flowable.common.engine.impl.util.ReflectUtil.loadClass(ReflectUtil.java:89) at org.flowable.variable.service.impl.types.SerializableType$1.resolveClass(SerializableType.java:197) at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1988) at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1852) at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2186) at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1669) at java.io.ObjectInputStream.readObject(ObjectInputStream.java:503) at java.io.ObjectInputStream.readObject(ObjectInputStream.java:461) at org.flowable.variable.service.impl.types.SerializableType.deserialize(SerializableType.java:150) ... 178 common frames omitted Caused by: java.lang.ClassNotFoundException: com.nbcio.modules.demo.test_demo.entity.TestDemo at org.springframework.boot.web.embedded.tomcat.TomcatEmbeddedWebappClassLoader.loadClass(TomcatEmbeddedWebappClassLoader.java:72) at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1188) at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Class.java:348) at org.flowable.common.engine.impl.util.ReflectUtil.loadClass(ReflectUtil.java:328) at org.flowable.common.engine.impl.util.ReflectUtil.loadClass(ReflectUtil.java:70) ... 186 common frames omitted
最新发布
09-05
我选择修改启动用LogBackInitializer实现,现在获得新的错误日志: 13:11:55.130 [main] ERROR org.springframework.boot.SpringApplication - Application run failed java.lang.IllegalArgumentException: Unable to instantiate factory class [com.ghzy.zysygh.LoggingInitializer] for factory type [org.springframework.boot.env.EnvironmentPostProcessor] at org.springframework.core.io.support.SpringFactoriesLoader.instantiateFactory(SpringFactoriesLoader.java:168) at org.springframework.core.io.support.SpringFactoriesLoader.loadFactories(SpringFactoriesLoader.java:104) at org.springframework.boot.context.config.ConfigFileApplicationListener.loadPostProcessors(ConfigFileApplicationListener.java:194) at org.springframework.boot.context.config.ConfigFileApplicationListener.onApplicationEnvironmentPreparedEvent(ConfigFileApplicationListener.java:185) at org.springframework.boot.context.config.ConfigFileApplicationListener.onApplicationEvent(ConfigFileApplicationListener.java:177) at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:172) at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:165) at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:139) at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:127) at org.springframework.boot.context.event.EventPublishingRunListener.environmentPrepared(EventPublishingRunListener.java:76) at org.springframework.boot.SpringApplicationRunListeners.environmentPrepared(SpringApplicationRunListeners.java:53) at org.springframework.boot.SpringApplication.prepareEnvironment(SpringApplication.java:345) at org.springframework.boot.SpringApplication.run(SpringApplication.java:308) at org.springframework.boot.SpringApplication.run(SpringApplication.java:1226) at org.springframework.boot.SpringApplication.run(SpringApplication.java:1215) at com.ghzy.zysygh.ZysyghApplication.main(ZysyghApplication.java:24) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:48) at org.springframework.boot.loader.Launcher.launch(Launcher.java:87) at org.springframework.boot.loader.Launcher.launch(Launcher.java:51) at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:52) Caused by: java.lang.ClassNotFoundException: com.ghzy.zysygh.LoggingInitializer at java.net.URLClassLoader.findClass(URLClassLoader.java:387) at java.lang.ClassLoader.loadClass(ClassLoader.java:418) at org.springframework.boot.loader.LaunchedURLClassLoader.loadClass(LaunchedURLClassLoader.java:92) at java.lang.ClassLoader.loadClass(ClassLoader.java:351) at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Class.java:348) at org.springframework.util.ClassUtils.forName(ClassUtils.java:284) at org.springframework.core.io.support.SpringFactoriesLoader.instantiateFactory(SpringFactoriesLoader.java:159) ... 23 common frames omitted 2025-07-18 13:11:55.130 ERROR --- [ main] o.s.boot.SpringApplication : Application run failed java.lang.IllegalArgumentException: Unable to instantiate factory class [com.ghzy.zysygh.LoggingInitializer] for factory type [org.springframework.boot.env.EnvironmentPostProcessor] at org.springframework.core.io.support.SpringFactoriesLoader.instantiateFactory(SpringFactoriesLoader.java:168) at org.springframework.core.io.support.SpringFactoriesLoader.loadFactories(SpringFactoriesLoader.java:104) at org.springframework.boot.context.config.ConfigFileApplicationListener.loadPostProcessors(ConfigFileApplicationListener.java:194) at org.springframework.boot.context.config.ConfigFileApplicationListener.onApplicationEnvironmentPreparedEvent(ConfigFileApplicationListener.java:185) at org.springframework.boot.context.config.ConfigFileApplicationListener.onApplicationEvent(ConfigFileApplicationListener.java:177) at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:172) at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:165) at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:139) at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:127) at org.springframework.boot.context.event.EventPublishingRunListener.environmentPrepared(EventPublishingRunListener.java:76) at org.springframework.boot.SpringApplicationRunListeners.environmentPrepared(SpringApplicationRunListeners.java:53) at org.springframework.boot.SpringApplication.prepareEnvironment(SpringApplication.java:345) at org.springframework.boot.SpringApplication.run(SpringApplication.java:308) at org.springframework.boot.SpringApplication.run(SpringApplication.java:1226) at org.springframework.boot.SpringApplication.run(SpringApplication.java:1215) at com.ghzy.zysygh.ZysyghApplication.main(ZysyghApplication.java:24) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:48) at org.springframework.boot.loader.Launcher.launch(Launcher.java:87) at org.springframework.boot.loader.Launcher.launch(Launcher.java:51) at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:52) Caused by: java.lang.ClassNotFoundException: com.ghzy.zysygh.LoggingInitializer at java.net.URLClassLoader.findClass(URLClassLoader.java:387) at java.lang.ClassLoader.loadClass(ClassLoader.java:418) at org.springframework.boot.loader.LaunchedURLClassLoader.loadClass(LaunchedURLClassLoader.java:92) at java.lang.ClassLoader.loadClass(ClassLoader.java:351) at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Class.java:348) at org.springframework.util.ClassUtils.forName(ClassUtils.java:284) at org.springframework.core.io.support.SpringFactoriesLoader.instantiateFactory(SpringFactoriesLoader.java:159) ... 23 common frames omitted 2025-07-18 13:11:55.130 [main] ERROR o.s.boot.SpringApplication - Application run failed java.lang.IllegalArgumentException: Unable to instantiate factory class [com.ghzy.zysygh.LoggingInitializer] for factory type [org.springframework.boot.env.EnvironmentPostProcessor] at org.springframework.core.io.support.SpringFactoriesLoader.instantiateFactory(SpringFactoriesLoader.java:168) at org.springframework.core.io.support.SpringFactoriesLoader.loadFactories(SpringFactoriesLoader.java:104) at org.springframework.boot.context.config.ConfigFileApplicationListener.loadPostProcessors(ConfigFileApplicationListener.java:194) at org.springframework.boot.context.config.ConfigFileApplicationListener.onApplicationEnvironmentPreparedEvent(ConfigFileApplicationListener.java:185) at org.springframework.boot.context.config.ConfigFileApplicationListener.onApplicationEvent(ConfigFileApplicationListener.java:177) at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:172) at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:165) at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:139) at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:127) at org.springframework.boot.context.event.EventPublishingRunListener.environmentPrepared(EventPublishingRunListener.java:76) at org.springframework.boot.SpringApplicationRunListeners.environmentPrepared(SpringApplicationRunListeners.java:53) at org.springframework.boot.SpringApplication.prepareEnvironment(SpringApplication.java:345) at org.springframework.boot.SpringApplication.run(SpringApplication.java:308) at org.springframework.boot.SpringApplication.run(SpringApplication.java:1226) at org.springframework.boot.SpringApplication.run(SpringApplication.java:1215) at com.ghzy.zysygh.ZysyghApplication.main(ZysyghApplication.java:24) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:48) at org.springframework.boot.loader.Launcher.launch(Launcher.java:87) at org.springframework.boot.loader.Launcher.launch(Launcher.java:51) at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:52) Caused by: java.lang.ClassNotFoundException: com.ghzy.zysygh.LoggingInitializer at java.net.URLClassLoader.findClass(URLClassLoader.java:387) at java.lang.ClassLoader.loadClass(ClassLoader.java:418) at org.springframework.boot.loader.LaunchedURLClassLoader.loadClass(LaunchedURLClassLoader.java:92) at java.lang.ClassLoader.loadClass(ClassLoader.java:351) at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Class.java:348) at org.springframework.util.ClassUtils.forName(ClassUtils.java:284) at org.springframework.core.io.support.SpringFactoriesLoader.instantiateFactory(SpringFactoriesLoader.java:159) ... 23 common frames omitted
07-19
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值