先把教材的最后一章看了再說

          1. File class
          四個常量:pathSeparator, pathSeparatorChar, separator, separatorChar
          與常量命名慣例沖突。

          2. 幾乎所有的I/O類的方法會拋出java.io.IOException,在使用時必須聲明或使用try塊。

          3. 文本IO
          兩個基類Reader和Writer,下面分別有InputStreamReader BufferedReader FileReader PrintWriter等子類。
          基類的方法Core Java中已經看了一部分了。
          PrintWriter類并不會拋出IOException

          4. FileReader / FileWriter
          Reader及其子類訪問一個并不存在的文件會拋出IOException的子類FileNotFoundException。
          判斷文件結尾:input.read() == -1
          FileWriter的常用構造方法:
          java.io.FileWriter(java.io.File)
          java.io.FileWriter(java.lang.String)
          java.io.FileWriter(java.io.File, boolean append)
          java.io.FileWriter(java.lang.String, boolean append)
          如果文件已經存在,前面兩個構造器會清除該文件的所有內容。使用后面兩個構造器,并設置append為true可以防止這種情況。
          也可以在寫入前判斷:
          if (file.exites()) {
          System.out.println(“File temp.txt already exites”);
          System.exit(0);
          }

          5. InputStreamReader / InputStreamWriter
          可以在byte和char之間轉換。編碼方式可以是默認的,也可以由用戶指定。
          getEncoding()方法返回當前的編碼方式名(String)。由于FileReader和FileWriter是他們的子類,因此也可以使用這個方法。

          6. BufferedReader / BufferWriter
          使用了一個字符數組作為緩沖區,減少讀寫次數,以提高讀寫速度。
          在輸入時,預先讀入字符;輸出時,先把內容暫存在數組中,分塊輸出到輸出流。
          構造器
          java.io.BufferedReader(java.io.Reader)
          java.io.BufferedReader(java.io.Reader, int)
          java.io.BufferedWriter(java.io.Writer)
          java.io.BufferedWriter(java.io.Writer, int)
          int指定了緩沖區大小,默認為8192字節。
          可以用BufferedReader/Writer類“包裝”任何Reader/Writer流。
          String BufferedReader.readLine()方法返回一行不帶有換行符的文本,沒有則返回null。
          void BufferWriter.newLine()方法寫入一個換行符

          7. PrintWriter / PrintStream
          以文本形式輸出對象、字符串或者數值。PrintWriter被設計用于代替PrintStream,兩者的輸出功能幾乎相同,但是前者更高效。
          System.out就是一個靜態的PrintStream對象,默認為屏幕控制端,可以通過System.setOut(PrintStream)重新設置。
          兩者都有許多重載的print/println方法,以及和C相似的printf。
          PrintWriter的構造器(并不會拋出IOException異常)
          public PrintWriter(Writer out)
          public PrintWriter(Writer out, boolean autoFlush)

          posted @ 2007-04-22 20:24 ZelluX 閱讀(538) | 評論 (0)編輯 收藏

          2007-02-22 23:08:37

          等看完了Thinking in Java后還是很有必要看一遍Core Java的,JDK5新增的東西Thinking in Java都沒提到。

          枚舉類

          l public enum Size { SMALL, MEDIUM, LARGE, EXTRA_LARGE };

          這樣已經定義了一個Size類,它是java.lang.Enum類的子類。

          l 枚舉類的相等判斷可以直接使用==符號。

          l 可以在枚舉類中添加構造器、方法和數據域。構造器只能在枚舉常量初始化的時候使用。

          enum Size

          {

          SMALL("S"), MEDIUM("M"), LARGE("L"), EXTRA_LARGE("XL");

          private Size(String abbreviation) { this.abbreviation = abbreviation; }

          public String getAbbreviation() { return abbreviation; }

          private String abbreviation;

          }

          l toString()方法返回枚舉常量的常量名,如

          Size.SMALL.toString()

          返回”SMALL”

          l valueOf方法則將由變量名得到枚舉常量,如

          Size s = (Size) Enum.valueOf(Size.class, “SMALL”);

          s設置為Size.SMALL

          l values()方法返回所有的枚舉常量,如

          Size[] values = Size.values();

          l 事實上,Enum類含有類型參數,例如Size類實際上是Enum>Size<

          posted @ 2007-04-22 20:24 ZelluX 閱讀(380) | 評論 (0)編輯 收藏

          2007-02-22 22:29:15

          1. 異常拋出后,有幾件事會隨之發生。首先,使用new在堆上創建異常對象。然后,當前的執行路徑被終止,并且從當前環境中彈出對異常對象的引用。此時,異常處理機制接管程序,并開始尋找一個恰當的地方來繼續執行程序。這個恰當的地方就是異常處理程序。

          2. 所有標準異常類都有兩個構造器,一個是缺省構造器,另一個是接受字符串的構造器。

          3. 異常處理的一個好處是,使你得以先在一個地方專注于正在解決的問題,然后在別的地方處理這些代碼中的錯誤。

          4. 異常處理理論的兩種基本模型:終止模型(termination)和恢復模型(resumption)JavaC++都使用前者。不過后者也可以實現,如把try塊放入while中,不斷進入try塊,直到得到滿意結果。

          5. 創建自定義異常時,建議把信息寫到System.err,因為System.out可能會被重定向。

          6. Throwable.printStackTrace方法可以輸出從方法調用處直到異常拋出處的方法調用序列,使用時可以不帶參數,或者傳遞一個PrintStreamPringWriter類的引用。

          posted @ 2007-04-22 20:24 ZelluX 閱讀(316) | 評論 (0)編輯 收藏

          2007-02-22 22:14:02

          ArrayList

          JDK5.0以后這是一個泛型類。

          ArrayList>Employee< staff = new ArrayList>Employee<();

          構造器:

          ArrayList(Collection>? extends E< c)

          ArrayList()

          ArrayList(int initialCapacity)

          方法:

          boolean add(E e)

          void add(int index, E element)

          int size() 相當于數組中的length

          remove(int index)

          remove(Object o)

          ArrayList管理了一個對象數組,如果數組已滿,此時再加入元素,ArrayList會自動創建一個更大的數組,并把原來數組的內容復制到新數組中。

          如果提前知道要加入多少元素,可以使用ensureCapasity(int)方法。也可以在創建ArrayList時使用ArrayList>Employee< staff = new ArrayList>Employee<(int)

          如果要使ArrayList定容,使用trimToSize()方法

          注意ArrayListc++vector的不同,后者賦值時是按值操作的。

          訪問ArrayList的元素:

          設置元素:set(int index, E element) (和數組一樣,index0開始編號)

          注意不要在ArrayList的已初始化容量小于i時進行set操作。

          ArrayList>Employee< list = new ArrayList>Employee<(100); // capacity 100, size 0

          list.set(0, x); // no element 0 yet

          是錯誤的

          獲取元素:get(int index)

          JDK5新支持的for each循環:

          for (Element e : ArrayList) {//...}

          一個技巧:

          先創建ArrayList并安全地添加元素

          ArrayList>X< list = new ArrayList>X<();

          while (. . .)

          {

          x = . . .;

          list.add(x);

          }

          ArrayList轉換為數組,從而方便地讀取

          X[] a = new X[list.size()];

          list.toArray(a);

          posted @ 2007-04-22 20:24 ZelluX 閱讀(390) | 評論 (0)編輯 收藏


          這一章又長又難,sign,挺過這一章估計就輕松點了
          1. 內部類可以訪問外圍類的所有元素,包括private字段,原因在于內部類對象保存了一個指向外圍類對象的引用。因此內部類的對象只能在與其外部類的對象相關聯的情況下才能被創建。構建內部類對象時,需要一個指向其外圍類對象的引用。
          2. 嵌套類(nested)
          如果不需要內部類對象與外圍類對象有聯系,可以將內部類聲明為static,稱為嵌套類。普通的內部類對象隱式地保存了一個引用,指向創建它的外部類對象。然而,當內部類是static時,就不是這樣了。這意味著:
          1)要創建嵌套類的對象,并不需要外圍類的對象。
          2)不能從嵌套類的對象中訪問非靜態的外圍類對象。
          嵌套類與普通內部類的另一個區別在于,普通內部類的字段與方法,只能放在類的外部層次上,所以普通的內部類不能有static數據和static字段,也不能包含嵌套類,但是嵌套類可以包含所有的這些東西(不怎么理解誒)
          另外,正常情況下,不能在接口內部放置任何代碼,但由于嵌套類是static的,因此可以作為接口的一部分。
          在每個類中寫一個main()方法,可以用來測試這個類,但這樣會在編譯時產生額外的內容。可以使用嵌套類防止測試代碼
          public class TestBed {
          public TestBed() {}
          public void f() { System.out.println("f()"); }
          public static class Tester {
          public static void main(String[] args) {
          TestBed t = new TestBed();
          t.f();
          }
          }
          } ///:~
          發布的時候刪除TestBed$Tester.class即可
          3. 引用外部類的對象
          外圍類名稱 + ".this"
          要創建非靜態內部類,必須使用外圍類的對象:
          Parcel11 p = new Parcel11();
          Parcel11.Contents c = p.new Contents();
          4. 多層嵌套類
          類比二層的嵌套類即可
          注意這里有個名次混淆的地方,非static類也可以嵌套起來使用,但是非static類內部就不能有static類了。
          5. 內部類的繼承
          內部類指向外圍類的隱藏引用必須被初始化
          class WithInner {
          class Inner {}
          }
          public class InheritInner extends WithInner.Inner {
          //! InheritInner() {} // Won't compile
          InheritInner(WithInner wi) {
          wi.super();
          }

          public static void main(String[] args) {
          WithInner wi = new WithInner();
          InheritInner ii = new InheritInner(wi);
          }
          }
          6. 內部類的覆蓋
          繼承某個外圍類的時候,內部類并不會發生變化,即使“重寫”了內部類代碼。不過可以用Thinking in Java上介紹的,明確繼承某個內部類。
          7. 為什么要用內部類
          If I just need a reference to an interface, why don’t I just make the outer class implement that interface? The answer is “If that’s all you need, then that’s how you should do it.”
          使用內部類最吸引人的原因是:
          每個內部類都能獨立地繼承一個(接口的)實現,所以無論外圍類是否已經繼承某個(接口的)實現,對于內部類都沒有影響。
          由此可見,接口解決了部分問題,而內部類有效地實現了“多重繼承”。
          8. 閉包與回調 Closure & Callbacks
          閉包是一個可調用的對象,它記錄了一些信息,這些信息來自于創建它的作用域。由此可見內部類是面向對象的閉包。通過內部類提供閉包的功能是完美的解決方案,它比指針更靈活、安全。
          9, 內部類與控制框架
          太難了,跳掉。。。

          posted @ 2007-04-22 20:24 ZelluX 閱讀(166) | 評論 (0)編輯 收藏

          2007-02-21 20:18:22
          1. Stream Zoo 的基礎:四個抽象類,InputStream, OutputStream, Reader, Writer
          其中后面兩個使用于Unicode文本。
          2. 四個接口
          interface Closeable {void close() throws IOException}
          interface Flushable {void flush() throws IOException}
          這兩個比較簡單
          interface Readable {int read(CharBuffer cb)}
          其中CharBuffer提供了支持連續/隨機讀寫操作的方法
          Appendable接口有兩個方法,用于追加單個字符或一列字符
          Appendable append(char c)
          Appendalbe append(CharSequence s)
          CharSequence是另一個接口。
          java.lang.CharSequence 1.4
          char charAt(int index)
          int length()
          CharSequence subSequence(int startIndex, int endIndex)
          String toString()
          3. FileInputStream和FileOutputStream
          構造方法:
          FileInputStream fin = new FileInputStream("employee.dat");
          File f = new File("employee.dat");
          FileInputStream fin = new FileInputStream(f);
          注意輸入Windows文件路徑的時候使用雙\\,如"C:\\Windows\\a.ini",不過也可以是"c:/Windows/a.ini",不過這并不被提倡。
          讀入一個字節:byte b = (byte) fin.read();
          3. System.getProperty 方法
          public static String getProperty(String key)
          返回key值對應的屬性
          posts - 403, comments - 310, trackbacks - 0, articles - 7
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理
          2007-02-21 21:21:46
          Key Description of Associated Value
          java.version Java Runtime Environment version
          java.vendor Java Runtime Environment vendor
          java.vendor.url Java vendor URL
          java.home Java installation directory
          java.vm.specification.version Java Virtual Machine specification version
          java.vm.specification.vendor Java Virtual Machine specification vendor
          java.vm.specification.name Java Virtual Machine specification name
          java.vm.version Java Virtual Machine implementation version
          java.vm.vendor Java Virtual Machine implementation vendor
          java.vm.name Java Virtual Machine implementation name
          java.specification.version Java Runtime Environment specification version
          java.specification.vendor Java Runtime Environment specification vendor
          java.specification.name Java Runtime Environment specification name
          java.class.version Java class format version number
          java.class.path Java class path
          java.library.path List of paths to search when loading libraries
          java.io.tmpdir Default temp file path
          java.compiler Name of JIT compiler to use
          java.ext.dirs Path of extension directory or directories
          os.name Operating system name
          os.arch Operating system architecture
          os.version Operating system version
          file.separator File separator ("/" on UNIX)
          path.separator Path separator (":" on UNIX)
          line.separator Line separator ("\n" on UNIX)
          user.name User's account name
          user.home User's home directory
          user.dir User's current working directory

          如要得到當前目錄,使用String dir = System.getProperty("user.dir");

          posted @ 2007-04-22 20:24 ZelluX 閱讀(379) | 評論 (0)編輯 收藏

          2007-02-20 23:33:53
          from http://www.regexlab.com/zh/regref.htm
          1. 其他一些代表抽象意義的特殊符號
          |
          左右兩邊表達式之間 "或" 關系,匹配左邊或者右邊

          ( )
          (1). 在被修飾匹配次數的時候,括號中的表達式可以作為整體被修飾
          (2). 取匹配結果的時候,括號中的表達式匹配到的內容可以被單獨得到

          舉例:表達式 "(go\s*)+" 在匹配 "Let's go go go!" 時,匹配結果是:成功;匹配到內容是:"go go go";匹配到的位置是:開始于6,結束于14。
          2. 匹配次數中的貪婪與非貪婪
          貪婪模式:
          在使用修飾匹配次數的特殊符號時,有幾種表示方法可以使同一個表達式能夠匹配不同的次數,比如:"{m,n}", "{m,}", "?", "*", "+",具體匹配的次數隨被匹配的字符串而定。這種重復匹配不定次數的表達式在匹配過程中,總是盡可能多的匹配。
          非貪婪模式:
          在修飾匹配次數的特殊符號后再加上一個 "?" 號,則可以使匹配次數不定的表達式盡可能少的匹配,使可匹配可不匹配的表達式,盡可能的 "不匹配"。這種匹配原則叫作 "非貪婪" 模式,也叫作 "勉強" 模式。如果少匹配就會導致整個表達式匹配失敗的時候,與貪婪模式類似,非貪婪模式會最小限度的再匹配一些,以使整個表達式匹配成功。
          3. 反向引用
          表達式在匹配時,表達式引擎會將小括號 "( )" 包含的表達式所匹配到的字符串記錄下來。在獲取匹配結果的時候,小括號包含的表達式所匹配到的字符串可以單獨獲取。在實際應用場合中,當用某種邊界來查找,而所要獲取的內容又不包含邊界時,必須使用小括號來指定所要的范圍。比如 ">td<(.*?)>/td<"。
          其實,"小括號包含的表達式所匹配到的字符串" 不僅是在匹配結束后才可以使用,在匹配過程中也可以使用。表達式后邊的部分,可以引用前面 "括號內的子匹配已經匹配到的字符串"。引用方法是 "\" 加上一個數字。"\1" 引用第1對括號內匹配到的字符串,"\2" 引用第2對括號內匹配到的字符串……以此類推,如果一對括號內包含另一對括號,則外層的括號先排序號。換句話說,哪一對的左括號 "(" 在前,那這一對就先排序號。
          舉例:表達式 "('|")(.*?)(\1)" 在匹配 " 'Hello', "World" " 時,匹配結果是:成功;匹配到的內容是:" 'Hello' "。再次匹配下一個時,可以匹配到 " "World" "。

          posted @ 2007-04-22 20:24 ZelluX 閱讀(371) | 評論 (0)編輯 收藏

          2007-02-20 21:13:42
          看的是Core Java
          1. Streams通常是文件,但也可能是網絡連接,甚至是內存中的一塊。
          2. 讀寫字節
          InputStream的方法
          abstract int read()
          讀取一個byte并返回,如果到了輸入源的結尾就返回-1
          InputStream類也有幾個非抽象的方法用于讀取若干個字節或是跳過若干個字節,但都需要調用read()方法,而子類繼承InputStream后也僅需要覆蓋read()方法即可。(注意此時繼承下來的讀取若干字節的方法調用了子類的read()方法)
          類似的OutputStream類的方法
          abstract void write(int b)
          read和write方法都可以暫停某個線程,直到字節讀寫完成后再繼續。這就意味著如果無法及時從網絡上讀取信息的話,Java會使得這次調用掛起嗎,此時就可以讓其他的線程工作了。
          available方法可以獲得當前可讀取的字節數,從而防止掛起:
          int bytesAvailable = in.available();
          if (bytesAvailable < 0)
          {
          byte[] data = new byte[bytesAvailable];
          in.read(data);
          }
          對stream結束訪問后,使用close方法清理空間,以防系統資源耗竭。close方法同時也清洗了輸出流的緩沖區,如果沒有close,最后寫入的內容可能就無法送達了,不過也可以使用flush方法清洗緩沖區。
          3. API
          java.io.InputStream 1.0
          abstract int read()
          int read(byte[] b)
          int read(byte[] b, int off, int len)
          off參數為讀取的第一個字節寫入b數組的位置
          long skip(long n)
          返回實際跳過的字節數
          int available()
          void close()
          void mark(int readlimit)
          在當前位置做標記,如果讀取量超過了readlimit,就取消標記。并不是所有stream都支持mark
          void reset()
          回到上一個標記處。
          boolean markSupported()
          java.io.OutputStream 1.0
          abstract void write(int n)
          void write(byte[] b)
          void write(byte[] b, int off, int len)
          void close()
          void flush()

          posted @ 2007-04-22 20:24 ZelluX 閱讀(248) | 評論 (0)編輯 收藏

          2007-02-20 13:52:16
          1. 接口
          在某些OOP語言中使用關鍵字protocol完成類似的功能。
          字段隱式為final和static,方法隱式為public
          2. 多重繼承
          一個非抽象類必須實現接口的所有方法,但實現的方法可以從父類中繼承下來。
          如interface1定義了兩個方法f1()和f2(),father類定義了方法f1(),child類繼承father類并實現接口interface1,它僅需要實現方法f2()即可。
          3. 接口和抽象類的選擇
          如果知道某個事物應該成為一個基類,那個第一選擇應該是使他成為一個接口。
          4. 接口組合時的名字沖突
          在打算組合的不同接口中使用相同的方法名常常會造成代碼可讀性的混亂,要盡量避免這種情況。
          5. 群組常量
          接口可以放便地用來創建常量組,就像C++中的enum枚舉類型。
          public interface Months {
          int
          JANURARY = 1; FEBRUARY = 2; //...
          }
          但這樣不具備類型安全,如果需要類型安全,就需要構建一個final類
          public final class Month {
          private static Test monitor = new Test();
          private String name;
          private Month(String nm) { name = nm; }
          public String toString() { return name; }
          public static final Month
          JAN = new Month("January"),
          FEB = new Month("February"); //...
          public static final Month[] month = {
          JAN, FEB //...
          };
          public static final Month number(int ord) {
          return month[ord - 1];
          }
          }
          通過Month.number(int)獲得Month類,由于每個月份的對象都僅存在一個,所以可以通過==或equals()判斷是否相等。
          枚舉類也可以通過org.apache.commons.lang.enum包實現
          6. 嵌套接口
          內部接口可以被聲明為private,而且可以被public類實現
          As a new twist, interfaces can also be private, as seen in A.D (the same qualification syntax is used for nested interfaces as for nested classes). What good is a private nested interface? You might guess that it can only be implemented as a private inner class as in DImp, but A.DImp2 shows that it can also be implemented as a public class. However, A.DImp2 can only be used as itself. You are not allowed to mention the fact that it implements the private interface, so implementing a private interface is a way to force the definition of the methods in that interface without adding any type information (that is, without allowing any upcasting).
          這段不是很理解。。。
          另外,當實現某個接口時,并不需要實現嵌套在內部的任何接口。
          7. 內部類與向上轉型
          內部類的真正好處在于,由于內部類--某個接口的實現--可以對其他人完全隱藏,他人所能得到的僅僅是一個基類或者接口的引用,而通過那個引用甚至不能找出該引用的最終類型,這樣具體地實現就被完全隱藏了。
          8. 在方法和作用域中的內部類
          這么做的兩個理由:
          1)你實現了某類型的接口,于是可以創建并返回對其的引用。
          2)你要解決一個復雜的問題,需要創建一個類來輔助你的解決方案,但有不希望這個類公共可用。
          這種內部類只能在相應作用域內使用,除此以外,在編譯等方面和普通的類一樣。
          9. 匿名內部類
          很有用的一個方法,在用Netbeans開發界面的時候就發現它的事件響應代碼就是用這個生成的。
          startItem.addActionListener(new java.awt.event.ActionListener() {
          public void actionPerformed(java.awt.event.ActionEvent evt) {
          startItemActionPerformed(evt);
          }
          });
          注意最后的分號。
          如果匿名內部類要使用外部的對象,參數必須設置為final,否則就會產生編譯錯誤。
          那么如何產生類似構造器的行為呢?由于匿名,因此不可能存在構造器,但通過instance initialization,可以達到構造的效果。
          public class AnonymousConstructor {
          private static Test monitor = new Test();
          public static Base getBase(int i) {
          return new Base(i) {
          {
          System.out.println("Inside instance initializer");
          }

          public void f() {
          System.out.println("In anonymous f()");
          }
          };
          }
          }
          這里i不需要聲明為final,因為在內部類中并沒有被直接使用。
          當然由于不支持重載,這類構造方法只能有一個

          posted @ 2007-04-22 20:24 ZelluX 閱讀(231) | 評論 (0)編輯 收藏

          2007-02-19 23:27:29
          連連看馬馬虎虎完成了,用的是Netbeans。然后準備熟悉下Eclipse,寫個掃雷。
          1. 控件的重繪太重要了,每次修改后都要repaint()一下。
          2. 交換兩個按鈕后忘了重新setLocation,結果發現按鈕位置沒變。。。
          3. 菜單項設置快捷鍵
          item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, InputEvent.CTRL_MASK))
          4. javac filename 產生的.class文件在當前目錄下
          javac -d dir filename 產生的.class文件在dir目錄的包名目錄中
          5. 還沒弄明白的一個問題:
          Board.drawLines方法中,明明getGraphics().setColor了,為什么畫線的時候顏色沒變呢?

          posted @ 2007-04-22 20:24 ZelluX 閱讀(247) | 評論 (0)編輯 收藏

          僅列出標題
          共39頁: First 上一頁 30 31 32 33 34 35 36 37 38 下一頁 Last 
          主站蜘蛛池模板: 沾益县| 乌兰浩特市| 广水市| 天等县| 墨脱县| 安国市| 太康县| 郑州市| 五家渠市| 丰宁| 苍溪县| 金阳县| 舞阳县| 建湖县| 巨鹿县| 庄浪县| 卢氏县| 依安县| 玛纳斯县| 衡阳县| 娱乐| 横峰县| 壶关县| 龙川县| 商都县| 平度市| 都江堰市| 木里| 洪泽县| 樟树市| 黄陵县| 临泽县| 无锡市| 长葛市| 华亭县| 且末县| 南郑县| 汉源县| 南康市| 芜湖县| 伽师县|