20111022

DataInput.readUTF與writeUTF

許多的InputStream 與OutputStream 的子類實作了DataInput 介面,其中有讀寫UTF8字串的方法,
DataInput.readUTF() 與writeUTF()  方法。用位元組方式取得這些串流時,這些串流的位元組數量不是剛好等於2Byte * 字數,而是2Byte+ 2Byte * 字數,多出來的2Byte位元組是用來表示UTF字串長度的,將換算整數會得到字串長度。

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,部分文字可正確顯示


            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

關於聲音
聲音檔案如何計算?
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

SwingUtilities

如果想知道螢幕 與 組件 之間的的特定座標
//特定座標 的螢幕座標 與 組件的螢幕座標 差距
SwingUtilities.convertPointFromScreen(p, c);

//特定座標 位於 組件的位置 換算成螢幕座標
SwingUtilities.convertPointToScreen(p, c);

Thread 查詢時可能有用
//查詢此執行緒是否為EDT
SwingUtilities.isEventDispatchThread();


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幫忙轉發的
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管理,會無法取得用相對路徑規劃的圖形,此時可以用以下方法取得圖形
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

Eclipse 安裝 javaFX plugin

這裡是安裝oracle的外掛,只支援javaFX 1.2.1 SDK

Download and install JavaFX 1.2.1 SDK.
PS. JavaFX 1.2.1 SDK需要jre6.0以上版本

eclipse > help > install new software
name: javaFX
url: http://javafx.com/downloads/eclipse-plugin/

PS.沒有程式碼提示 沒有程式碼自動完成