推 ellinas:感謝分享 我不知道他有這麼多小功能 01/08 21:59
Apache Commons 有蠻多小工具的 :)
自己寫雖然不算難, 不過別人都寫好了也考慮了很多例外的狀況
像一個讀取文字檔成為字串的小工具
public class CommonsIoTest extends TestCase {
public static String readFromFile(File file, String enc) throws IOException {
ByteArrayOutputStream out = new ByteArrayOutputStream();
InputStream in = new BufferedInputStream(new FileInputStream(file));
int c = 0;
while((c=in.read())!=-1){
out.write(c);
}
return new String(out.toByteArray(), enc);
}
public void testReadFile() throws Exception {
File file = new File(CommonsIoTest.class.getResource(
"CommonsIoTest.java").getFile());
String text1 = CommonsIoTest.readFromFile(file, "utf-8");
String text2 = FileUtils.readFileToString(file, "utf-8");
assertEquals(text1, text2);
}
}
即使自己寫(先不考慮最佳化), 也不算困難.
但是因為 Commons 提供了一堆小工具, 我們可以簡單以一行來達成
而且這些 library 都是大家能取得的, 下面介紹一些我自己常用到的類別:
=============================================================
public class CommonsLangTest extends TestCase {
String[] array = { "a", "b", "o", "d", "c", "e" };
/**
* 找索引
*/
public void testArrayIndex() throws Exception {
int idx = -1;
for (int i = 0; i < array.length; i++) {
if ("b".equals(array[i])) {
idx = i;
break;
}
}
assertEquals(idx, ArrayUtils.indexOf(array, "b"));
}
/**
* 增加元素
*/
public void testArrayAdd() throws Exception {
String newElement = "orz";
String[] newArray = new String[array.length + 1];
System.arraycopy(array, 0, newArray, 0, array.length);
newArray[newArray.length - 1] = newElement;
// 因為 Array Object 沒有覆寫 equals, hashCode 先轉成 String 再比較
// assertEquals(newArray, ArrayUtils.add(array, "orz"));
assertEquals(ArrayUtils.toString(newArray), ArrayUtils
.toString(ArrayUtils.add(array, "orz")));
}
/**
* 刪除索引位置的元素
*/
public void testArrayRemoveByIndex() throws Exception {
int index = 3;
String[] newArray = new String[array.length - 1];
System.arraycopy(array, 0, newArray, 0, index);
System.arraycopy(array, index + 1, newArray, index, newArray.length
- index);
assertEquals(ArrayUtils.toString(newArray), ArrayUtils
.toString(ArrayUtils.remove(array, index)));
}
/**
* 找出元素並刪除
*/
public void testArrayRemoveByElement() throws Exception {
int index = -1;
for (int i = 0; i < array.length; i++) {
if ("o".equals(array[i])) {
index = i;
break;
}
}
String[] newArray = new String[array.length - 1];
System.arraycopy(array, 0, newArray, 0, index);
System.arraycopy(array, index + 1, newArray, index, newArray.length
- index);
assertEquals(ArrayUtils.toString(newArray), ArrayUtils
.toString(ArrayUtils.removeElement(array, "o")));
}
/**
* 判斷空白字串
*/
public void testStringIsBlank() throws Exception {
String str1 = null;
String str2 = " ";
String str3 = " \r \r\n ";
assertTrue(StringUtils.isBlank(str1));
assertTrue(str1 == null || "".equals(str1.trim()));
assertTrue(StringUtils.isBlank(str2));
assertTrue(str2 == null || "".equals(str2.trim()));
assertTrue(StringUtils.isBlank(str3));
assertTrue(str3 == null || "".equals(str3.trim()));
}
/**
* 判斷字串是否是數值
*/
public void testStringIsNumeric() throws Exception {
assertTrue(StringUtils.isNumeric("1234"));
// 有小數的不行 :)
assertFalse(StringUtils.isNumeric("456.3"));
}
/**
* 判斷字串是否是數值
*/
public void testNumber() throws Exception {
assertTrue(NumberUtils.isDigits("12345"));
assertFalse(NumberUtils.isDigits("12345L"));
assertTrue(NumberUtils.isNumber("12345L"));
assertTrue(NumberUtils.isNumber("3e003"));
}
/**
* 字串反轉
*/
public void testStringReverse() throws Exception {
assertEquals(StringUtils.reverse("123456789"), "987654321");
assertEquals(new StringBuffer("123456789").reverse().toString(),
"987654321");
}
/**
* 製作隨機字串
*/
public void testRandomString() throws Exception {
int len = 10;
StringBuffer buf = new StringBuffer();
List chars = Arrays.asList(ArrayUtils.toObject("0123456789abcdef"
.toCharArray()));
while (len-- > 0) {
Collections.shuffle(chars);
buf.append(chars.get(0));
}
// 產生長度 10 的字串
String str1 = RandomStringUtils.random(10, "0123456789abcdef");
assertEquals(10, str1.length());
assertEquals(10, buf.toString().length());
System.out.println(str1);
System.out.println(buf.toString());
}
/**
* 處理特殊字元
*/
public void testEscape() throws Exception {
String escapedHtml = StringEscapeUtils.escapeHtml("<中文/>");
String escapedSQL = StringEscapeUtils.escapeSql("' OR 1=1 UNION * ");
String escapedXml = StringEscapeUtils.escapeXml("<x> a < b </x>");
assertEquals(escapedHtml, "<中文/>");
assertEquals(escapedSQL, "'' OR 1=1 UNION * ");
assertEquals(escapedXml, "<x> a < b </x>");
}
/**
* 格式化日期
*/
public void testDateFormat() throws Exception {
Date now = new Date();
DateFormat df = new SimpleDateFormat("yyyy-MM-dd a K:h", Locale.TAIWAN);
df.format(now);
System.out.println(df.format(now));
assertEquals(df.format(now), DateFormatUtils.format(now,
"yyyy-MM-dd a K:h", Locale.TAIWAN));
}
/**
* 由字串轉 Locale
*/
public void testLocale() throws Exception {
assertEquals(LocaleUtils.toLocale("zh_TW"), Locale.TAIWAN);
}
/**
* 布林判斷
*/
public void testBoolean() throws Exception {
String str = null;
assertFalse(BooleanUtils.toBoolean(str));
assertFalse(BooleanUtils.toBoolean("false"));
assertFalse(BooleanUtils.toBoolean("x gti"));
assertFalse(BooleanUtils.toBoolean("nO"));
assertTrue(BooleanUtils.toBoolean("yEs"));
assertTrue(BooleanUtils.toBoolean("tRUe"));
assertTrue(BooleanUtils.toBoolean("TRUE"));
assertTrue(BooleanUtils.toBoolean("true"));
assertTrue(BooleanUtils.xor(new boolean[] { true, false }));
assertFalse(BooleanUtils.xor(new boolean[] { false, false }));
assertFalse(BooleanUtils.xor(new boolean[] { true, true }));
}
}
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 220.133.80.216
※ 編輯: qrtt1 來自: 220.133.80.216 (01/04 23:22)