總網頁瀏覽量

2016年4月26日 星期二

[Java] substring()應用- substring_test.java

public class substring_test{
    public static void main(String args[]){
        String s = "abcdefg";
       
        System.out.println("0123456");
        System.out.println(s);
        System.out.println(s.length());
        System.out.println("0-2: "+s.substring(0,2));
        System.out.println("1-3: "+s.substring(1,3));
        System.out.println("2: "+s.substring(2));
   
    }
}

- - - - -
0123456  < 用來看清楚編號才加的
abcdefg   < 要截取的字串源
7
0-2: ab
1-3: bc
2: cdefg
- - - - -

切割字串取其中.

屬於 class String, 其中String 繼承 Object class.[1]

     java.lang.Object
        java.lang.String

String substring(int beginIndex)
Returns a new string that is a substring of this string.
String substring(int beginIndex, int endIndex)
Returns a new string that is a substring of this string.

其中, beginIndex就是要且取字串的開始,
一段字串像是一個字元陣列, 由 0 開始,
而endIndex 是結束編號, 會截取在此之前的字串.


[1] https://docs.oracle.com/javase/7/docs/api/java/lang/String.html#substring%28int%29



2016年4月25日 星期一

[Java] Oracle 考試 SCJP-6

考完了SCJP 6, 目前應該要叫做 OCJP,
SCJP 全名是 Sun Certified Java Programme.

考試準備其時也只是上了一堂學校的物件導向程式設計課,
之後也就中斷了,在來也就是寫寫小例題, 單純看 猛虎出閘 SCJP 6,
雖然當下聽不懂, 但是目前看了一堆東西, 在回去看其實了解的也不少.

至於怎麼看, 我很笨, 所以我看了不下10次以上,
我把後面180題做成表格, 每做一題畫一次記號, 做錯毅然,
到一個階段就會發現自己總在某個題目上出錯, 那哪題不懂自己一看就知道了,
另外在和前面觀念反複看, 範例的小程試也寫一寫,
其實就已經有一定程度了. 呵呵呵呵


1. 因為我選在巨匠認證中心考是, 所以就要先購買巨匠的考試卷,
 我的考試卷是網路上跟別人購買的, 以目前我所知, 在購買考試卷的時候,
 要先注意考試卷期限, 不然買了也不能考, 在來就是上面考試卷項目,
 網路上自己看一下會看到有些以電腦打字 SCJP, 也有手寫的,
 不要看到考試卷就以為都能考.

2. 拿著考試卷或當場到巨匠認證購買, 之後巨匠員工就會詢問要考的項目,
 我就是 Oracle Certified Professional, Java SE 6 Programmer,
 考是代號就是 1Z0-851, 其實不用擔心考到其他的 Java 錯誤,
 就我在填寫的時候 Java 就只有3項可以寫, Java 6 和兩個 Java 7.
 Java 7 就入門跟進階, 雖然最新但是我一開始學就是 Java 6, 而且只要考一個 :P
 之後他就會要你挑選日期, 去的時候也記得要先準備英文名字,
 英文地址(申請證書時要用的) , 沒準備的話就拿信用卡上的名字跟旁邊電腦查了.
 報名完之後就可以在信箱收到兩封 UVE 的信, 一封是確認考試項目的信,
 一封是確定付款的信.

3. 因為證照畢竟也是 Oracle 的, 所以還是要去註冊帳號, e-mail要跟考試報名時一樣,
 這很重要! 這裡就知道了, UVE 只是中間收前滴.

4. 到了考試日, 他會先叫你簽名, UVE也會有確認地方要你簽名, 然後會照相,
 考完試之後會一起放在證書上的照片, 所以不要太隨便, 不然到時候看到自己都會笑,
 之後開始考試前, 他會要你把東西, 包含口袋, 全部放在一個上鎖的櫃子裡,
 要淨空進入考場, 如果你容易被影響, 雖然不知道能不能但是可以反映一下,
 讓你跟其他考生空一間考試間, 考試間會有一個手寫板跟白板筆,
 到時候就只能用這個.

5. 考試的時候, 可以上一步, 他畫面也有 Mark 可以點, 可以讓你在最後送出前在好好想一想.

6. 最後, 會有考場人員在讓你牽一次名, 在跟他拿一張考試證明, 上面會有 Oracle Testing ID,
 這個會在你知後查成績用的.

