Java Input Stream Diagram

本文介绍了 Java 中 InputStream 的子类及其继承关系,包括 ByteArrayInputStream、BufferedInputStream、FileInputStream、DataInputStream 等多种输入流类型,并展示了它们之间的层级结构。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  

JAVA IO Diagram

                |-- ByteArrayInputStream     |-- BufferedInputStream
                |-- FileInputStream          |-- DataInputStream
                |-- FilterInputStream   <----+
InputStream <---+-- ObjectInputStream        |-- LineNumberInputStream
                |-- PipedInputStream         |-- PushbackInputStream
                |-- SequenceInputStream         
                |-- StringBufferInputStream

 

转载于:https://www.cnblogs.com/liutianchen/p/6421811.html

<think>我们被要求提供关于java.util.ResourceBundle类的详细解释和用法。根据引用内容,我们知道ResourceBundle用于加载与特定语言、区域相关的资源文件(通常为.properties文件)。它根据指定的基础名称(baseName)、区域设置(Locale)和类加载器来查找最匹配的资源包。主要功能:实现国际化(i18n),使应用程序能够适应不同的语言和地区。重要概念:1.基础名称(baseName):资源文件的共同前缀,例如"com/myapp/Messages"。2.区域设置(Locale):由语言代码、国家代码和变体代码组成,例如Locale.US,Locale.CHINA。资源文件的命名规则:baseName+"_"+语言代码+"_"+国家代码+".properties"例如:Messages.properties(默认)Messages_en.properties(英语)Messages_en_US.properties(美国英语)Messages_zh_CN.properties(简体中文)加载顺序:当指定一个Locale时,ResourceBundle会按以下顺序查找:1.baseName+"_"+当前Locale的语言+"_"+当前Locale的国家+"_"+当前Locale的变体2.baseName+"_"+当前Locale的语言+"_"+当前Locale的国家3.baseName+"_"+当前Locale的语言4.baseName+"_"+默认的Locale5.baseName6.如果以上都找不到,则抛出MissingResourceException(除非设置了回退机制)常用方法:1.getBundle(StringbaseName):使用默认Locale和默认类加载器获取资源包。2.getBundle(StringbaseName,Localelocale):使用指定的Locale。3.getBundle(StringbaseName,Localelocale,ClassLoaderloader):指定类加载器。4.getString(Stringkey):通过键获取字符串值。示例步骤:步骤1:创建资源文件(放在类路径下)例如:Messages.properties(默认)greeting=Hellofarewell=GoodbyeMessages_zh_CN.propertiesgreeting=你好farewell=再见步骤2:在Java代码中加载资源包并获取字符串注意:资源文件通常采用ISO-8859-1编码,因此对于非西欧字符,需要使用\uxxxx形式进行转义(如中文需要转成Unicode转义序列)。或者,可以使用native2ascii工具转换,或者从Java9开始,可以使用UTF-8编码(但需要配置)。示例代码:```javaimportjava.util.Locale;importjava.util.ResourceBundle;publicclassResourceBundleExample{publicstaticvoidmain(String[]args){//使用默认Locale(系统默认)ResourceBundledefaultBundle=ResourceBundle.getBundle("Messages");System.out.println("DefaultLocaleGreeting:"+defaultBundle.getString("greeting"));//使用指定Locale(中文,中国)LocalechineseLocale=newLocale("zh","CN");ResourceBundlechineseBundle=ResourceBundle.getBundle("Messages",chineseLocale);System.out.println("ChineseGreeting:"+chineseBundle.getString("greeting"));//使用英文LocaleResourceBundleenglishBundle=ResourceBundle.getBundle("Messages",Locale.US);System.out.println("EnglishGreeting:"+englishBundle.getString("greeting"));//注意:如果找不到Messages_en_US.properties,会回退到Messages_en.properties,再回退到Messages.properties}}```异常处理:当找不到资源包时,会抛出MissingResourceException。因此,建议在不确定资源是否存在时,可以先检查资源包是否存在,或者捕获异常。控制资源加载过程:从Java6开始,ResourceBundle.Control类允许我们自定义资源包的加载过程(例如,指定资源文件的编码格式、缓存时间等)。示例:使用UTF-8编码加载属性文件(避免Unicode转义)注意:在Java9之前,ResourceBundle默认不支持UTF-8,我们可以通过继承ResourceBundle.Control并重写newBundle方法来使用UTF-8读取属性文件。但自Java9开始,ResourceBundle支持UTF-8,只需在属性文件中使用UTF-8编码,并在文件扩展名前加上".utf8"(例如:Messages_zh_CN.utf8.properties)或者通过配置参数指定。然而,为了兼容性,我们展示一个自定义Control的示例(适用于Java6及以上):```javaimportjava.io.IOException;importjava.io.InputStream;importjava.io.InputStreamReader;importjava.net.URL;importjava.net.URLConnection;importjava.util.Locale;importjava.util.PropertyResourceBundle;importjava.util.ResourceBundle;publicclassUtf8ResourceBundleControlextendsResourceBundle.Control{@OverridepublicResourceBundlenewBundle(StringbaseName,Localelocale,Stringformat,ClassLoaderloader,booleanreload)throwsIllegalAccessException,InstantiationException,IOException{//下面的代码参考了默认实现,但修改为读取UTF-8StringbundleName=toBundleName(baseName,locale);StringresourceName=toResourceName(bundleName,"properties");InputStreamstream=null;if(reload){URLurl=loader.getResource(resourceName);if(url!=null){URLConnectionconnection=url.openConnection();if(connection!=null){connection.setUseCaches(false);stream=connection.getInputStream();}}}else{stream=loader.getResourceAsStream(resourceName);}if(stream!=null){try{//使用InputStreamReader指定UTF-8编码returnnewPropertyResourceBundle(newInputStreamReader(stream,"UTF-8"));}finally{stream.close();}}returnnull;}}//使用自定义ControlpublicclassResourceBundleExample2{publicstaticvoidmain(String[]args){ResourceBundlebundle=ResourceBundle.getBundle("Messages",Locale.getDefault(),newUtf8ResourceBundleControl());System.out.println(bundle.getString("greeting"));}}```在Java9及更高版本中,我们可以使用内置的UTF-8支持,而不需要自定义Control。方法是通过在创建ResourceBundle时指定一个控制属性,或者使用模块化系统来配置。总结:ResourceBundle是Java国际化的核心类,通过属性文件存储不同语言的文本,然后根据Locale动态加载。在使用时,注意资源文件的命名规则和编码问题。相关问题:1.ResourceBundle如何实现资源文件的加载顺序?2.如何处理ResourceBundle中的非西欧字符(例如中文)?3.如何自定义ResourceBundle的加载机制(例如从数据库加载)?4.在Java9及以上版本中,ResourceBundle有哪些改进?5.如何避免MissingResourceException?</think>### Java.util.ResourceBundle 详解 `java.util.ResourceBundle` 是 Java 国际化(i18n)的核心类,用于加载特定语言环境的资源文件,实现应用程序的多语言支持。以下是详细用法和示例: --- #### 一、核心功能 1. **多语言资源加载** 根据 `Locale` 自动加载匹配的资源文件 2. **层次化查找** 按优先级查找:`特定语言 > 默认语言 > 基础资源` 3. **文件格式支持** 主要支持 `.properties` 文件,也可扩展自定义格式[^2] --- #### 二、基础用法 ##### 1. 文件命名规则 ```bash # 基础文件(默认) messages.properties # 中文资源 messages_zh_CN.properties # 英文资源(美国) messages_en_US.properties ``` ##### 2. 资源文件内容示例 `messages_zh_CN.properties`: ```properties welcome=欢迎使用本系统 error.404=页面未找到 button.submit=提交 ``` `messages_en_US.properties`: ```properties welcome=Welcome to the system error.404=Page not found button.submit=Submit ``` ##### 3. Java 代码加载资源 ```java import java.util.Locale; import java.util.ResourceBundle; public class I18nExample { public static void main(String[] args) { // 加载中文资源 Locale cnLocale = new Locale("zh", "CN"); ResourceBundle cnBundle = ResourceBundle.getBundle("messages", cnLocale); System.out.println(cnBundle.getString("welcome")); // 输出: 欢迎使用本系统 // 加载英文资源 Locale usLocale = new Locale("en", "US"); ResourceBundle usBundle = ResourceBundle.getBundle("messages", usLocale); System.out.println(usBundle.getString("error.404")); // 输出: Page not found // 加载系统默认资源 ResourceBundle defaultBundle = ResourceBundle.getBundle("messages"); System.out.println(defaultBundle.getString("button.submit")); } } ``` --- #### 三、高级用法 ##### 1. 带控制参数的加载 ```java ResourceBundle bundle = ResourceBundle.getBundle( "messages", Locale.JAPANESE, // 目标语言 new ResourceBundle.Control() { // 自定义资源加载逻辑 @Override public ResourceBundle newBundle(String baseName, Locale locale, String format, ClassLoader loader, boolean reload) { // 自定义实现... } } ); ``` ##### 2. 处理资源缺失异常 ```java try { ResourceBundle bundle = ResourceBundle.getBundle("nonexistent"); } catch (MissingResourceException e) { System.err.println("资源文件缺失: " + e.getMessage()); // 使用默认值或日志记录 // 引用[2] } ``` ##### 3. 获取所有键值 ```java ResourceBundle bundle = ResourceBundle.getBundle("messages", Locale.US); Set<String> keys = bundle.keySet(); keys.forEach(key -> System.out.println(key + " = " + bundle.getString(key)) ); ``` --- #### 四、资源查找顺序 当调用 `getBundle("messages", new Locale("zh", "CN", "Hubei"))` 时: 1. `messages_zh_CN_Hubei.properties` 2. `messages_zh_CN.properties` 3. `messages_zh.properties` 4. `messages.properties`(基础文件) 5. 若均未找到,抛出 `MissingResourceException`[^2] --- #### 五、最佳实践 1. **文件编码** 使用 `native2ascii` 工具处理非ASCII字符 ```bash native2ascii -encoding UTF-8 input.properties output.properties ``` 2. **资源组织** 按模块拆分资源文件: ```bash ui_messages.properties error_messages.properties ``` 3. **动态刷新** Java 9+ 支持资源热更新: ```java ResourceBundle.clearCache(); // 清除缓存 ``` 4. **默认值设置** 避免 `MissingResourceException`: ```java String value = bundle.containsKey("key") ? bundle.getString("key") : "默认值"; ``` --- #### 六、类结构图 ```mermaid classDiagram ResourceBundle <|-- PropertyResourceBundle ResourceBundle <|-- ListResourceBundle ResourceBundle : +getString(String key) ResourceBundle : +getBundle(String baseName) ResourceBundle : +getBundle(String baseName, Locale locale) class PropertyResourceBundle { +Properties properties +handleGetObject() } class ListResourceBundle { +Object[][] contents +handleGetObject() } ``` --- #### 七、典型应用场景 1. **Web应用国际化** JSP/Servlet 中结合 `fmt` 标签库使用 2. **桌面应用多语言** Swing/JavaFX 界面文本动态切换 3. **错误消息本地化** 根据用户区域显示不同语言的错误信息 4. **API响应国际化** RESTful 接口返回本地化消息 > **关键原则**:始终提供基础资源文件(无语言后缀)作为默认值[^1] --- ### 总结 `ResourceBundle` 是实现 Java 国际化的核心组件,通过: 1. **层次化资源查找** 自动匹配最佳语言版本 2. **属性文件管理** 分离代码与文本内容 3. **Locale驱动** 根据用户环境动态加载资源 正确处理资源缺失异常和文件编码是保证国际化的关键[^2][^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值