如何在Java 7中为现有国家/地区代码的java.util.Currency添加新货币?

sha*_*kan 9 java jvm currency java-7

例如,中国货币有ISO 4217代码CNY.由于该货币的自由全球交易受到限制,因此有第二种"离岸"货币等价物,称为CNH.维基百科对这一切有一点总结.

Java 7,有一种方法可以更新ISO 4217 JVM附带的三个字母代码集.但是,它不能用于向现有国家/地区代码添加单独的货币代码:它将替换CNYCNH,这对我的目的没有好处.

如何在不覆盖的情况下将CNH(不在ISO 4217列表中)添加到可用货币集中? Java 7CNY

换句话说,如何为一个国家/地区获取多种货币代码?

请注意,这个问题:如何将新货币代码添加到Java?提出和回答Java 6中.但是替换策略java.util.CurrencyData不起作用,因为该文件不再存在.

sha*_*kan 11

这里的关键是改变Java 7的一部分,允许更新货币列表而无需通过替换一个名为的文件来重建rt.jar currency.data.使用此方法而不是currency.properties覆盖方法,允许您添加新的货币代码,而不会影响来自同一国家/地区的其他代码.

什么是未说明的是如何实际建立一个新的currency.data.该文件是从一个名为的文件生成的CurrencyData.properties,可以在java/util的OpenJDK源代码中找到.

我做的是复制CurrencyData.propertiesOpenJDK源(openjdk\jdk\src\share\classes\java\util)中找到的,并更改了行:

BZD084-CAD124-CDF976-CHF756-CLF990-CLP152-CNY156-COP170-CRC188-CSD891-CUP192-\
Run Code Online (Sandbox Code Playgroud)

BZD084-CAD124-CDF976-CHF756-CLF990-CLP152-CNH156-CNY156-COP170-CRC188-CSD891-CUP192-\
Run Code Online (Sandbox Code Playgroud)

然后我抓住了GenerateCurrencyData.java源代码发布中的文件openjdk\jdk\make\tools\src\build\tools\generatecurrencydata.此实用程序以与CurrencyData.properties相同的格式从System.In获取输入,并将其转换为currency.data文件.我做了一个小改动,以便它使用FileInputStream而不是System.In:

currencyData.load(System.in);
Run Code Online (Sandbox Code Playgroud)

currencyData.load(new FileInputStream(fileName));
Run Code Online (Sandbox Code Playgroud)

在您编辑的CurrencyData.properties文件上运行该文件,并在将原始.data文件放在安全的地方后,将生成的currency.data文件放入JRE\lib目录,然后您就可以运行使用的代码了Currency.getInstance("CNH").