7. 雖然考場人員會跟你講說, 10分鐘之內就會有結果, 還會寄信,
 但是這不。一。定。
 這時候你會很急的去Oracle查成績, 到 CertView 會要你輸入Oracle testing ID 和 e-mail,
 如果你沒收到信, 這裡輸入第一次也不能登入, 請等等幾天,
 可能 Oracle 的資料庫還沒更新, 所以你就算打到巨匠跟台灣Oracle也查不到.

 這裡就小小抱怨, 巨匠認證的腳色, 只是考場出租, 其餘問他他只會跟你說,
 不知道 不知道 不知道 不知道 不知道 不知道 不知道 不知道 不知道 不知道,
 這時候巨匠認證會建議你打到台灣 Oracle 去,他們會幫你查 Oracle testing ID,
 怕自己打錯就照相給他吧, 如果連他們都不能處理,
 那就真的是原廠那裡資料沒被更新到, 我個人是在第七天證書跟成績才可以自由查詢,

8. Acclicm在第六天會寄信, 如果不知道成績或有沒有過, 這個Acclicm其時也可以當作提前知 道你過了拉 XDDDDD.

 SCJP 6 GET!!!

2016年4月19日 星期二

[Java] 開起外部檔案 之一

想要執行一個 class 檔, 來執行另一個 class 檔.
所以我就先從 java 執行外部檔案 做為關鍵字往下做.

import java.util.*;
import java.io.*;
 
Opentest001.java [1]
 
import java.util.*;
import java.io.*;

public class Opentest001 {
    public static void main (String args[]) {
        try {          
            Runtime rt = Runtime.getRuntime ();
            System.out.println ("Process Runtime_getRuntime: " + rt);
            Process proc = rt.exec ("javac");
            System.out.println ("Process Process_exec: " + proc);
            int exitVal = proc.exitValue ();
            System.out.println ("Process exitValue: " + exitVal);
        } catch (Exception e) {
            e.printStackTrace ();
        }
    }
}
 
Opentest001.java看到,
藉由 Runtime.getRuntime() 取得目前應用程式運行物件,
並呼叫 Runtime的.exec() 執行() 內的指定命令(command), 
以目前來看, 就是利用cmd執行 javac, 將傳回值放到 Process 的 proc.
 
接下來利用 Process 的 exitValue() 的到程序結束的回傳值.

 
- - - - -
java Opentest001
 
Process Runtime_getRuntime: java.lang.Runtime@15db9742
Process Process_exec: java.lang.ProcessImpl@6d06d69c
java.lang.IllegalThreadStateException: process has not exited
        at java.lang.ProcessImpl.exitValue(ProcessImpl.java:443)
        at Opentest001.main(Opentest001.java:12)
- - - - - 
 
出現了執行錯誤, 看 getRuntime(), 靜態函式來取得 Rumtime 物件, 
利用 exec() 執行外部執行檔 javac, 取得回傳值在輸出到標準輸出.

exec 會創建新的 process 以執行 javac, 但是呼叫 exitValue()後, 
javac 的執行還未結束, JVM 就會丟出例外 IllegalThreadStateException,
 
所以要等 外部執行程序執行完, 就要利用 waitFor(). 

Opentest004.java 
 
import java.util.*;
import java.io.*;

public class Opentest004 {
    public static void main (String args[]) {
        try {           
            Runtime rt = Runtime.getRuntime ();
            System.out.println ("Process Runtime_getRuntime: " + rt);
            Process proc = rt.exec ("javac");
            System.out.println ("Process Process_exec: " + proc);
            int waitVal = proc.waitFor();
            System.out.println ("Process exitValue: " + waitVal);
        } catch (Exception e) {
            e.printStackTrace ();
        }
    }
}

- - - - -
Process Runtime_getRuntime: java.lang.Runtime@15db9742
Process Process_exec: java.lang.ProcessImpl@6d06d69c
Process waitVal: 2
- - - - -

接下來要得到 commmand 執行後的內容

Opentest006.java

import java.util.*;
import java.io.*;

public class Opentest006{
    public static void main(String args[]){
        try{
            Runtime rt = Runtime.getRuntime();
  String s[] = {"javac if_test.java",
                "java if_test",
                "javac"};
            Process proc = rt.exec(s[1]);
            String line = null;
           
            InputStream stderr = proc.getErrorStream ();
            InputStreamReader esr = new InputStreamReader (stderr);
            BufferedReader ebr = new BufferedReader (esr);

            System.out.println ("javac output:");       
            while ( (line = ebr.readLine ()) != null)
                System.out.println(line);           
            System.out.println ("javac end");
           
            InputStream stdout = proc.getInputStream ();
            InputStreamReader osr = new InputStreamReader (stdout);
            BufferedReader obr = new BufferedReader (osr);
           
            System.out.println ("<output>");
            while ( (line = obr.readLine ()) != null)
                System.out.println(line);
            System.out.println ("</output>");

            int exitVal = proc.waitFor ();
            System.out.println ("Process exitValue: " + exitVal);   
           
        }catch(Exception e){
           
        }
    }
}
 
if_test.java 
 
