阳光男孩

Never give up!

Entries for the ‘JAVA’ Category

Java基础之如何学习Java程序设计

15顶一下JAVA是一种平台,也是一种程序设计语言,如何学好程序设计不仅仅适用于JAVA,对C++等其他程序设计语言也一样管用。有编程高手认为,JAVA也好C也好没什么分别,拿来就用。为什么他们能达到如此境界?我想是因为编程语言之间有共通之处,领会了编程的精髓,自然能够做到一通百通。如何学习程序设计理所当然也有许多共通的地方。 一、 培养兴趣 兴趣是能够让你坚持下去的动力。如果只是把...[阅读全文]

15
顶一下

JAVA是一种平台,也是一种程序设计语言,如何学好程序设计不仅仅适用于JAVA,对C++等其他程序设计语言也一样管用。有编程高手认为,JAVA也好C也好没什么分别,拿来就用。为什么他们能达到如此境界?我想是因为编程语言之间有共通之处,领会了编程的精髓,自然能够做到一通百通。如何学习程序设计理所当然也有许多共通的地方。

一、 培养兴趣

兴趣是能够让你坚持下去的动力。如果只是把写程序作为谋生的手段的话,你会活的很累,也太对不起自己了。多关心一些行业趣事,多想想盖茨。不是提倡天天做白日梦,但人要是没有了梦想,你觉得有味道吗?可能像许多深圳本地农民一样,打打麻将,喝喝功夫茶,拜拜财神爷;每个月就有几万十几万甚至更多的进帐,凭空多出个”食利阶层”。你认为,这样有味道吗?有空多到一些程序员论坛转转,你会发现,他们其实很乐观幽默,时不时会冒出智慧的火花。

二、 慎选程序设计语言

男怕入错行,女怕嫁错郎。初学者选择程序设计语言需要谨慎对待。软件开发不仅仅是掌握一门编程语言了事,它还需要其他很多方面的背景知识。软件开发也不仅仅局限于某几个领域,而是已经渗透到了各行各业几乎每一个角落。

如果你对硬件比较感兴趣,你可以学习C语言/汇编语言,进入硬件开发领域。如果你对电信的行业知识及网络比较熟悉,你可以在C/C++等之上多花时间,以期进入电信软件开发领域。如果你对操作系统比较熟悉,你可以学习C/Linux等等,为Linux内核开发/驱动程序开发/嵌入式开发打基础。

如果你想介入到应用范围最广泛的应用软件开发(包括电子商务电子政务系统)的话,你可以选择J2EE或.NET,甚至LAMP组合。每个领域要求的背景知识不一样。做应用软件需要对数据库等很熟悉。总之,你需要根据自己的特点来选择合适你的编程语言。

三、 要脚踏实地,快餐式的学习不可取

先分享一个故事。

有一个小朋友,他很喜欢研究生物学,很想知道那些蝴蝶如何从蛹壳里出来,变成蝴蝶便会飞。有一次,他走到草原上面看见一个蛹,便取了回家,然后看着,过了几天以后,这个蛹出了一条裂痕,看见里面的蝴蝶开始挣扎,想抓破蛹壳飞出来。这个过程达数小时之久,蝴蝶在蛹里面很辛苦地拼命挣扎,怎么也没法子走出来。

这个小孩看着看着不忍心,就想不如让我帮帮它吧,便随手拿起剪刀在蛹上剪开,使蝴蝶破蛹而出。但蝴蝶出来以后,因为翅膀不够力,变得很臃肿,飞不起来。

这个故事给我们的启示是:欲速则不达。

浮躁是现代人最普遍的心态,能怪谁?也许是贫穷落后了这么多年的缘故,就像当年的大跃进一样,都想大步跨入共产主义社会。现在的软件公司、客户、政府、学校、培训机构等等到处弥漫着浮躁之气。就拿笔者比较熟悉的深圳IT培训行业来说吧,居然有的打广告宣称”参加培训,100%就业”,居然报名的学生不少,简直是藐视天下程序员。社会环境如是,我们不能改变,只能改变自己,闹市中的安宁,弥足珍贵。

许多初学者C++/JAVA没开始学,立马使用VC/JBuilder,会使用VC/JBuilder开发一个HelloWorld程序,就忙不迭的向世界宣告,”我会软件开发了”,简历上也大言不惭地写上”精通VC/JAVA”。结果到软件公司面试时要么被三两下打发走了,要么被驳的体无完肤,无地自容。到处碰壁之后才知道捧起《C++编程思想》《JAVA编程思想》仔细钻研,早知如此何必当初呀。

“你现在讲究简单方便,你以后的路就长了”,好象也是佛经中的劝戒。

四、多实践,快实践

彭端淑的《为学一首示子侄》中有穷和尚与富和尚的故事。

从前,四川边境有两个和尚,一个贫穷,一个有钱。一天,穷和尚对富和尚说:”我打算去南海朝圣,你看怎么样?”富和尚说:”这里离南海有几千里远,你靠什么去呢?”穷和尚说:”我只要一个水钵,一个饭碗就够了。”富和尚为难地说:”几年前我就打算买条船去南海,可至今没去成,你还是别去吧!”一年以后,富和尚还在为租赁船只筹钱,穷和尚却已经从南海朝圣回来了。

这个故事可解读为:任何事情,一旦考虑好了,就要马上上路,不要等到准备周全之后,再去干事情。假如事情准备考虑周全了再上路的话,别人恐怕捷足先登了。软件开发是一门工程学科,注重的就是实践,”君子动口不动手”对软件开发人员来讲根本就是错误的,他们提倡”动手至上”,但别害怕,他们大多温文尔雅,没有暴力倾向,虽然有时候蓬头垢面的一副”比尔盖茨”样。

有前辈高人认为,学习编程的秘诀是:编程、编程、再编程,笔者深表赞同。不仅要多实践,而且要快实践。我们在看书的时候,不要等到你完全理解了才动手敲代码,而是应该在看书的同时敲代码,程序运行的各种情况可以让你更快更牢固的掌握知识点。

五、 多参考程序代码

程序代码是软件开发最重要的成果之一,其中渗透了程序员的思想与灵魂。许多人被《仙剑奇侠传》中凄美的爱情故事感动,悲剧的结局更有一种缺憾美。为什么要以悲剧结尾?据说是因为写《仙剑奇侠传》的程序员失恋而安排了这样的结局,他把自己的感觉融入到游戏中,却让众多的仙剑迷扼腕叹息。

参考代码例子,也可以研究一些开源的软件或框架。

六、 加强英文阅读能力 

对学习编程来说,不要求英语,但不能一点不会,。最起码像JAVAAPI文档(参考文献[4.4])这些东西还是要能看懂的,连猜带懵都可以;旁边再开启一个”金山词霸”。

