許多的InputStream 與OutputStream 的子類實作了DataInput 介面,其中有讀寫UTF8字串的方法,
DataInput.readUTF() 與writeUTF() 方法。用位元組方式取得這些串流時,這些串流的位元組數量不是剛好等於2Byte * 字數,而是2Byte+ 2Byte * 字數,多出來的2Byte位元組是用來表示UTF字串長度的,將換算整數會得到字串長度。
20111022
20111021
eclipse java 中文亂碼問題
環境:win7
IDE:eclipse Helios Service Release 2
Console預設字集: UTF-8
串流輸入預設編碼: UTF8
串流輸出預設編碼: UTF8
問題 :console所輸入的中文字串,無法正確的顯示回console,尚未使用CMD測試
1. 外部已編輯好的UTF8編碼文字檔,可以正確讀出顯示在console
2. 程式內給予初值的字串,可以正確顯示
3. console取得的字串,無法正確的存入外部文字檔,文字檔內容為亂碼
4. 以MS950編碼取得亂碼的位元組,在強制編成UTF8,部分文字可正確顯示
IDE:eclipse Helios Service Release 2
Console預設字集: UTF-8
串流輸入預設編碼: UTF8
串流輸出預設編碼: UTF8
問題 :console所輸入的中文字串,無法正確的顯示回console,尚未使用CMD測試
1. 外部已編輯好的UTF8編碼文字檔,可以正確讀出顯示在console
2. 程式內給予初值的字串,可以正確顯示
3. console取得的字串,無法正確的存入外部文字檔,文字檔內容為亂碼
4. 以MS950編碼取得亂碼的位元組,在強制編成UTF8,部分文字可正確顯示
System.out.println("系統預設編碼: "+Charset.defaultCharset());
BufferedReader reader=null;
InputStreamReader stream =new InputStreamReader(System.in);
reader = new BufferedReader(stream);
System.out.println("串流預設編碼: "+stream.getEncoding());
byte[] binary=null;
String str =null;
System.out.println(str = reader.readLine());
reader.close();
binary = str.getBytes("UTF-16");
System.out.println(new String(binary,"UTF-16"));
System.out.printf("UTF-16: ") ;
for(byte b:binary){
System.out.print(Integer.toHexString(b & 0x00ff) + " ");
}
System.out.println();
binary = str.getBytes("UTF-8");
System.out.println(new String(binary,"UTF-8"));
System.out.printf("UTF-8: ");
for(byte b:binary){
System.out.print(Integer.toHexString(b & 0x00ff) + " ");
}
System.out.println();
binary = str.getBytes("MS950");
System.out.println(new String(binary,"MS950"));
System.out.printf("MS950: ");
for(byte b:binary){
System.out.print(Integer.toHexString(b & 0x00ff) + " ");
}
//某些字串可以用ms950編碼正確顯示
System.out.println();
binary = str.getBytes("MS950");
System.out.println(new String(binary,"UTF8"));
for(byte b:binary){
System.out.print(Integer.toHexString(b & 0x00ff) + " ");
}
System.out.println();
//用全部編碼比對
for (String encoding : Charset.availableCharsets().keySet()) {
try{
binary = str.getBytes(encoding);
System.out.printf("%s %s%n",
encoding, new String(binary, "utf8"));
}catch (Exception e) {
continue;
}
}
20111020
Java 關於聲音
java sound
關於聲音
聲音檔案如何計算?
frame size是 取樣位元的大小 通常有16bit 8bit
聲道數是指 單聲、雙聲、五點一之類的
Java取得聲音串流的方法
AudioSystem類提供多種方式取得串流
以下兩種取得聲音串流AudioInputStream 物件。
關於聲音
聲音檔案如何計算?
frames * frame size * 聲道數frames指 取樣頻率44100Hz下,一秒中44100個frames
frame size是 取樣位元的大小 通常有16bit 8bit
聲道數是指 單聲、雙聲、五點一之類的
Java取得聲音串流的方法
AudioSystem類提供多種方式取得串流
以下兩種取得聲音串流AudioInputStream 物件。
AudioSystem.getAudioInputStream(InputStream is);
Audiosystem.getAudioInputStream(File file);
取得聲音串流後,可以取得其頁框長度,也可以取得其Format物件,利用Format物件來得到串流的取樣頻率、取樣位元、頁框大小,利用頁框大小與頁框長度可以算出檔案大小 //取得聲音串流的頁框長度
ais.getFrameLength();
//取得AudioFormat物件
ais.getFormat();
//取得取樣頻率
format.getSampleRate();
//取得頁框大小。回傳Byte
format.getFrameSize();
20111019
swing中的pane
任何頂級容器(JFram, JDailog, JWindow, JApplet, JInterFrame)包含JRootPane,而JRootPane包含一對同級的Glasspane和JLayeredpane。JLayeredpane又包含JContentPane與一個可選的JMenu。
在swing中所有的加入組件都會轉發到ContentPane中,所以實際上Container.add(component)是相同於Container.getContentPane.add(component)。
如何取得ContentPane?
以下三者可以得知平常加入組件的寫法其實是JVM幫忙轉發的
PS.Container.getRootPane().getLayeredPane().getComponent(0)是回傳Component,要記的轉型
在swing中所有的加入組件都會轉發到ContentPane中,所以實際上Container.add(component)是相同於Container.getContentPane.add(component)。
如何取得ContentPane?
以下三者可以得知平常加入組件的寫法其實是JVM幫忙轉發的
Container.getContentPane();
Container.getRootPane().getContentPane();
Container.getRootPane().getLayeredPane().getComponent(0);
System.out.println((Container.getRootPane().getLayeredPane().getComponent(0)==jf.getContentPane())? "true" : "fasle" );
回傳TRUE。PS.Container.getRootPane().getLayeredPane().getComponent(0)是回傳Component,要記的轉型
20111008
ImageIcon 無法取得圖片
首先,確認該負責載入圖形檔案的class檔位置
再來,確認被載入的圖形檔案的位置
最後,依照該class檔來規劃相對路徑取得目標檔案
在使用 ImageIcon 載入圖片時,如果java source使用了package管理,會無法取得用相對路徑規劃的圖形,此時可以用以下方法取得圖形
再來,確認被載入的圖形檔案的位置
最後,依照該class檔來規劃相對路徑取得目標檔案
在使用 ImageIcon 載入圖片時,如果java source使用了package管理,會無法取得用相對路徑規劃的圖形,此時可以用以下方法取得圖形
getClass().getResource("source path");
/*java source 在allsrc/ch02src底下
* 此時要取得allsrc.ch02src.images下的圖形時可以參照下列方法
*/
package allsrc.ch02src;
bgImage = loadImage(this.getClass().getResource("images/background.jpg"));
20111005
如何在執行編譯前自動存檔?
原本eclipse能夠在編譯前自動儲存修改過的檔案,在安裝oracle EE plugin 其中的設定似乎被改過了。更改回來的方法為 preferenece > run/debug > launching
20111003
Eclipse 使用 GlassFish V3.11 環境
file > new > other > server
Download add server adapter
選擇 oracle glassfish server tools > next > install > restrat eclipse
重開後設定 新增server 並設定資訊(localhost、server name)
設定 glassfish 的安裝位置,選擇installed JRE preferences
add >
glassfish使用JDK運作而不是JRE
20111001
訂閱:
文章 (Atom)









