day06

152 阅读4分钟

1.JAVA中ResourceBundle使用详解

  • 这个类主要用来解决国际化和本地化问题。国际化和本地化可不是两个概念,两者都是一起出现的。可以说,国际化的目的就是为了实现本地化。比如对于“取消”,中文中我们使用“取消”来表示,而英文中我们使用“cancel”。若我们的程序是面向国际的(这也是软件发展的一个趋势),那么使用的人群必然是多语言环境的,实现国际化就非常有必要。而ResourceBundle可以帮助我们轻松完成这个任务:当程序需要一个特定于语言环境的资源时(如 String),程序可以从适合当前用户语言环境的资源包(大多数情况下也就是.properties文件)中加载它。这样可以编写很大程度上独立于用户语言环境的程序代码,它将资源包中大部分(即便不是全部)特定于语言环境的信息隔离开来。

  • 这使编写的程序可以

    • 轻松地本地化或翻译成不同的语言
    • 一次处理多个语言环境
    • 以后可以轻松进行修改,以便支持更多的语言环境

说的简单点,这个类的作用就是读取资源属性文件(properties),然后根据.properties文件的名称信息(本地化信息),匹配当前系统的国别语言信息(也可以程序指定),然后获取相应的properties文件的内容。

使用这个类,properties需要遵循一定的命名规范,一般的命名规范是: 自定义名语言代码国别代码.properties,如果是默认的,直接写为:自定义名.properties。

比如:

myres_en_US.properties

myres_zh_CN.properties

myres.properties

当在中文操作系统下,如果myres_zh_CN.properties、myres.properties两个文件都存在,则优先会使用myres_zh_CN.properties,当myres_zh_CN.properties不存在时候,会使用默认的myres.properties。

没有提供语言和地区的资源文件是系统默认的资源文件。

资源文件都必须是ISO-8859-1编码,因此,对于所有非西方语系的处理,都必须先将之转换为Java Unicode Escape格式。转换方法是通过JDK自带的工具native2ascii.

  • ResourceBundle的类层次结构

Snipaste_2024-01-17_15-36-05.png

  • 从ResourceBundle中获取值

    • 获取ResourceBundle实例后可以通过下面的方法获得本地化值。
    • getObject(String key);
    • getString(String key);
    • getStringArray(String key);
    • 还可以通过keySet()方法获取所有的key。Set keys = bundle.keySet(); 其它ResourceBundle 方法可以通过查看文档获得。
  • 测试及验证

    • 新建4个属性文件
my_en_US.properties:cancelKey=cancel
my_zh_CN.properties:cancelKey=\u53D6\u6D88(取消)
my_zh.properties:cancelKey=\u53D6\u6D88zh(取消zh)
my.properties:cancelKey=\u53D6\u6D88default(取消default
  • 获取bundle
ResourceBundle bundle = ResourceBundle.getBundle("res", new Locale("zh", "CN"));
  • 其中new Locale(“zh”, “CN”)提供本地化信息,上面这行代码,程序会首先在classpath下寻找my_zh_CN.properties文件,若my_zh_CN.properties文件不存在,则取找my_zh.properties,如还是不存在,继续寻找my.properties,若都找不到就抛出异常。

  • 代码

import javax.annotation.Resource;
import java.util.Locale;
import java.util.ResourceBundle;

/**
 * @author OovEver
 * 2018/1/14 22:12
 */
public class Main {

    public static void main(String args[]) {
        ResourceBundle bundle = ResourceBundle.getBundle("my", new Locale("zh", "CN"));
        String cancel = bundle.getString("cancelKey");
        System.out.println(cancel);

        bundle = ResourceBundle.getBundle("my", Locale.US);
        cancel = bundle.getString("cancelKey");
        System.out.println(cancel);

        bundle = ResourceBundle.getBundle("my", Locale.getDefault());
        cancel = bundle.getString("cancelKey");
        System.out.println(cancel);

        bundle = ResourceBundle.getBundle("my", Locale.GERMAN);
        cancel = bundle.getString("cancelKey");
        System.out.println(cancel);
        bundle = ResourceBundle.getBundle("my");
        for (String key : bundle.keySet()) {
            System.out.println(bundle.getString(key));
        }
    }
}

Snipaste_2024-01-17_15-42-41.png

2.File.separator

是 Java 中用于表示文件路径分隔符的常量。它是一个字符串,表示操作系统文件系统路径中的目录分隔符,可以是斜杠 ("/") 或反斜杠 ("")。

在不同的操作系统中,文件路径的分隔符是不同的:

  • 在类Unix/Linux系统中,通常使用斜杠 ("/") 作为文件路径分隔符。
  • 在Windows系统中,通常使用反斜杠 ("") 作为文件路径分隔符。

为了使 Java 代码在不同操作系统上具有可移植性,可以使用 File.separator 来表示文件路径分隔符,而不直接硬编码使用具体的分隔符。这样,代码就可以在任何操作系统上正确运行。

示例:

java
import java.io.File;

public class FileSeparatorExample {
    public static void main(String[] args) {
        String path = "myfolder" + File.separator + "myfile.txt";
        System.out.println("File path: " + path);
    }
}

在上述示例中,File.separator 被用来连接文件夹名和文件名,确保在不同操作系统上都能够正确构建文件路径。这样的做法有助于实现跨平台的文件路径处理。

3.小结

今天小结:完成车间数据库的内容填充,用xml存储数据。