看多了就会越来越熟练。在学JAVA的同时学习英文,一箭双雕多好。另外好多软件需要到英文网站下载,你要能够找到它们,这些是最基本的要求。英语好对你学习有很大的帮助。口语好的话更有机会进入管理层,进而可以成为剥削程序员的”周扒皮”。

七、 万不得已才请教别人

笔者在ChinaITLab网校的在线辅导系统中解决学生问题时发现,大部分的问题学生稍做思考就可以解决。请教别人之前,你应该先回答如下几个问题。

你是否在google中搜索了问题的解决办法? 你是否查看了JAVAAPI文档? 你是否查找过相关书籍? 你是否写代码测试过?

如果回答都是”是”的话,而且还没有找到解决办法,再问别人不迟。要知道独立思考的能力对你很重要。要知道程序员的时间是很宝贵的。

八、 多读好书

书中自有颜如玉。比尔?盖茨是一个饱读群书的人。虽然没有读完大学,但九岁的时候比尔?盖茨就已经读完了所有的百科全书,所以他精通天文、历史、地理等等各类学科,可以说比尔?盖茨不仅是当今世界上金钱的首富,而且也可以称得上是知识的巨富。

笔者在给学生上课的时候经常会给他们推荐书籍,到后来学生实在忍无可忍开始抱怨,”天呐,这么多书到什么时候才能看完了”,”学软件开发,感觉上了贼船”。这时候,我的回答一般是,”别着急,什么时候带你们去看看我的书房,到现在每月花在技术书籍上的钱400元,这在软件开发人员之中还只能够算是中等的”,学生当场晕倒。

九、 使用合适的工具

工欲善其事必先利其器。软件开发包含各种各样的活动,需求收集分析、建立用例模型、建立分析设计模型、编程实现、调试程序、自动化测试、持续集成等等,没有工具帮忙可以说是寸步难行。工具可以提高开发效率,使软件的质量更高BUG更少。组合称手的武器。到飞花摘叶皆可伤人的境界就很高了,无招胜有招,手中无剑心中有剑这样的境界几乎不可企及。

希望通过本文的介绍,能给你带来帮助。

Comments (10)

Java程序自动下载谷歌音乐歌词

1顶一下  近期写了一个android音乐播放器,但是苦于找不到可以自动下载歌词的网站。网上搜的那个已经不能用了。这时候想起可以调用百度或者谷歌的接口来搜索歌词,由于谷歌刚刚推出了谷歌音乐,于是我就想着去尝试下。    进入谷歌音乐的主页,然后随便输了首歌去搜索,跳转至歌曲搜索。发现真的有歌词,可惜歌词不是嵌套在网页里的,并且打开歌词网页的地址里包含的是歌词的id,这可这么半呢...[阅读全文]

1
顶一下

  近期写了一个android音乐播放器,但是苦于找不到可以自动下载歌词的网站。网上搜的那个已经不能用了。这时候想起可以调用百度或者谷歌的接口来搜索歌词,由于谷歌刚刚推出了谷歌音乐,于是我就想着去尝试下。

   进入谷歌音乐的主页,然后随便输了首歌去搜索,跳转至歌曲搜索。发现真的有歌词,可惜歌词不是嵌套在网页里的,并且打开歌词网页的地址里包含的是歌词的id,这可这么半呢?

   于是我就去搜索页面寻找歌曲的id,果然在html源代码中找到了歌曲的id,然后我就用这个id拼接在歌词网址的字符串中,最后顺利地进入了歌词页面。

   不过歌词页面中的信息很少,连歌词都是从别的地方读取过来的,html源代码中也没有歌词相应的地址。还好,在页面的框架信息中我看到了歌词的地址,在浏览器输入后就可以直接下载,并且下载后的文件就是歌曲的歌词,不含其他信息。

    这样就有思路了:

    1.接收参数为歌曲名和歌手(这样可以准确的定位歌词文件),然后把参数拼接在查询字符串后面,进行歌词页面的查询。

    2.获取歌词页面的html源代码并进行解析,获取歌曲的id

    3.将歌曲的id拼接在歌词框架页面地址的后面,获取歌词框架页面的html源代码

    4.解析框架页面的源代码,获取歌词下载地址。

    5.下载歌词并保存至文件。

需要注意的是:

1.谷歌音乐的歌曲、歌手都不是很多,有些歌曲可能搜索不到歌词,甚至谷歌就没有收录这些歌曲。

2.谷歌服务器不稳定,歌词可能会下载失败,原因大家都懂得。

3.下载的歌词默认放在工程目录下,可以自行修改歌词位置。

4.谷歌音乐页面编码都是UTF-8的,不需要考虑乱码的问题。

PS:本程序仅仅是抛砖引玉,具体怎么使用就看大家的了。

下面上代码:

工具类

 

[java]

<span style=”font-family:FangSong_GB2312;”><span style=”font-size: 14px;”></span></span><pre name=”code” class=”java”>package com.zyc.download_lrc;
/**
 * Get lrc from google music
 * Version 1.00
 * @author zyc
 * 2012.2.2
 */

/*
 * Step:
 * 1.Input music’s name and artist,use google music search engine
 * The url like ”http://www.google.cn/music/search?q=name+artist”
 * 2.Get music id,the id is starts with ”http://g.top100.cn/16667639/html/lyrics.html?id”
 * and id is after
 * 3.Use id to get lrc framework html,find download lrc url
 * 4.download lrc
 * 5.write lrc to file
 *
 * NOTICE:google work may abnormal,you known
 */

import java.io.BufferedReader;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.SocketTimeoutException;
import java.net.URL;
import java.net.URLConnection;

public class DownloadGoogleLrcTool {
    /*music info start,but can’t get id from this,because the music has no lrc*/
    private final static String ID_HEAD_FLAG = ”<!–freemusic”;
    /*google music engine search head*/
    private final static String SEARCH_ENGINE_HEAD = ”http://www.google.cn/music/search?q=”;
    /*google music lrc by id head*/
    private final static String SEARCH_ID_URL_HEAD = ”http://www.google.cn/music/top100/lyrics?id=”;
    /*google music id flag*/
    private final static String SEARCH_ID_FLAG = ”http://g.top100.cn/16667639/html/lyrics.html?id”;
    /*google music download url flag*/
    private final static String SEARCH_LRC_DOWNLOAD_URL_FLAG = ”http://lyric.top100.cn/”;
    /*”%3D” means ”=”*/
    private final static String SEARCH_HTML_EQUAL = ”%3D”;
    private final static String END_FLAG = ”\\”;
    private final static String LRC_SUFFIX = ”.lrc”;
    private final static String LINE_END = ”\n”;
    /*google music can’t connect return code”*/
    private final static String GOOGLE_SB_RETURN_CODE = ”502″;
    /*error message,you know”*/
    private final static String GOOGLE_SB_MESSAGE = ”google抽风中…你懂的\n请稍后再试”;
    private final static String SPACE = ” ”;
    /*”%20″ means ” ”*/
    private final static String HTML_SPACE = ”%20″;
    private final static String HTML_URL_HEAD = ”http://”;
    /*id is letter and number”*/
    private final static String ID_MATCH = ”^[A-Za-z0-9]+{1}quot;;
    /*download message*/
    private final static String CANNOT_FIND_LEC_MESSAGE = ”无法找到歌词”;
    private final static String FAIL_MESSAGE = ”下载歌曲 %s-%s 歌词 失败!\n原因:”;
    private final static String SUCCESS_MESSAGE = ”下载歌曲 %s-%s 歌词 成功!\n歌词位置: %s\n”;
    private final static String DOWNLOADING_MESSAGE = ”正在下载歌曲 %s-%s 歌词…\n”;
    /*time out message*/
    private final static String DOWNLOADING_CONNECT_TIME_OUT = ”connect timed out”;
    private final static String DOWNLOADING_CONNECT_TIME_OUT_MESSAGE = ”连接超时,请检查网络配置”;
    private final static String DOWNLOADING_UNKNOWN_MESSAGE = ”未知”;
    /*set timeout = 5s*/
    private final static long CONNECT_TIME_OUT = 5000;
    /*set http proxy,if don’t use http proxy,set it false*/
    private final static boolean USE_HTTP_PROXY = true;
    private final static String FAIL_WRITE_FILE_MESSAGE = ”写入文件失败!”;

