Java瑣記

  1. svn項目倒入,所選的文件夾必定是src上面以及的;而後eclipse會自動建立一個項目,項目名稱就是src上級文件夾的名稱;而後會按照路徑下的文檔結構如導入到eclipse的結構中;
  2. 被標記爲// TODO的地方將會在"Task"窗口中顯示出來;名稱近似的"Task List"顯示的Myln的任務列表;
  3. 要獲得格式化的日期字符串使用的是SimpleDateFormat,這個類自己和日期不要緊,只是負責格式,它的建立實例的時候傳入格式new SimpleDateFormat("yyyyMMddHHmmss");若是想要得到某個日期(好比當前時間)的改格式化字符串:sdf.format(new Date());因此SimpleDateFormat只是負責格式,核心方法就是format,接受日期參數;這讓我想起了"夫人"只是負責美;
  4. jdk的類查看文檔或者源代碼發生:"no source attachement"問題解決:Installed JREs界面,點擊edit,指定對應的jar包後選擇右側按鈕"Source attachment...",選擇jdk原生文件包或者Program/java/jdkx.x/src.zip,添加便可;Jdk的源碼就是前面所指的位置;解壓縮以後也是達到了80M,純文本文件啊,這些都是我將仔細去閱讀;
  5. 類加載,對於相同byteCode的類,若是版本不一樣,在JVM中仍然將會被認爲是兩個不一樣的類,這也是爲何model類(實體類)要部署到_lib_下面緣由,實體類的部署將會致使一系列的問題,拋出ClassCastException;可是這裏有一個問題:難道業務處理類就沒有這個問題了嗎?
  6. 原來Eclipse能夠和VS同樣都是關聯項目;動物快跑的Extension裏面直接能夠訪問Entity工程裏面定義的Entity,原來是在Build Path裏面的Projects種添加了Entity工程的引用;兩個Java就這樣在一個Workspace裏面完美交互了;那麼workspace的概念是不是Solution呢?不一樣的是Workspace裏面的項目必須在workspace所在的文件夾下,可是Solution的文件能夠是物理位置不一樣的項目;
    1. 反編譯推薦一:jad,和Eclipse配套使用Jadclipse(http://sourceforge.net/projects/jadclipse/ )以及jad.exe;配置Eclipse:Preference…/ Java/ JadClipse/;指定Path to decompiler(jad.exe的路徑);而後Windows -> Perference -> General -> Editors -> File Associations中指定以及*.class(without Source)的jadClipse編輯器,其中*.class是指指定了source的class,這個能夠不須要改動;
    2. 反編譯推薦二:JD-GUI,能夠將jar包按照內在文件路徑反編譯爲java工程;
  7. SynchronizedJVM層面的同步,系統會監控將其釋放,可是lock倒是代碼級別,須要在finally塊中手動調用lock.unlock()進行鎖釋放;不過lock更加靈活,有定時鎖,因此對於高併發的場合,lock能夠提供性能;好比trylock,若是獲取不到鎖,就當即返回;lock(obj, timeout)就是定時鎖,請求一段時間沒有反應就返回;lock.lock(),就是死心眼,一直等下去;
  8. lock以及sync能夠鎖定兩類對象,一類是"this",就是鎖定當前代碼段;另外一類是指定對象,好比鎖定一個List,保證在如下代碼執行中該List不會被修改;若是想要操做排隊去吧;
    1. Flume採用Http方式,採用JSON Handler,注意傳遞內容不用Encode;
    2. Collection:List,Set
    3. List:ArrayList,LinkList,Vector
    4. Set:HashSet,LinkSet,SortedSet:TreeSet
    5. Map:Hashtable,HashMap,LinkHashMap,SortedMap:TreeMap
    6. 調試Java發現異常:Unsupported major.minor version 52.0這是由於Java_Home指向1.7,可是Jar是使用JDK1.8編譯;將JAVA_HOME指向1.8便可;
    7. 異常:Expected FS Format between '1' and '4', but found '6',這是由於repository使用1.8,可是eclipse的subEclipse版本卻很低,下載使用site1.10.zip;Help -> Install New Installation... -> Archeve;
    8. Java中Double是double的封裝類,前者是對象,後者是基本數據類型,這意味着Double是能夠爲空,可是double是不能的;着Redis的conn.zscore(...)中,返回的是Double,須要進行非空判斷;若是想要得到一個準確的非空的值可使用.doubleValue()得到;不作我以爲這樣基本不須要了,除了不安全以外,沒有任何做用;
    9. Java中Double是double的封裝類,前者是對象,後者是基本數據類型,這意味着Double是能夠爲空,可是double是不能的;着Redis的conn.zscore(...)中,返回的是Double,須要進行非空判斷;若是想要得到一個準確的非空的值可使用.doubleValue()得到;不作我以爲這樣基本不須要了,除了不安全以外,沒有任何做用;
    10. 爲了不死鎖,能夠在建立鎖對象的時候,經過Expire命令指定過時時間,或者經過set ... EX 3的方式進行指定;
    11. 我曾經一度覺得watch--multi-continue模式(發現鍵值被改了,從新執行)毫無用處;做爲更新操做而言,這種機制多是有問題,由於添加watch本事就是爲了防篡改,若是發現被改了就從新執行修改操做,那麼也就不須要添加watch跟蹤了;可是在查詢場景下,若是跟蹤的key被修改了,一般意味着查詢結果有變化;好比自動補齊查詢的條件是用戶是工會的人;若是發現"工會的人"這個鍵發生了變化,那麼致使查詢結果可能就變化了,這個時候,就須要從新查詢以得到準確數據;
      1. CollectionListSet
      2. ListArrayListLinkListVector
      3. SetHashSetLinkSetSortedSetTreeSet
      4. MapHashtableHashMapLinkHashMapSortedMapTreeMap
      5. servlet實際上是一種標準,SUN提出來的用於運行在web服務器的小應用;具備很好的移植性,因此servlet程序既能夠部署在tomcat上面,能夠部署在IIS上面;tomcat原生支持servlet,是一個servlet容器,tomcat其實就是負責網絡通訊,接受http80(或者指定的某個端口)請求,封裝爲request而後發送給servlet(基於URL:請求端口以及路徑),而後servlet處理完畢後將response交給tomcattomcat在處理並封裝http包發送給請求端;固然tomcat還負責注入驗證之類的功能,因此能夠看到servlet容器和servlet分工之明確;值得注意的是儘管tomcat原生支持servlet,可是並無直接使用,而是使用standwrap對其進行封裝;struts1就是基於servlet架構;struts2是基於portletportlet也是基於servlet,由於web服務器都是能夠支持(IIS須要添加插件)servlet,因此各個框架底層都是對servlet的封裝;
      6. servlet三個生命週期:init(首次客戶端請求),service(處理客戶端請求)以及destroy
      7. MINA的應用場景,系統拆分各個子系統,子系統間通訊併發量(主要是數據庫數據插入)比較大,採用Webservice技術估計沒法承擔,因而採用MINA做爲中間件,進行子系統間通訊,保證了性能,同時共用了各個子系統的邏輯實現,數據庫層的共享也避免了;我忽然理解了MINA做爲消息中間件的場景;
      8. tried to access field org.slf4j.impl.StaticLoggerBinder.SINGLETON from class org.slf4j.LoggerFactory;maven執行cobertura老是報這個錯誤,原來是默認引用的sjf太老了;<dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.5.6</version>
        </dependency>
        <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
        <version>1.5.6</version>
        </dependency>
        問題搞掂;
      9. slf4f究竟是什麼,是日誌門面simple logger facade for java
        1.
        若是你的日誌中引入的是slf4f,那麼就能夠不進行任何配置,在classpath路徑下,引入slf4j-api-1.4.1.jar(這是slf4j的核心包);
        2.
        若是隻是simple風格,classpath添加slf4j-simple-1.4.1.jar便可,若是是jdk1.4風格,引入slj4j-jdk14-1.4.1.jar
        3.
        若是是log4j,須要引入兩個包:slf4j-log4j12-1.4.1.jarlog4j-1.2.x.jar(固然還有log4j.properties);
        4.
        若是是logback,須要引入logback-classic-0.9.29.jarlogback-core-0.9.29.jar;其中classic功能相似於slf4j-log4j
      10. Eclipse裏面有個"Link with editor"功能十分給力,能夠根據你選擇的文件自動定位到左側的package Explorer中位置;能夠再Package Explorer中設置(可逆的兩個箭頭圖標),也能夠在設置top element level菜單中設置;
      11. Spring能夠指定一個屬性文件(.properties文件),而後經過${email.url}方式佔位,email.url在屬性文件中定義;可是這並非Spring的高級用法,應該是聲明的方式吧;
      12. Eclipse其實內置了apache server,可是爲何還要搞tomcat插件呢?我理解內置的Server關聯tomcat後,配置文件所有是在Eclipse中維護的,由於Eclipse將會建立一個工程,名稱爲Server,全部的配置文件將在這個工程中進行維護,以前步驟中指定的tomcat物理路徑不過是指定了運行tomcatRuntime environment(虛擬機),讀取配置仍是在Eclipse裏面工程維護;可是若是是tomcat插件,則是原生的使用指定的tomcat即便是配置文件都是讀取tomcat根目錄下的conf裏面的配置文件;
  9. 最好是一個Web項目使用一個tomcat進行測試,由於再看console的時候不會混淆;固然一個工做空間多個Web項目更多的多是測試狀況,通常狀況下應該只有一個Web項目;可是若是是Webservice也有多是多個;
    1. 天去必捷必信息面試,回答了一段時間筆試題,發現Java還有不少基礎知識細節有問題,手下是throw和throws,throws只是聲明瞭方法級別能夠捕獲的異常;另外,throws意味着:顯式聲明本程序將會拋出那些異常(將不會作處理),這些異常須要調用方在代碼中進行處理,因此調用方是必定要對這些異常進行處理,要麼繼續聲明throws這些異常,讓再外層調用方處理,要麼就對異常進行捕獲,try-catch塊中捕獲特定異常;throws的本質實際上是告訴外部調用:這個異常我就不處理了,你看須要處理一下;
    2. 還有一道題目是final先執行仍是先return,後來網調並且還有本身Debug測試,先執行return語句邏輯,可是不返回,好比"return b+=80"先讓b=b+80,可是不返回;而後再走final,走完了final語句,再進行return;因此總體來說就是先走邏輯,再有final,最後返回;
    3. 發現JSP打印出來的文字亂碼,原來jsp文件頭使用的編碼方式是"ISO-8859-1",修改成UTF8搞掂;
    4. jps-v命令,查看java進程的狀態;好比rocketMq(須要使用到jre)啓動後,使用jps看將會看到其中一項就是rocketmq;可是安裝了openjdk卻沒有這個,那是由於我安裝的是openjdk的jre版本,還有delevl版本,裏面應該會有的;
    5. Java.net.InetAddress.getLocalHost throws UnknowHostException,經過hostname,得到一個KXXX名稱,將這個名稱添加到etc/hosts的127.0.0.1的後面以及..0.1項的後面;問題解決;分析應該是對於該主機名稱不知道應該如何解析;將名稱添加到hosts文件,這樣主機名和IP可以對應上去;以前訪問google被屏蔽,就是經過修改hosts文件(window下面),將google請求映射到某個IP實現了訪問,hosts文件的做用在於將請求的名稱和IP進行映射;若是沒有映射,那麼就要交給DNS進行處理;
    6. RocketMQ發佈在git上面,管理使用的是Maven,導入到方式:首先在git repository視圖中,在右上角點擊"add a new repository and add it to this view";而後配置爲rocketmq的git地址便可;添加倉庫成功後,File-import-Existing maven project,路徑就選擇本地倉庫路徑便可導入maven項目;
    7. 使用file對象避免了Windows以及Linux下的差異,file(file,name),從構建文件夾,在構建文件(基於文件夾),在經過getAbsolutePath函數得到完成路基,此時已經根據操做系統不一樣而返回相應的路徑了;
    8. eclipse小應用,Ctrl+pageup或者Ctrl+pgdn能夠在先後tab間切換,ctrl+c是單行或者多行註釋;
    9. iosession的isclosing是返回當前session是否已經關閉或者是否正在關閉;
    10. 等待採用awaitxxx方法,不要採用wait,後者是指須要經過原生notify方式進行觸發;
      1. 在eclipse裏面,只要在註釋中結尾添加</br>,便可實現格式化的時候不會合併爲一行,並且現實更友好;
      2. logback能夠設置logger樣式,嫌打出全稱太長,能夠經過設置%logger{15}來進行設置;
      3. java 程序要打包成包含們menifest文件,就要指定main函數;
      4. jar文件打包有兩種方式:第一種是原始的jar文件,這種方式裏面是不會把lib裏面的內容進行封裝;runnable jar則是自動的將這些引用到的jar文件進行封裝,並寫入到menifest文件;
      5. 對於list<integer>要注意了,由於remove兩個重載的方法,一個是索引,一個是對象,形成重複,須要把要刪除的int處理爲(object)n強轉爲對象元素;
      6. classloader. getSystemResourceAsStream方式完美適配調試和發佈配置文件內置場景。
      7. 其實附加jar應該採用add jar的方式,由於我如今已經在工程內部維護了一個lib文件夾,那麼引用的jar包都放入到此文件夾便可,這樣,在build path的時候,不須要選擇外部jar,而是內部jar;
      8. 在使用Junit進行測試的時候,fail必定要放到exception下面,不然先打出fail,異常信息就不會再輸出了。
      9. 被final修飾類,該類不可被修改,好比Long以及String,他們一旦被建立,都不會再被修改。
      10. printwriter提供了一個autoflush參數,已經一個println方法,二者結合使用能夠不須要手動進行fLush。嘗試使用outputstreamwriter替代,可是沒有成功.
      11. bufferreader裏面多封裝了一個readline,避免了reader裏面只能讀read的機制,所謂的buffer其實就是預讀到第一個換行符。
      12. PrintoutputStream,構造的時候能夠指定是否autoflush,若是不進行指定須要進行手動調用flush函數進行清空緩衝區;還可使用OutputStreamWriter對於socket.getOutputStream進行封裝;我以爲它比較專業。由於printwriter老是感受是用於輸出到控制檯的。
      13. servlet是單例的,可是會經過dispatchThread對象進行線程調度,執行service方法的其實已是線程池中的線程,serlet初始化會分析加載web.xml文件中的內容。這和傳輸其實很像,transportruntime是單例啓動,對於見聽到的請求交給mina有他分配線程池。
      14. 在web.xml文件中添加一個監聽器,這個監聽器繼承自 servletcontextlistener,實現其中的destroy方法便可實現servlet銷燬是動做;
      15. Java的快捷鍵配置想要導出導入:workspace裏面的.metadata/.plugins/...core.runtime/setting/org.eclipse.ui.workbench.prefs裏面的...commands屬性中定義的,便是。
      16. web項目的工程引用,除了要在build path中添加項目以外,還要在右鍵-屬性-deployment assembly中添加project, 以後就會在打包war的時候,將引用工程打入
      17. 雙擊變量方法後,同名的將會一塊兒變色,這個配置在windows_preference_java _editor_mark ocurrences, 勾選上mark ocurrences...,便可。
      18. 文件鎖只是用於多虛擬機間進行加鎖,多線程的文件鎖仍是須要本身來實現。
      19. remote.internalantprogram異常,Ant在執行的時候報錯,解決方案:The solution is to go to Run as → External tools configuration… → JRE where the default was set to "Separate JDK": jdk1.6.0_31 (I had set up JDKs 6-8 in Preferences after installing). I changed this to "run in the same JRE as the workspace" and now it works.
      20. 點開ecliose,告知jawa.exe找不到,可是老天知道我已經配置好了Javahome,後來知道是由於Jdk是32位,eclipse是64位形成,指定了64位的Jdk解決。
      21. Ant打包

1. ant中是順序執行,好比對於transport工程而言,應該首先刪除lib文件,建立lib文件,而後再打包infras包和protocal包; java

2.對於引用項目默認是會和當前項目打到一個jar包中,這樣引用項目的獨立性就沒有了,經過設置fileset屬性(刪除引用的工程的file節點)來指定jar包只是來自於當前項目的class文件(默認會將引用項目fileset包含到jar節點中)。 ios

3.對於引用項目使用到的jar包(外部引用),在copyfile節點中進行定義。 git

4.引用項目單獨打到指定位置後(好比lib文件夾下),須要在主體jar的class-path中進行添加。 web

  1. 即便是agent,你也能夠將logbackjar包放進去,由於對於他們,到最後是不須要考慮將引用包打進去的(調整ant.xml配置來實現)。因此爲了可以看到日誌,能夠這樣作,同時要看到logback的這種特性
  2. 啓動eclipse,報錯,share JNI library找不到,這是由於eclipse的位數和系統默認的Jdk不一致。java -version,有64字樣的爲64位。只須要在ini文件中增長-vm 換行 ……jvm.dll便可。javaw.exe也可,可是將會致使啓動一個javaw.exe的進程。client下的jvm.dll在設計爲啓動快速而作了優化,而server下的jvm則是在運行時的快速作了優化,綁定那個看須要了。
  3. 做爲算術運算數字類型轉換,要注意,返回值類型必定是運算元素類型都一致才能夠:
    (double)(a/100),若是a是long,那麼返回值類型仍是long,除非:(double)a/100才能夠。
  4. 莫名的發現有web工程編譯錯誤,class not found,該類安靜的在工程中躺着,去掉幾個空行,再次啓動,搞定。或者對於項目進行clean也可。
  5. 在JSP上面,經過task.feedbackstr,將會自動綁定調用getfeedbackstr;
  6. 採用ant打包,若是程序沒有變化,將不會進行打包覆蓋,好比transport.jar,打包的時候若是沒變化將不會進行覆蓋,可是tran_lib下面的若是有那麼變化將會覆蓋。
  7. 今天調試,在eclipse環境下調試web,發現有問題,網站起不來。後來發如今插件路徑下(.meta/.plugin/org...server.core/tmp0/wtpwebapps)只是拷貝了web-info文件夾內容致使的,這個問題的解決能夠手工到目錄下將該文件夾刪除(此時運行項目將會報錯,說xxx文件找不到或者不可讀),而後在server右鍵點擊clean…便可。關鍵在於基於eclipse的插件原理,即便是Server插件(tomcat)其實也是一個插件,他的目錄是在plugin下面。
  8. executorshutdown的本質是向其下屬線程發送中斷請求,只有實現了捕獲中斷的線程纔會相應中斷,進而關閉,好比進程邏輯中有阻塞類的take,有thread.sleep
  9. watcher並不很好支持多線程,由於文件會被重複下發,並且只有第一個線程是會一直處理任務,其餘線程沒法得到。
  10. swt其餘線程來修改控件,要經過display.getdefault(),並注入runnable來進行操做。Swt其實和winForm是同樣的。不容許你在UI線程作併發事情。
  11. 驗證過,只要把logback.xml放在部署應用的根目錄便可自動被slf4j發現。正確的部署是要把配置文件放到部署根目錄,可是在eclipse環境下運行有問題,須要設置爲資源文件夾,因而解決方案在於ant打包的時候,不要把resource文件夾內容打包到jar中,而是拷貝到部署根目錄便可
  12. 使用ant進行文件複製,一般有兩種方式:第一種,<copy todir=""><fileset dir=""><include/exclude name=""></fileset></copy>若是想要覆蓋已有文件overwrite="true",默認是false
  13. 能夠經過繼承servletcontextlistener來進行web容器的初始化和銷燬事件,還要進行一步: 在web.config裏面進行配置,<liatener><listener-class>…</listener-class></listener>,一個listener只能添加一個listener-class。如要添加多個監聽器,就添加多個<listener></listener>節點。
  14. 對於BlockingQueue,儘可能不要使用poll,由於這是線程不安全的(沒有阻塞),若是使用,須要加鎖;或者使用take,安全方式。poll不安全是由於:多是你poll以後,才插入,你看poll沒有數據就再也不處理;除非你再提供一種機制,來定時輪詢訪問BlockingQueue,以保證後續插入的數據可以被發現可是後來邏輯才發現其實阻塞take()毫無心義,由於如今的邏輯是若是是發現新的任務,那麼是不向Queue中放入的,直接下發到傳輸模塊進行傳輸;白白耽擱了一個線程。
  15. 關於執行腳本:
    Process proc;
    String[] cmds = { "/bin/sh", "-c", command };
    proc = Runtime.getRuntime().exec(cmds);
    調用Runtime的exec函數正確的姿式是定義一個command數組,前兩個元素是「/bin/sh"以及」-c」,直接執行指令在執行諸如
    echo "mount -o username=Guest,password= //10.1.108.35/m010 /opt/mapper/11033/m010" >> /opt/mount.sh
    的時候沒法執行。
    什麼是/bin/sh,又什麼是-c?
  16. sun.net.www.protocol.jar.JarURLConnection;報異常Access restriction required library rt.jar,這須要在Build Path中的Library/JDK下面有一個Access Rules,對於Access Rule進行編輯,選擇Accessible,Pattern設置爲**便可。Access restriction的緣由是由於這些JAR默認包含了一系列的代碼訪問規則(Access Rules),若是代碼中引用了這些訪問規則所禁止引用類,那麼就會提示這個錯誤信息。
  17. java compiler level does not match the version of the installed java project facet,問題解決:在工做空間.settings/org.eclipse.wst.common.project.facet.core.xml文件中,替換java版本爲當前版本。
相關文章
相關標籤/搜索