public class if_test{
    public static void main(String args[]){
        boolean i = true;
       
        if(i ){
            System.out.println(" Hello World!");
        }else{
            int y = 5;
        }
    }
}
 
我將要執行的 Command 先存放到 Sting s[]中,
當我在執行 s[0], s[1]時會發現程式執行會利用 getInputStromg() 將內容顯示至標準輸出, 而在 s[2] 時卻以 getErrorStream() 印出, 兩者分別將串流儲存在 stderr 和 stdout 裡面, 所以現在就會要求這些串流盡快輸出
 
 
Runtime[4]
每個 Java 應用程式都擁有單一個實做類別這個類別給予應用程式一個執行環境. 可以利用getRuntime method 獲得執行實的資訊. 這個應用程式不能創建初一個屬於自己的類別class.

Every Java application has a single instance of class Runtime that allows the application to interface with the environment in which the application is running. The current runtime can be obtained from the getRuntime method. An application cannot create its own instance of this class 
 
在 Oracle 文件中聲明:

Class Process
- java.lang.object
 - java.lang.Runtime
 
public class Runtime extends Object
 
僅列出幾個會用的, 其他官網看.
 

 
static RuntimegetRuntime()
Returns the runtime object associated with the current Java application.
回傳目前執行中的 java 應用程是之物件.
Process exec(String command)
Executes the specified string command in a separate process.
Process exec(String[] cmdarray)
Executes the specified command and arguments in a separate process.
Process exec(String[] cmdarray, String[] envp)
Executes the specified command and arguments in a separate process with the specified environment.
Process exec(String[] cmdarray, String[] envp, File dir)
Executes the specified command and arguments in a separate process with the specified environment and working directory.
Process exec(String command, String[] envp)
Executes the specified string command in a separate process with the specified environment.
Process exec(String command, String[] envp, File dir)
Executes the specified string command in a separate process with the specified environment and working directory.
 
 
 
 
Process[2][3]
  
Process 是 java.lang.Process 底下的類別, 提供從程序的輸入, 執行到輸出到行程, 等待
執行完成, 檢查程序進行的狀態, 刪除程序的進行方法.
 
在 Oracle 文件中聲明:

Class Process
- java.lang.object
 - java.lang.Process


public abstract class Process extends Object
 
 
 
Method Summary
 

Modifier and Type Method and Description
abstract void destroy()
Kills the subprocess.
刪除子程序
abstract int exitValue()
Returns the exit value for the subprocess.
返回子程序
abstract InputStream getErrorStream()
Returns the input stream connected to the error output of the subprocess.
得到錯誤訊息
abstract InputStream getInputStream()
Returns the input stream connected to the normal output of the subprocess.
進行輸出
abstract OutputStream getOutputStream()
Returns the output stream connected to the normal input of the subprocess.
進行輸入
abstract int waitFor()
Causes the current thread to wait, if necessary, until the process represented by this Process object has terminated.
在當機前進行等待, 若有必要由該Process對象的進程已經終止.
 
 
 
 
[1] http://yindingtsai.blogspot.tw/2010/01/runtimeexec.html
[2] https://docs.oracle.com/javase/7/docs/api/java
  /lang/Process.html#getErrorStream%28%29
[3] http://tw.gitbook.net/java/lang/java_lang_runtime.html
[4] https://docs.oracle.com/javase/7/docs/api/java/lang/Runtime.html













2016年4月7日 星期四

[Java] import and package

這次要講的比較不一樣, 現在要連同目錄一起放入jar檔中,
在ㄧ開始執行 Go.java 時, 要根據程式碼內的package指定目錄的位置來編譯 Go.class.

Go.java

package water.hot;
public class Go{
    public void move(){
        System.out.println("HA");
    }
}

class Go2{
    public void move2(){
        System.out.println("HA");
    }
}

javac -d . Go.java 

其中用 -d .表示要創建目錄, "." 表示以目前目錄為 root來創建.
執行完之後就會看到 water\hot 內會有 Go.class 和 Go2.class.

之後再來做多檔案並包含目錄的 jar 檔.

manifest.txt

Main-Class: Go/Go2
|
|
記得要空格, = = 好像沒差

c:\Documents>jar cvfm Go.jar manifest.txt ....\....\*.class
anser:
added manifest
adding: water/hot2./Go.class(in = 385) (out= 277)(deflated 28%)
adding: water/hot2./Go2.class(in = 387) (out= 282)(deflated 27%)

這時候就會在 Documents 目錄下看到Go.jat檔.

如果我現在要把我自己做的 Go.jar 和網路上抓的 BACK.jar 檔一起編譯, 執行.

javac -classpath Go.jar;BACK.jar; SimpleIf.java

java -classpath Go.jar;BACK.jar;. SimpleIf



javac -classpath Go.jar;. SimpleIf.java

java -classpath Go.jar;. SimpleIf