    public static void downloadLrcFromGoogle(String name,String artist){
        try {
            System.out.printf(DOWNLOADING_MESSAGE,name,artist);
            /*get lrc*/
            String lrc = downloadLrc(name,artist);
            if(lrc != null){
                /*write lrc to file*/
                String fileName = name + LRC_SUFFIX;
                File file = new File(fileName);
                writeToFile(file, lrc);
                System.out.printf(SUCCESS_MESSAGE, name,artist,file.getAbsoluteFile());
            }
            else
                System.out.println(CANNOT_FIND_LEC_MESSAGE);
        } catch (Exception e) {
            System.out.printf(FAIL_MESSAGE, name,artist);
            if(e.getMessage().contains(GOOGLE_SB_RETURN_CODE))
                System.out.println(GOOGLE_SB_MESSAGE);
            else if(e.getMessage().contains(DOWNLOADING_CONNECT_TIME_OUT)){
                System.out.println(DOWNLOADING_CONNECT_TIME_OUT_MESSAGE);
            }
            else {
                System.out.println(DOWNLOADING_UNKNOWN_MESSAGE);
            }
            //e.printStackTrace();
        }
    }

    private static void init(){
        System.setProperty(“sun.net.client.defaultConnectTimeout”, String.valueOf(CONNECT_TIME_OUT));
        if(USE_HTTP_PROXY){
            //add http proxy setting here

        }
    }

    private static String downloadLrc(String name,String artist) throws IOException,SocketTimeoutException{
        init();
        /*replace ” ” to ”%2d”*/
        name = name.replaceAll(SPACE, HTML_SPACE);
        artist = artist.replaceAll(SPACE, HTML_SPACE);
        String id = getSongId(name, artist);
        /*can’t find id return null”*/
        if(id == null || !id.matches(ID_MATCH)){
            return null;
        }
        String path = getLrcDownloadUrl(id);
        String lrc = null;
        /*if path isn’t start with ”http”//” ignore*/
        if(path.startsWith(HTML_URL_HEAD))
            lrc = doDownloadLrc(path);
        return lrc;
    }

    private static String getSongId(String name,String artist) throws IOException{
        String source = readHtml(SEARCH_ENGINE_HEAD + name + ”+” + artist);
        name = name.replaceAll(HTML_SPACE, SPACE);
        String match01 = ”\”><b>” + name + ”</b>”;
        String match02 = null;
        if(name.contains(SPACE)){
            /*set first letter upper*/
            String[] array = name.split(SPACE);
            for (int i = 0;i < array.length;i++) {
                char firstChar = array[i].charAt(0);
                if(firstChar >= ’a' && firstChar <= ’z'){
                    array[i] = array[i].replace(firstChar, (char) (firstChar - 32));//set upper
                }
            }
            String newName = ”";
            for (int i = 0;i < array.length;i++) {
                if(i < array.length - 1)
                    newName += array[i] + SPACE;
                else
                    newName += array[i];
            }
            match02 = ”\”><b>” + newName + ”</b>”;
        }
        if(!source.contains(match01) && match02 != null && !source.contains(match02)){
            /*may other music return*/
            return null;
        }
        int first = source.indexOf(ID_HEAD_FLAG);
        if(first == -1){
            /*no music id*/
            return null;
        }
        int last = source.indexOf(ID_HEAD_FLAG,first + ID_HEAD_FLAG.length());
        if(last != -1){
            /*ignore only a music id,if have some choose first one*/
            source = source.substring(first,last);
        }
        /*find id*/
        int start = source.indexOf(SEARCH_ID_FLAG);
        int mid = source.indexOf(SEARCH_HTML_EQUAL, start);
        int end = source.indexOf(END_FLAG,mid);
        if(start == -1 || mid == -1 || end == -1){
            //can’t find id
            return null;
        }
        String id = source.substring(mid + HTML_SPACE.length(), end);
        return id;
    }

    private static String getLrcDownloadUrl(String id) throws IOException{
        /*set music lrc html url with id*/
        String source = readHtml(SEARCH_ID_URL_HEAD + id);
        int start = source.indexOf(SEARCH_LRC_DOWNLOAD_URL_FLAG);
        int end = source.indexOf(LRC_SUFFIX,start);
        String urlString = source.substring(start, end + LRC_SUFFIX.length());
        return urlString;
    }

    private static String doDownloadLrc(String path) throws IOException{
        /*download lrc*/
        return readHtml(path);
    }

    private static String readHtml(String urlPath) throws IOException{
        /*use google music search engine*/
        URL url = new URL(urlPath);
        /*connect and get html */
        URLConnection conn = url.openConnection();
        BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
        String line = null;
        StringBuilder stringBuilder = new StringBuilder();
        while ((line = reader.readLine()) != null) {
            stringBuilder.append(line + LINE_END);
        }
        return stringBuilder.toString();
    }

    private static void writeToFile(File file,String buffer) throws IOException{
        /*write to file,file name is music’s name + ”.lrc”*/
        FileWriter writer = new FileWriter(file, false);
        try {
            writer.write(buffer);
        } catch (Exception e) {
            System.out.println(FAIL_WRITE_FILE_MESSAGE);
        }finally{
            writer.close();
        }
    }
}

测试类

 

[java]

<span style=”font-family:FangSong_GB2312;”><span style=”font-size: 14px;”></span></span><pre name=”code” class=”java”>package com.zyc.download_lrc;

public class DownloadTest {

    public static void main(String[] args) {
        //only for test
        String name = ”决战斗室”;
        String artist = ”潘玮柏”;
        downloadMusicLrc(name, artist);
    }

