- 10月 22 週五 201018:58
Java Collection二三事
- 7月 22 週四 201019:05
字串轉碼
public static String getEncodingString(String str, String srcEnc, String targetEnc) {
ByteArrayInputStream bais = null;
BufferedReader br = null;
try {
bais = new ByteArrayInputStream(str.getBytes(srcEnc));
br = new BufferedReader(new InputStreamReader(bais, srcEnc));
ByteArrayOutputStream boas = new ByteArrayOutputStream();
OutputStreamWriter osw = new OutputStreamWriter(boas, targetEnc);
osw.write(br.readLine());
osw.flush();
byte[] ba = boas.toByteArray();
for (int i=0; i<ba.length; i++) {
System.out.printf("%02X ", ba[i]);
}
return boas.toString(targetEnc);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
byte baChOneBig5[] = new byte[2];
baChOneBig5[0] = (byte)0xA4; // Big5編碼A440 ==> 0xA4, 0x40
baChOneBig5[1] = (byte)0x40;
String char1 = new String(baChOneBig5, "BIG5"); // 由byte[]轉成String就可以是Big5字串
System.out.println("Big5: " + char1);
System.out.println(" >> " + getEncodingString(char1, "Big5", "Unicode"));
System.out.println(" >> " + getEncodingString(char1, "Big5", "UTF-8"));
Big5: 一
FE FF 4E 00 >> 一 Unicode編碼\u4E00, 但不知前面的FEFF是怎麼來的。
E4 B8 80 >> 一 UTF-8在"一"的編碼。
- 6月 19 週六 201017:37
Big5轉UTF-8
public static void main(String[] args) throws Exception
{
BufferedReader br = new BufferedReader(
new InputStreamReader(new FileInputStream("./B.xml"), "Big5")); //檔案
// new InputStreamReader(new ByteArrayInputStream(str.getBytes(), "Big5")); //字串
PrintWriter pw = new PrintWriter(
new OutputStreamWriter(new FileOutputStream("./B2.xml"), "UTF8"));
String line = br.readLine();
while (line != null) {
System.out.println(line);
pw.write(line);
line = br.readLine();
}
pw.flush();
pw.close();
}
logger.debug("Encoding:{}", System.getProperty("file.encoding")); // ISO8859-1
logger.debug("Charset:{}", Charset.defaultCharset().name()); // ISO-8859-1
logger.debug("OutputStream:{}", (new OutputStreamWriter(System.out)).getEncoding()); // ISO8859_1
- 6月 14 週一 201020:32
Collection生死戀
- 4月 13 週二 201000:49
web.xml載入順序
- 3月 21 週日 201022:13
Java基本功:annotation usage
@Target({ElementType.FIELD, ElementType.METHOD, ElementType.CONSTRUCTOR})
@Retention ( RetentionPolicy.RUNTIME )
@Documented
@BindingAnnotation
public @interface Blue {}
public enum RentionPolicy {SOURCE, CLASS, RUNTIME};
RentionPolicy rentionPolcy() default RentionPolicy.CLASS;
// 以下是說明傳回其它型態的賦值舉例
String op1(); // @Retention(op1=”Jemmy”), 若只有op1,可能連method name都可省略了
String[] op2(); // @Retention(op1={”Jemmy”,”Tsai”})
boolean op3(); // @Retention(op3=true)
/* 或是像這樣
@Retention(
op1=”Jemmy”, op2={“Jemmy”,”Tsai”}, op3=true
)
*/
}
- 2月 14 週日 201016:39
Java基本功:import static
import static java.lang.System.out;
public class HelloWorld {
public static void main(String[] args) {
out.println("Hello! World!");
}
}
如此一來就不用老打System.out.println,其作用就像C語言的#define(巨集),javac(Java編譯器)遇到out會擴展為System.out,少打幾行字。當然用在System.out太殺雞用牛刀,比較常用在內含豐富的static class library,如JUnit、Math等。當然若引進相同的Class name,編譯器當然會報錯。
- 1月 31 週日 201015:57
Java基本功:過水的網頁
1.Input Form JSP:
<table>
<tr>
<td> Title 1</td>
<td> Title 2</td>
</tr>
<% for (int i=0; i<20; i++) { %>
<tr>
<td> <Input type="text" name="T1"/></td>
<td> <Input type="text" name="T2"/></td>
</tr>
<% } %>
</table>
上例的JSP,會創造T1、T2陣列的Request,之後Submit到過水的頁面。
2.過水頁面
<% // 傳同名input name會是String陣列取得,是故一定要用getParameterValues,若單一值則用getParameter。
String[] T1s = request.getParameterValues("T1");
String[] T2s = request.getParameterValues("T2");
… // 轉成List<Map<key, data>>
session.setAttribute("list", list); // 步驟2:寫到Session
response.sendRedirect("tested.jsp"); // 步驟3:導到受測url。
%>
- 10月 03 週六 200923:29
Java基本功:Singleton
- private statice Singleton uniqueInstance = new Singleton(); // 不採延遲實體化方式
- 使用JDK 5.0才有的double-checked locking,在getInstance()內容寫法如下:
if (uniqueInstance == null) {
synchronized (Singleton.class) {
if (uniqueInstance == null) {
uniqueInstance = new Singleton();
}
}
}
}
這招是另一位Bob Lee寫的Singleton,相當Simple:
- 8月 28 週五 200912:04
Java基本功:調整JVM的Memory和Stack
