1. package org.jr.text;
  2. /**
  3. * Copyright: Copyright (c) 2002-2004
  4. * Company: JavaResearch(http://www.javaresearch.org)
  5. * 最后更新日期:2003年3月3日
  6. * @author Cherami
  7. */
  8. import java.text.*;
  9. /**
  10. * 文件大小格式化类。
  11. * 这个类本来应该是从NumberFormat类继承而来,但是由于NumberFormat的format(long number)被定义为
  12. * final的,因此采取从Format继承,其内容实际就是一个NumberFormat。
  13. * @since 0.5
  14. */
  15. public class FileSizeFormat
  16. extends Format {
  17. public static final int BYTE = 0;
  18. public static final int KILO = 1;
  19. public static final int MEGA = 2;
  20. public static final int GIGA = 3;
  21. public static final long KILOBYTE = 1024;
  22. public static final long MEGABYTE = 1024 * 1024;
  23. public static final long GIGABYTE = 1024 * 1024 * 1024;
  24. public static final String[] defaultUnitNames = {
  25. "B", "K", "M", "G"};
  26. public static final String defaultFormat = "#,##0.##";
  27. String format;
  28. String[] unitNames;
  29. boolean showUnitName = false;
  30. NumberFormat formatter;
  31. /**
  32. * 得到一个缺省的FileSizeFormat。
  33. * 即不显示尺寸的单位,格式为缺省格式"#,##0.##"。
  34. * @since 0.5
  35. */
  36. public FileSizeFormat() {
  37. this(defaultFormat, false, null);
  38. }
  39. /**
  40. * 根据指定的格式构造一个FileSizeFormat。
  41. * 不显示尺寸的单位。
  42. * @param format 格式
  43. * @since 0.5
  44. */
  45. public FileSizeFormat(String format) {
  46. this(format, false, null);
  47. }
  48. /**
  49. * 根据指定的属性构造一个FileSizeFormat。
  50. * @param showUnitName 是否显示单位
  51. * @since 0.5
  52. */
  53. public FileSizeFormat(boolean showUnitName) {
  54. this(defaultFormat, showUnitName, defaultUnitNames);
  55. }
  56. /**
  57. * 根据指定单位构造一个FileSizeFormat。
  58. * 显示尺寸的单位。
  59. * @param unitNames 单位,依次为字节、千字节、兆字节和百兆字节的单位。
  60. * @since 0.5
  61. */
  62. public FileSizeFormat(String[] unitNames) {
  63. this(defaultFormat, true, unitNames);
  64. }
  65. /**
  66. * 根据指定的格式和单位构造一个FileSizeFormat。
  67. * 显示尺寸的单位。
  68. * @param format 格式
  69. * @param unitNames 单位,依次为字节、千字节、兆字节和百兆字节的单位。
  70. * @since 0.5
  71. */
  72. public FileSizeFormat(String format, String[] unitNames) {
  73. this(format, true, unitNames);
  74. }
  75. /**
  76. * 根据指定的格式和是否显示尺寸单位构造一个FileSizeFormat。
  77. * @param format 格式
  78. * @param showUnitName true的时候显示单位,使用缺省的单位。
  79. * @since 0.5
  80. */
  81. public FileSizeFormat(String format, boolean showUnitName) {
  82. this(format, showUnitName, defaultUnitNames);
  83. }
  84. /**
  85. * 根据指定的格式和是否显示尺寸单位构造一个FileSizeFormat。
  86. * @param format 格式
  87. * @param showUnitName true的时候显示单位,使用缺省的单位。
  88. * @param unitNames 单位,依次为字节、千字节、兆字节和百兆字节的单位。
  89. * @since 0.5
  90. */
  91. public FileSizeFormat(String format, boolean showUnitName, String[] unitNames) {
  92. this.format = format;
  93. formatter = new DecimalFormat(format);
  94. this.showUnitName = showUnitName;
  95. this.unitNames = unitNames;
  96. }
  97. /**
  98. * 得到可读的数字大小,一般用于文件尺寸。
  99. * @param number 数字,一般应该是Long类型的
  100. * @return 格式化以后的字符串
  101. * @since 0.5
  102. */
  103. public String format(Number number) {
  104. return format(number.longValue(), getUnit(number.longValue()));
  105. }
  106. /**
  107. * 得到可读的数字大小。
  108. * @param size 原始大小
  109. * @return 格式化以后的字符串
  110. * @since 0.5
  111. */
  112. public String format(long size) {
  113. return format(size, getUnit(size));
  114. }
  115. /**
  116. * 得到数字的单位,一般用于文件尺寸。
  117. * @param number 数字,一般应该是Long类型的
  118. * @return number的long值在1024以下时返回BYTE,依次类推直到GIGA。
  119. * @since 0.5
  120. */
  121. public int getUnit(Number number) {
  122. return getUnit(number.longValue());
  123. }
  124. /**
  125. * 得到数字的单位。
  126. * @param size 原始大小
  127. * @return size的值在1024以下时返回BYTE,依次类推直到GIGA。
  128. * @since 0.5
  129. */
  130. public int getUnit(long size) {
  131. if (size < KILOBYTE) {
  132. return BYTE;
  133. }
  134. else if (size < MEGABYTE) {
  135. return KILO;
  136. }
  137. else if (size < GIGABYTE) {
  138. return MEGA;
  139. }
  140. else {
  141. return GIGA;
  142. }
  143. }
  144. /**
  145. * 得到格式化的大小。
  146. * @param number 原始大小
  147. * @param unit 单位
  148. * @return 根据单位进行格式化后的字符串大小
  149. * @since 0.5
  150. */
  151. public String format(Number number, int unit) {
  152. return format(number.longValue(), unit);
  153. }
  154. /**
  155. * 设置格式化时的格式。
  156. * @param format 格式
  157. * @since 0.5
  158. */
  159. public void setFormat(String format) {
  160. this.format = format;
  161. }
  162. /**
  163. * 得到格式时的格式。
  164. * @return 格式时的格式
  165. * @since 0.5
  166. */
  167. public String getFormat() {
  168. return format;
  169. }
  170. /**
  171. * 得到格式化的大小。
  172. * @param size 原始大小
  173. * @param unit 单位
  174. * @return 根据单位进行格式化后的字符串大小
  175. * @since 0.5
  176. */
  177. public String format(long size, int unit) {
  178. String result;
  179. switch (unit) {
  180. case BYTE:
  181. result = formatter.format(size);
  182. break;
  183. case KILO:
  184. result = formatter.format( ( (double) size) / ( (double) KILOBYTE));
  185. break;
  186. case MEGA:
  187. result = formatter.format( ( (double) size) / ( (double) MEGABYTE));
  188. break;
  189. case GIGA:
  190. result = formatter.format( ( (double) size) / ( (double) GIGABYTE));
  191. break;
  192. default:
  193. result = formatter.format(size);
  194. break;
  195. }
  196. if (showUnitName == true) {
  197. result += unitNames[unit];
  198. }
  199. return result;
  200. }
  201. /**
  202. * 设置显示单位的名称。
  203. * 这个方法同时也会将设置显示单位名称。
  204. * @param unitNames 名称数组
  205. * @since 0.5
  206. */
  207. public void setUnitNames(String[] unitNames) {
  208. showUnitName = true;
  209. this.unitNames = unitNames;
  210. }
  211. /**
  212. * 返回显示名称数组。
  213. * @return 名称数组
  214. * @since 0.5
  215. */
  216. public String[] getUnitNames() {
  217. return unitNames;
  218. }
  219. /**
  220. * 设置是否显示单位名称。
  221. * 如果显示单位名称但是名称数组为null时设置为缺省单位名称。
  222. * @param visible 是否显示单位名称
  223. * @since 0.5
  224. */
  225. public void setUnitNameVisible(boolean visible) {
  226. showUnitName = visible;
  227. if (showUnitName == true && unitNames == null) {
  228. unitNames = defaultUnitNames;
  229. }
  230. }
  231. /**
  232. * 是否显示单位名称。
  233. * @return 显示时返回true,否则返回false
  234. * @since 0.5
  235. */
  236. public boolean isUnitNameVisible() {
  237. return showUnitName;
  238. }
  239. /**
  240. * 解析字符串为一个对象。
  241. * @param source 要解析的对象字符串
  242. * @param pos 解析位置
  243. * @return 经NumberFormat解析的结果
  244. * @since 0.5
  245. */
  246. public Object parseObject(String source,
  247. ParsePosition pos) {
  248. return formatter.parseObject(source, pos);
  249. }
  250. /**
  251. * 根据指定的对象和附加对象进行格式化。
  252. * @param obj 格式化的对象
  253. * @param toAppendTo 附件的文本信息
  254. * @param pos 格式化的文本中的位置信息
  255. * @return 经NumberFormat格式化以后的StringBuffer
  256. * @since 0.5
  257. */
  258. public StringBuffer format(Object obj,
  259. StringBuffer toAppendTo,
  260. FieldPosition pos) {
  261. return formatter.format(obj, toAppendTo, pos);
  262. }
  263. }