    static void downloadMusicLrc(String name,String artist){
        DownloadGoogleLrcTool.downloadLrcFromGoogle(name, artist);
    }

}

测试结果:

 

正在下载歌曲 决战斗室-潘玮柏 歌词…
下载歌曲 决战斗室-潘玮柏 歌词 成功!
歌词位置: /project/DownLoadLrc/决战斗室.lrc

歌词如下:

[ti:决战斗室]
[ar:潘玮柏]
[al:高手]
[00:05.00]
[01:20.44][00:16.69]克制不住 心跳加速
[01:22.27][00:18.67]太兴奋追求战斗我才满足
[01:24.25][00:20.47]角落处 全神贯注
[01:26.25][00:22.57]眼神冰冷像只危险老虎
[01:28.23][00:24.58]拳头蹦带 无法束缚
[01:30.25][00:26.55]脉膊跳动的强度快忍不住
[01:32.22][00:28.51]灯在闪 人群在喊
[01:34.19][00:30.48]抬起头我完全不屑一顾
[01:36.21][00:32.60]Noboby gonna stop me
[01:38.21][00:34.57]沉默中 聆听自己
[01:40.07][00:36.54]Noboby gonna front me
[01:42.23][00:38.51]相信自己 绝不会逃避
[01:44.25][00:40.55]Noboby gonna touch me
[01:46.19][00:42.48]呐喊声全场淹没
[01:48.12][00:44.41]推开门 走出自我
[01:50.06][00:46.22]This is my life my soul
[02:44.39][02:28.08][01:52.15][00:48.47]紧握灵魂的手
[02:45.75][02:29.93][01:54.03][00:50.35]最后一刻战斗
[02:47.86][02:31.96][01:56.10][00:52.38]黑暗恐惧之中
[02:50.61][02:33.71][01:57.84][00:54.19]决战斗室只剩你我
[02:51.86][02:35.86][02:00.09][00:56.38]倒数的计时钟
[02:53.77][02:37.90][02:02.00][00:58.30]胜利才终结转动
[02:57.37][02:41.51][02:05.59][01:01.84]我闭上眼我站在斗室中
[02:59.29][02:43.35][02:07.50][01:03.94]只剩下Oh oh

然后就可以放进手机同步播放了!

搞定!!!

Leave a Comment

JDK 8(Lambda版)开发者预览版发布

0顶一下之前有报道称,Java 8中将支持Lambda语法,在JDK 8开发者预览版发布之后,Java社区的Lambda项目又在JDK中添加了Lambda功能。 Lambda项目旨在通过在Java语言中添加闭包(closures)及相关功能,来支持在多核心环境下编程。 该开发者预览版基于最新的OpenJDK 7源码库,使用了一些尚未在JDK8中使用的源码文件,届时如果这些源码文件可用,将会被整合进JDK8中。 需要注意的是,此次发布的预览...[阅读全文]

0
顶一下

之前有报道称,Java 8中将支持Lambda语法,在JDK 8开发者预览版发布之后,Java社区的Lambda项目又在JDK中添加了Lambda功能。

Lambda项目旨在通过在Java语言中添加闭包(closures)及相关功能,来支持在多核心环境下编程。

该开发者预览版基于最新的OpenJDK 7源码库,使用了一些尚未在JDK8中使用的源码文件,届时如果这些源码文件可用,将会被整合进JDK8中。

需要注意的是,此次发布的预览版意味着允许开发者试验Lambda功能,而不需要他们自己编译相关功能的包。该版本并非官方正式版,仅用于开发者测试交流。

下载:

JavaSE 8 Developer Preview

JavaSE 8 Developer Preview with Lambda Support

Leave a Comment

JAVA可移植性广泛应用

0顶一下JAVA可移植性广泛应用。软件可移植性指与软件从某一环境转移到另一环境下的难易程度。为获得较高的可移植性,在设计过程中常采用通用的程序设计语言和运行支撑环境。尽量不用与系统的底层相关性强的语言。下面介绍JAVA的可移植性。 一、JAVA作为一种编程语言:源代码可移植性 作为一种编程语言,JAVA提供了一种最简单同时也是人们最熟悉的可移植性–源代码移植。这意味着任意一个JAVA程序...[阅读全文]

0
顶一下

JAVA可移植性广泛应用。软件可移植性指与软件从某一环境转移到另一环境下的难易程度。为获得较高的可移植性,在设计过程中常采用通用的程序设计语言和运行支撑环境。尽量不用与系统的底层相关性强的语言。下面介绍JAVA的可移植性。

一、JAVA作为一种编程语言:源代码可移植性

作为一种编程语言,JAVA提供了一种最简单同时也是人们最熟悉的可移植性–源代码移植。这意味着任意一个JAVA程序,不论它运行在何种CPU、操作系统或JAVA编译器上,都将产生同样的结果。这并不是一个新的概念。人们使用C、C++也可以产生同样的效果。

但是使用C或C++编程人们可以有太多的选择,在许多细节上它都没有严格定义,如:未初始化变量的值、对已释放的内存的存取、浮点运算的尾数值等等。所以除非你一开始就严格按照系统无关的概念来进行设计,否则这种可移植性只能是一种理论上的设想而不能形成实践。

总之,尽管C和C++有严密的语法定义,它们的语意(symantics)定义还不是标准的。这种语意上的不统一使得同一段程序在不同的系统环境下会产生不同的结果。有时即使系统情况完全相同而仅仅由于编译器的设置不同也会产生令人意想不到的结果。而JAVA就不同了。它定义了严密的语意结构,而使编译器不承担这方面的工作。

另外,JAVA对程序的行为的定义也比C和C++严格,如:它提供了内存自动回收功能(GarbageCollection),使程序不能访问越界内存;它对未初始化的变量提供确定值等等。它的这些特性能够减小在不同平台上运行的JAVA程序之间的差异,也使得JAVA具有即使没有JAVA虚拟机的存在的情况下比C和C++更好的平台无关性。

然而,这些特点也有它不利的一面。JAVA设想运行于具有32位字节长度且每字节为8位的计算机上,这就使得那些8位字长的计算机和一些巨型机不能有效的运行JAVA程序。在这样的平台上就只能运行那些可移植的C和C++程序了。

二、JAVA作为一个虚拟机:CPU可移植性

大多数编译器产生的目标代码只能运行在一种CPU上(如Intel的x86系列),即使那些能支持多种CPU的编译器也不能同时产生适合多种CPU的目标代码。如果你需要在三种CPU(如x86、SPARC和MIPS)上运行同一程序,就必须编译三次。

但JAVA编译器就不同了。JAVA编译器产生的目标代码(J-Code)是针对一种并不存在的CPU–JAVA虚拟机(JAVAVirtualMachine),而不是某一实际的CPU.JAVA虚拟机能掩盖不同CPU之间的差别,使J-Code能运行于任何具有JAVA虚拟机的机器上。

虚拟机的概念并不是JAVA所特有的:加州大学几年前就提出了PASCAL虚拟机的概念;广泛用于Unix服务器的Perl脚本也是产生与机器无关的中间代码用于执行。但针对Internet应用而设计的JAVA虚拟机的特别之处在于它能产生安全的不受病毒威胁的目标代码。正是由于Internet对安全特性的特别要求才使得JVM能够迅速被人们接受。当今主流的操作系统如OS/2、MacOS、Windows95/NT都已经或很快提供对J-Code的支持。

作为一种虚拟的CPU,JAVA虚拟机对于源代码(SourceCode)来说是独立的。我们不仅可以用JAVA语言来生成J-Code,也可以用Ada95来生成。事实上,已经有了针对若干种源代码的J-Code编译器,包括Basic、Lisp和Forth.源代码一经转换成J-Code以后,JAVA虚拟机就能够执行而不区分它是由哪种源代码生成的。这样做的结果就是CPU可移植性。
将源程序编译为J-Code的好处在于可运行于各种机器上,而缺点是它不如本机代码运行的速度快。

三、JAVA作为一种虚拟的操作系统(OS)和图形用户界面(GUI):操作系统可移植性

即使经过重新编译,大多数的用C和C++编写的Windows程序也不能在Unix或Macintosh系统上运行。这是为什么呢?因为程序员在编写Windows程序时使用了大量的WindowsAPI和中断调用,而Windows程序对系统功能的调用与Unix和Macintosh程序有很大的差别,所以除非将全套WindowsAPI移植到其它操作系统上,否则重编译的程序仍不能运行。

JAVA采用了提供一套与平台无关的库函数(包括AWT、UTIL、LANG等等)的方法来解决这个问题。就象JVM提供了一个虚拟的CPU一样,JAVA库函数提供了一个虚拟的GUI环境。JAVA程序仅对JAVA库函数提出调用,而库函数对操作系统功能的调用由各不同的虚拟机来完成。

JAVA也在它的OS/GUI库中使用了一种“罕见名称符”(least-commom-denominator)来提供对某种特定操作系统的功能调用,即此功能只在特定环境下生效而在其它操作系统下则被忽略。

这样做的好处在于可以针对某操作系统生成拥有人们熟悉的界面的应用程序而同时此程序又能在其它系统下运行。缺点则是系统中的某些功能调用有很强的依赖性因而在JAVA的虚拟OS/API中难以实现。遇到这种情况,程序员就只能写不可移植的程序了。

总之,JAVA在可移植性方面的特点使它在Internet上具有广泛的应用前景。同时它本身具有的防病毒的能力也使它在需要高可靠性的应用中占有一席之地。

Leave a Comment

二级经验心得:菜鸟入门Java语言学习的要点

0顶一下一、掌握静态方法和属性          静态方法和属性用于描述某一类对象群体的特征,而不是单个对象的特征。Java中大量应用了静态方法和属性,这是一个通常的技巧。但是这种技巧在很多语言中不被频繁地使用。理解静态方法和属性对于理解类与对象的关系是十分有帮助的,在大量的Java规范中,静态方法和属性被频繁使用。因此学习者应该理解静态方法和属性。Java在方法和属性的调用上是...[阅读全文]

0
顶一下

一、掌握静态方法和属性

         静态方法和属性用于描述某一类对象群体的特征,而不是单个对象的特征。Java中大量应用了静态方法和属性,这是一个通常的技巧。但是这种技巧在很多语言中不被频繁地使用。理解静态方法和属性对于理解类与对象的关系是十分有帮助的,在大量的Java规范中,静态方法和属性被频繁使用。因此学习者应该理解静态方法和属性。Java在方法和属性的调用上是一致的,区别只表现在声明的时候,这和c++是不同的。

二、重视接口

       在面向对象早期的应用中大量使用了类继承。随着软件工程理论的不断发展,人们开始意识到了继承的众多缺点,开始努力用聚合代替继承。软件工程解决扩展性的重要原则就是抽象描述,直接使用的工具就是接口。接口近年来逐渐成为Java编程方法的核心。另一方面,就应用而言,大部分开发是建立在规范基础之上的,不需要自己建立复杂的继承关系和庞大的类。因此读懂规范和用好规范已经成为应用程序开发人员的首要任务,Java各项规范的主要描述手段就是接口。

三、学好集合框架

        Java描述复杂数据结构的主要方式是集合框架。Java没有指针,而是通过强大的集合框架描述数组、对象数组等复杂的数据结构。学好这些数据结构的描述方法对于应用程序编写,特别是涉及到服务器方、3层结构编程至关重要。程序员在这个时候不能再用诸如数据库结果集之类的结构描述数据了。
由于很多语言没有这么强大的集合框架体系,很多初学者不知所措,更不知道拿来做什么用,因此应该引起足够的重视。

四、例外捕捉

        Java对例外捕捉的强调是空前的,它强迫程序员用显著的与逻辑方法完全不同的方式描述例外捕捉,对于程序描述的完整性和严谨性有很大的意义。c++也有类似的机制,但是我们看到很多c++程序员并不习惯使用这些机制。
Java的初学者应该充分学习好这种例外捕捉机制,养成良好的编程习惯。

五、多线程需要理解机理

        很多Java程序员热衷于多线程程序编写,认为是对逻辑能力的挑战。其实在大量应用中根本就不需要编写多线程程序,或者说大多数编写应用程序的程序员不会去写多线程程序。这是因为多线程机制都内置到基础平台当中了。
程序员应该了解的是多线程原理和多线程安全,这对于今后准确地把握程序是至关重要的。
例如JSP中编写到不同的位置对于多个用户环境的安全影响完全不同,又如著名的Super Servlet是每一个访问作为一个进程,但是每一个页面是一个线程,和Servlet正好相反,对程序的性能和安全的影响有天壤之别。

六、了解网络编程

        Java号称是最强的网络编程语言,但是大多数应用程序开发人员是从来不会自己开发什么底层的网络程序的。
需要做只是了解原理就够了。网络机制的实现是靠平台实现的,除非自己开发平台,否则是不需要知道socket怎么实现,怎么监听访问的。因此在这方面花太多的功夫就偏离了“将来的应用开发是在成熟的平台上展开,而不是自己从底层开发平台”这一假设。

Leave a Comment

优秀的Java程序员必须了解GC的工作原理

4顶一下一个优秀的Java程序员必须了解GC的工作原理、如何优化GC的性能、如何与GC进行有限的交互,因为有一些应用程序对性能要求较高,例如嵌入式系统、实时系统等,只有全面提升内存的管理效率 ,才能提高整个应用程序的性能。本篇文章首先简单介绍GC的工作原理之后,然后再对GC的几个关键问题进行深入探讨,最后提出一些Java程序设计建议,从GC角度提高Java程序的性能。   GC的基本原理    ...[阅读全文]

4
顶一下

一个优秀的Java程序员必须了解GC的工作原理、如何优化GC的性能、如何与GC进行有限的交互,因为有一些应用程序对性能要求较高,例如嵌入式系统、实时系统等,只有全面提升内存的管理效率 ,才能提高整个应用程序的性能。本篇文章首先简单介绍GC的工作原理之后,然后再对GC的几个关键问题进行深入探讨,最后提出一些Java程序设计建议,从GC角度提高Java程序的性能。

  GC的基本原理

   Java的内存管理实际上就是对象的管理,其中包括对象的分配和释放。
对于程序员来说,分配对象使用new关键字;释放对象时,只要将对象所有引用赋值为null,让程序不能够再访问到这个对象,我们称该对象为\”不可达的\”.GC将负责回收所有\”不可达\”对象的内存空间。

对于GC来说,当程序员创建对象时,GC就开始监控这个对象的地址、大小以及使用情况。通常,GC采用有向图的方式记录和管理堆(heap)中的所有对象(详见 参考资料1 )。通过这种方式确定哪些对象是\”可达的\”,哪些对象是\”不可达的\”.当GC确定一些对象为\”不可达\”时,GC就有责任回收这些内存空间。但是,为了保证GC能够在不同平台实现的问题,Java规范对GC的很多行为都没有进行严格的规定。例如,对于采用什么类型的回收算法、什么时候进行回收等重要问题都没有明确的规定。因此,不同的JVM的实现者往往有不同的实现算法。这也给Java程序员的开发带来行多不确定性。本文研究了几个与GC工作相关的问题,努力减少这种不确定性给Java程序带来的负面影响。

  增量式GC( Incremental GC )

         GC在JVM中通常是由一个或一组进程来实现的,它本身也和用户程序一样占用heap空间,运行时也占用CPU.当GC进程运行时,应用程序停止运行。因此,当GC运行时间较长时,用户能够感到Java程序的停顿,另外一方面,如果GC运行时间太短,则可能对象回收率太低,这意味着还有很多应该回收的对象没有被回收,仍然占用大量内存。因此,在设计GC的时候,就必须在停顿时间和回收率之间进行权衡。一个好的GC实现允许用户定义自己所需要的设置,例如有些内存有限有设备,对内存的使用量非常敏感,希望GC能够准确的回收内存,它并不在意程序速度的放慢。另外一些实时网络游戏,就不能够允许程序有长时间的中断。增量式GC就是通过一定的回收算法,把一个长时间的中断,划分为很多个小的中断,通过这种方式减少GC对用户程序的影响。虽然,增量式GC在整体性能上可能不如普通GC的效率高,但是它能够减少程序的最长停顿时间。

Sun JDK提供的HotSpot JVM就能支持增量式GC.HotSpot JVM缺省GC方式为不使用增量GC,为了启动增量GC,我们必须在运行Java程序时增加-Xincgc的参数。HotSpot JVM增量式GC的实现是采用Train GC算法。它的基本想法就是,将堆中的所有对象按照创建和使用情况进行分组(分层),将使用频繁高和具有相关性的对象放在一队中,随着程序的运行,不断对组进行调整。当GC运行时,它总是先回收最老的(最近很少访问的)的对象,如果整组都为可回收对象,GC将整组回收。这样,每次GC运行只回收一定比例的不可达对象,保证程序的顺畅运行。

详解finalize函数

finalize是位于Object类的一个方法,该方法的访问修饰符为protected,由于所有类为Object的子类,因此用户类很容易访问到这个方法。由于,finalize函数没有自动实现链式调用,我们必须手动的实现,因此finalize函数的最后一个语句通常是super.finalize()。通过这种方式,我们可以实现从下到上实现finalize的调用,即先释放自己的资源,然后再释放父类的资源。

根据Java语言规范,JVM保证调用finalize函数之前,这个对象是不可达的,但是JVM不保证这个函数一定会被调用。另外,规范还保证finalize函数最多运行一次。

很多Java初学者会认为这个方法类似与C++中的析构函数,将很多对象、资源的释放都放在这一函数里面。其实,这不是一种很好的方式。原因有三,其一,GC为了能够支持finalize函数,要对覆盖这个函数的对象作很多附加的工作。其二,在finalize运行完成之后,该对象可能变成可达的,GC还要再检查一次该对象是否是可达的。因此,使用finalize会降低GC的运行性能。其三,由于GC调用finalize的时间是不确定的,因此通过这种方式释放资源也是不确定的。

通常,finalize用于一些不容易控制、并且非常重要资源的释放,例如一些I/O的操作,数据的连接。这些资源的释放对整个应用程序是非常关键的。在这种情况下,程序员应该以通过程序本身管理(包括释放)这些资源为主,以finalize函数释放资源方式为辅,形成一种双保险的管理机制,而不应该仅仅依靠finalize来释放资源。

下面给出一个例子说明,finalize函数被调用以后,仍然可能是可达的,同时也可说明一个对象的finalize只可能运行一次。

class MyObject{
Test main; //记录Test对象,在finalize中时用于恢复可达性
public MyObject(Test t) {
main=t; //保存Test 对象
}
protected void finalize() {
main.ref=this;// 恢复本对象,让本对象可达
System.out.println(\”This is finalize\”);//用于测试finalize只运行一次
}
}
class Test {
MyObject ref;
public static void main(String[] args) {
Test test=new Test();
test.ref=new MyObject(test);
test.ref=null; //MyObject对象为不可达对象,finalize将被调用
System.gc();
if (test.ref!=null) System.out.println(\”My Object还活着\”);
}
}
运行结果:

This is finalize
    MyObject还活着

此例子中,需要注意的是虽然MyObject对象在finalize中变成可达对象,但是下次回收时候,finalize却不再被调用,因为finalize函数最多只调用一次。

 程序如何与GC进行交互

   Java2增强了内存管理功能, 增加了一个java.lang.ref包,其中定义了三种引用类。这三种引用类分别为SoftReference、WeakReference和PhantomReference.通过使用这些引用类,程序员可以在一定程度与GC进行交互,以便改善GC的工作效率。这些引用类的引用强度介于可达对象和不可达对象之间。

创建一个引用对象也非常容易,例如如果你需要创建一个Soft Reference对象,那么首先创建一个对象,并采用普通引用方式(可达对象);然后再创建一个SoftReference引用该对象;最后将普通引用设置为null.通过这种方式,这个对象就只有一个Soft Reference引用。同时,我们称这个对象为Soft Reference 对象。

Soft Reference的主要特点是据有较强的引用功能。只有当内存不够的时候,才进行回收这类内存,因此在内存足够的时候,它们通常不被回收。另外,这些引用对象还能保证在Java抛出OutOfMemory 异常之前,被设置为null.它可以用于实现一些常用图片的缓存,实现Cache的功能,保证最大限度的使用内存而不引起OutOfMemory.以下给出这种引用类型的使用伪代码;

//申请一个图像对象
Image image=new Image();//创建Image对象

//使用 image

//使用完了image,将它设置为soft 引用类型,并且释放强引用;
SoftReference sr=new SoftReference(image);
image=null;

//下次使用时
if (sr!=null) image=sr.get();
else{
//由于GC由于低内存,已释放image,因此需要重新装载;
image=new Image();
sr=new SoftReference(image);
}

Weak引用对象与Soft引用对象的最大不同就在于:GC在进行回收时,需要通过算法检查是否回收Soft引用对象,而对于Weak引用对象,GC总是进行回收。Weak引用对象更容易、更快被GC回收。虽然,GC在运行时一定回收Weak对象,但是复杂关系的Weak对象群常常需要好几次GC的运行才能完成。Weak引用对象常常用于Map结构中,引用数据量较大的对象,一旦该对象的强引用为null时,GC能够快速地回收该对象空间。

Phantom引用的用途较少,主要用于辅助finalize函数的使用。Phantom对象指一些对象,它们执行完了finalize函数,并为不可达对象,但是它们还没有被GC回收。这种对象可以辅助finalize进行一些后期的回收工作,我们通过覆盖Reference的clear()方法,增强资源回收机制的灵活性。

  一些Java编码的建议

根据GC的工作原理,我们可以通过一些技巧和方式,让GC运行更加有效率,更加符合应用程序的要求。以下就是一些程序设计的几点建议。
1.最基本的建议就是尽早释放无用对象的引用。大多数程序员在使用临时变量的时候,都是让引用变量在退出活动域(scope)后,自动设置为null.我们在使用这种方式时候,必须特别注意一些复杂的对象图,例如数组,队列,树,图等,这些对象之间有相互引用关系较为复杂。对于这类对象,GC回收它们一般效率较低。如果程序允许,尽早将不用的引用对象赋为null.这样可以加速GC的工作。 [Page]
2.尽量少用finalize函数。finalize函数是Java提供给程序员一个释放对象或资源的机会。但是,它会加大GC的工作量,因此尽量少采用finalize方式回收资源。
3.如果需要使用经常使用的图片,可以使用soft应用类型。它可以尽可能将图片保存在内存中,供程序调用,而不引起OutOfMemory.
4.注意集合数据类型,包括数组,树,图,链表等数据结构,这些数据结构对GC来说,回收更为复杂。另外,注意一些全局的变量,以及一些静态变量。这些变量往往容易引起悬挂对象(dangling reference),造成内存浪费。
5.当程序有一定的等待时间,程序员可以手动执行System.gc(),通知GC运行,但是Java语言规范并不保证GC一定会执行。使用增量式GC可以缩短Java程序的暂停时间。

Comments (1)

Java和PHP在Web开发方面的比较

1顶一下比较PHP和JSP这两个Web开发技术,在目前的情况是其实是比较PHP和Java的Web开发。以下是我就几个主要方面进行的比较: 一、 语言比较 PHP是解释执行的服务器脚本语言,首先php有简单容易上手的特点。语法和c语言比较象,所以学过c语言的程序员可以很快的熟悉php的开发。而java需要先学好java的语法和熟悉一些核心的类库,懂得面向对象的程序设计方法。所以java不如php好学。 Java首先要编译...[阅读全文]

1
顶一下

比较PHP和JSP这两个Web开发技术,在目前的情况是其实是比较PHP和Java的Web开发。以下是我就几个主要方面进行的比较:

一、 语言比较

PHP是解释执行的服务器脚本语言,首先php有简单容易上手的特点。语法和c语言比较象,所以学过c语言的程序员可以很快的熟悉php的开发。而java需要先学好java的语法和熟悉一些核心的类库,懂得面向对象的程序设计方法。所以java不如php好学。
Java首先要编译成字节码.class文件,然后在java虚拟机上解释执行。Java的Web开发首先最容易想到的就是JSP(现在已经到 JSP2.0),原来的java的Web开发都是用servlet来实现的,用servlet来开发需要程序员在java的源文件中嵌入大量的html代码。所以后来就出现了JSP,JSP可以方便的嵌入到html文件当中,其实jsp文件在服务器上执行的时候首先会被应用服务器转换成servlet,然后再编译执行。Jsp可以通过servlet和JavaBean的支持产生强大的功能。JavaBean 是一种可复用的、跨平台的软件组件。使用javabean可以方便的实现java代码和html的分离,能够增强系统的功能和软件的复用性。
Java的Web开发属于SUN公司定义的J2EE其中的规范。而且在J2EE中包括了java的Web开发的所有方面,如:JSP、Servlet、JDBC、JNDI、JAVABEAN、EJB等等。J2EE就特别适合于做大型的企业级的应用。

二、 数据库访问比较

Java通过JDBC来访问数据库,通过不同的数据库厂商提供的数据库驱动方便地访问数据库。访问数据库的接口比较统一。
PHP对于不同的数据库采用不同的数据库访问接口,所以数据库访问代码的通用性不强。例如:用Java开发的Web应用从MySQL数据库转到Oracle数据库只需要做很少的修改。而PHP则需要做大量的修改工作。

三、 系统设计架构比较

采用Java的Web开发技术,需要使用的是面向对象的系统设计方法,而PHP还是采用面向过程的开发方法。所以用Java进行开发前期需要做大量的系统分析和设计的工作。

四、 跨平台性

Java和PHP都有很好的跨平台的特性。几乎都可以在不作任何修改的情况下运行在Linux或者Windows等不同的操作系统上。

五、 开发成本比较

PHP最经典的组合就是:PHP + MySQL + Apache。非常适合开发中小型的Web应用,开发的速度比较快。而且所有的软件都是开源免费的,可以减少投入。
Java的Web应用服务器有免费Tomcat、JBoss等,如果需要更好的商业化的服务有:Web Sphere和 Web logic。

六、 分布式多层架构比较

PHP只能实现简单的分布式两层或三层的架构,而JAVA在这方面就比较强大,可以实现多层的网络架构。数据库层(持久化层)、应用(业务)逻辑层、表示逻辑层彼此分开,而且现在不同的层都已经有一些成熟的开发框架的支持。例如Struts就是利用java的Web开发技术实现了MVC的设计模式,而在业务逻辑层也有Spring框架,数据库持久化层有Hibernate等框架。这些框架可以方便开发者高效、合理、科学得架构多层的商业应用。

下面简要的说一下Struts,它实质上是在JSP Model2的基础上实现的一个MVC(Model、View、Controler)框架。JSP Model2体系结构是一种联合使用JSP 与Servlet 来提供动态内容的方法。在Struts框架中,模型由实现业务逻辑的JavaBean或EJB组件构成,控制器由Servlet实现的,视图由一组JSP 文件组成。采用Struts可以明确角色的定义和开发者与网页设计者的分工。而且项目越复杂,其优势越明显。

七、 源代码安全

PHP开发的程序的源代码都是公开的,他人拿到php开发的程序后都可以进行修改。
Java开发的程序,最后用户拿到的是只是一些编译好的class类,无法看到完整的源代码,安全性高。

八、性能比较

有人做过试验,对这两种种语言分别做回圈性能测试及存取Oracle数据库测试。
在循环性能测试中,JSP只用了令人吃惊的四秒钟就结束了20000*20000的回圈。而PHP测试的是2000*2000循环(少一个数量级),却分别用了63秒。
数据库测试中,二者分别对 Oracle 8 进行 1000 次 Insert,Update,Select和Delete: JSP 需要 13 秒,PHP 需要 69 秒。

项目

PHP

JAVA

可复用性

开发速度

易维护性

可移植性

优- Linux

Windows 、 Unix

安全性

开发费用

多层架构

数据库访问

接口不统一

接口统一

可扩展性

面向对象

综上所述,我个人认为,PHP适合于快速开发,中小型应用系统,开发成本低,能够对变动的需求作出快速的反应。而Java适合于开发大型的应用系统,应用的前景比较广阔,系统易维护、可复用性较好。还有,同样功能的系统用Java开发的系统要比PHP开发的系统的价格要高。

Comments (1)

Java SE 6 Update 29发布 修复重大漏洞

1顶一下Java SE 是Java平台标准版的简称(Java Platform, Standard Edition) (also known as Java 2 Platform) ,用于开发和部署桌面、服务器以及嵌入设备和实时环境中的Java应用程序。Java SE包括用于开发Java Web服务的类库,同时,Java SE为Java EE提供了基础。Java SE(Java Platform, Standard Edition,Java标准版)就是基于JDK和JRE的。 Java是目前所有编程语言中最流行、发展最快的语言之一...[阅读全文]

1
顶一下

Java SE 是Java平台标准版的简称(Java Platform, Standard Edition) (also known as Java 2 Platform) ,用于开发和部署桌面、服务器以及嵌入设备和实时环境中的Java应用程序。Java SE包括用于开发Java Web服务的类库,同时,Java SE为Java EE提供了基础。Java SE(Java Platform, Standard Edition,Java标准版)就是基于JDK和JRE的。
Java是目前所有编程语言中最流行、发展最快的语言之一,随着Java SE 6.0的发布,Java也变得更加强大和易用。
Java SE 6 的第 29 个更新版本发布了,该版本修复了一些关键的bug. 此更新的完整版本的内部版本是1.6.0_29-b11(其中“B”代表“Build”)。外部版本号是6u29。
安全基准:

针对此次版本,发布的重要补丁更新包涵盖了20个Oracle Java SE新增的安全漏洞。其中19个漏洞在未经许可的情况下可以远程操控,比如在无需用户名和密码的情况下就可以远程登录。

至于部署方面的问题,只有在JDK和JRE7、JRE6中才能修复部署方面的漏洞。用户在最新的JDK以及JRE7或者JRE 6中,应该使用默认的Java插件和Java Web Start。
官网详细说明:http://www.oracle.com/technetwork/java/javase/6u29-relnotes-507960.html
下载地址:http://www.oracle.com/technetwork/java/javase/tzdata-versions-138805.html

Comments (1)

新鲜出炉的 Android 4.0 SDk 目前可以下载了

1顶一下10月19日消息,谷歌今天与三星在香港联合举办发布会,对外正式发布新机Galaxy Nexus,以及代号为“冰淇淋三明治”(Ice Cream Sandwich)的Android 4.0系统。 令人兴奋的是发布会结束后,Android 4.0随后也可以在Android开发中心下载。 新的SDK支持移动数据控制、高分辨率图像、面部识别、增强共享等功能。 具体详情请移步: http://developer.android.com/sdk/android-4.0.html [阅读全文]

1
顶一下

10月19日消息,谷歌今天与三星在香港联合举办发布会,对外正式发布新机Galaxy Nexus,以及代号为“冰淇淋三明治”(Ice Cream Sandwich)的Android 4.0系统。
令人兴奋的是发布会结束后,Android 4.0随后也可以在Android开发中心下载。
新的SDK支持移动数据控制、高分辨率图像、面部识别、增强共享等功能。

具体详情请移步:
http://developer.android.com/sdk/android-4.0.html

Comments (1)

Google发布Dart语言:支持Java虚拟机

0顶一下由于JDart项目被托管在Google Code上的缘故,谷歌最新推出的编程语言现在可以运行在Java虚拟机上。上周“Goto”大会在丹麦奥胡斯举行,谷歌两位开发人员会借着主题演讲的机会来揭晓这门新语言的全貌。 Dart编程语言适合于那些对JavaScript并不感冒的Java编程人员。该语言可以使用结构化代码来快速创建原型。 Dart语言可以看做是JavaScript语言的替代品。Google已经意识到JavaScript在未来...[阅读全文]

0
顶一下

由于JDart项目被托管在Google Code上的缘故,谷歌最新推出的编程语言现在可以运行在Java虚拟机上。上周“Goto”大会在丹麦奥胡斯举行,谷歌两位开发人员会借着主题演讲的机会来揭晓这门新语言的全貌。

Dart编程语言适合于那些对JavaScript并不感冒的Java编程人员。该语言可以使用结构化代码来快速创建原型。
Dart语言可以看做是JavaScript语言的替代品。Google已经意识到JavaScript在未来Web开发应用中起到的不可估量的作用,因此推出了Dart这种结构化Web编程语言,希望成为JavaScript的替代品。
Dart语言是一种面向对象的语言,设计的目标如下:用于创建Web应用程序的编程语言,突出结构化、灵活性,让程序员在Dart的学习中感到得心应手。
Dart代码以两种方式执行,一种是原生虚拟机,一种是JavaScript引擎,用编译器将Dart代码翻译成 JavaScript代码。这允许程序员在Dart中创建Web应用,编译后在任何浏览器上运行。Dart语言官网提供了名叫Dartboard的在线应用,让感兴趣的开发者在线上编程和运行。
JDart项目目前处于早期发展阶段,只提供少数翻译的指令。JDart编译器生成了jar文件可以运行在任意一台Java 7虚拟机上。作者提供了一些示例,您可以很清楚编译器真正生成的结果。以下提供一个简单的Hello World输出示例,Dart代码如下:

1 main() {
2 print(“hello world”);
3 }

编译结果如下:

1 public class test {
2 public static void main(java.lang.String[]);
3 Code:
4 0: invokedynamic #18,  0             // InvokeDynamic #0:__main__:()V
5 5: return
6
7 public static java.lang.Object __main__();
8 Code:
9 0: ldc           #21                 // String hello world
10 2: invokedynamic #27,  0             // InvokeDynamic #1:print:(Ljava/lang/String;)V
11 7: aconst_null
12 8: areturn
13 }

对于Dart而言,要想彻底替代JavaScript,还为时过早。但将它用于Web应用程序的开发,还不失为一种好的想法。

Comments (1)