仓酷云

标题: JAVA教程之存取程序形态的几种办法――Java I/O应... [打印本页]

作者: 再见西城    时间: 2015-1-18 11:48
标题: JAVA教程之存取程序形态的几种办法――Java I/O应...
java也能做一些底层语言开发做的事情(难度很高,不是java顶尖高手是做不来的),程序
jungleford如是说

已有一个多月没有理睬blog了,缘故原由良多,比如实行室的项目正在出工,巨忙;比如找事情及其相干的事变;并且仲春份年夜部分工夫是陪老爹老妈,家里拨号的速率不可思议……但次要仍是没有找到一个符合的topic,大概说这段工夫懒了(临卒业后期综合症),净在看《汉武年夜帝》和汗青方面的书,另有别的七零八落的闲书,就是没有仔细地玩Java,哈哈!如今事情差未几落实了,幸亏不算太烂,小资青年jungleford的生存又入手下手步进正轨了!以上是新年里的一些空话。明天略微聊一点关于“程序形态保留”方面的成绩,我们很简单就会想到“序列化”(Serialization,有的书上又翻译为“按次化”大概“串行化”,但“串行”一词老是让我遐想到通讯和硬件接口,以是我更习气于“序列化”的叫法,况且这类叫法是有来头的,前面我漫谈到这个称号的由来),固然,序列化是一种便利无效的数据存取体例,但它另有加倍普遍的使用。狭义上讲,就是会商一下I/O的一些使用。

文件I/O:文件流→序列化

★文件流文件操纵是最复杂最间接也是最简单想到的一种体例,我们说的文件操纵不单单是经由过程FileInputStream/FileOutputStream这么“裸”的体例间接把数据写进到当地文件(像我之前写的一个扫雷的小游戏JavaMine就是如许保留一局的形态的),如许就对照“底层”了。
次要类与办法形貌FileInputStream.read()从当地文件读取二进制格局的数据FileReader.read()从当地文件读取字符(文本)数据FileOutputStream.write()保留二进制数据到当地文件FileWriter.write()保留字符数据到当地文件
★XML和下面的纯真的I/O体例比拟,XML就显得“高等”很多,以致于成为一种数据互换的尺度。以DOM体例为例,它体贴的是起首在内存中机关文档树,数据保留在某个结点上(能够是叶子结点,也能够是标签结点的属性),机关好了今后一次性的写进到内部文件,但我们只必要晓得文件的地位,其实不晓得I/O是怎样操纵的,XML操纵体例大概多半人也理论过,以是这里也只列出相干的办法,供初学者事后懂得一下。次要的包是javax.xml.parsers,org.w3c.dom,javax.xml.transform。
次要类与办法形貌DocumentBuilderFactory.newDocumentBuilder().parse()剖析一个内部的XML文件,失掉一个Document对象的DOM树DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument()初始化一棵DOM树Document.getDocumentElement().appendChild()为一个标签结点增加一个子结点Document.createTextNode()天生一个字符串结点Node.getChildNodes()获得某个结点的一切下一层子结点Node.removeChild()删除某个结点的子结点Document.getElementsByTagName()查找一切指命名称的标签结点Document.getElementById()查找指命名称的一个标签结点,假如有多个切合,则前往某一个,一般是第一个Element.getAttribute()获得一个标签的某个属性的的值Element.setAttribute()设置一个标签的某个属性的的值Element.removeAttribute()删除一个标签的某个属性TransformerFactory.newInstance().newTransformer().transform()将一棵DOM树写进到内部XML文件
★序列化利用基础的文件读写体例存取数据,假如我们仅仅保留不异范例的数据,则能够用统一种格局保留,比如在我的JavaMine中保留一个盘局时,必要保留每个方格的坐标、是不是有地雷,是不是被打开等,这些信息组分解一个“复合范例”;相反,假如有多种分歧范例的数据,那我们要末把它分化成多少部分,以不异范例(比如String)保留,要末我们必要在程序中增加剖析分歧范例数据格局的逻辑,这就很不便利。因而我们希冀用一种对照“高”的条理上处置数据,程序员应当花尽量少的工夫和代码对数据举行剖析,现实上,序列化操纵为我们供应了如许一条路子。序列化(Serialization)人人大概都有所打仗,它能够把对象以某种特定的编码格局写进或从内部字撙节(即ObjectInputStream/ObjectOutputStream)中读取。序列化一个对象十分之复杂,仅仅完成一下Serializable接口便可,乃至都不必为它专门增加任何办法:
publicclassMySerialimplementsjava.io.Serializable{...}
但有一个前提:即你要序列化的类傍边,它的每一个属性都必需是是“可序列化”的。这句话提及来有点拗口,实在一切基础范例(就是int,char,boolean之类的)都是“可序列化”的,而你能够看看JDK文档,会发明良多类实在已完成了Serializable(即已是“可序列化”的了),因而这些类的对象和基础数据范例都能够间接作为你必要序列化的谁人类的外部属性。假如碰着了不是“可序列化”的属性怎样办?对不起,那这个属性的类还必要事前完成Serializable接口,云云递回,直到一切属性都是“可序列化”的。
次要类与办法形貌ObjectOutputStream.writeObject()将一个对象序列化到内部字撙节ObjectInputStream.readObject()从内部字撙节读取偏重新机关对象
从实践使用上看来,“Serializable”这个接口并没有界说任何办法,似乎它只是一个标志(大概说像是Java的关头字)罢了,一旦假造机看到这个“标志”,就会实验挪用本身预界说的序列化机制,除非你在完成Serializable接口的同时还界说了公有的readObject()或writeObject()办法。这一点很奇异。不外你如果不肯意让体系利用缺省的体例举行序列化,那就必需界说下面提到的两个办法:
publicclassMySerialimplementsjava.io.Serializable{privatevoidwriteObject(java.io.ObjectOutputStreamout)throwsIOException{...}privatevoidreadObject(java.io.ObjectInputStreamin)throwsIOException,ClassNotFoundException{...}...}
比如你能够在下面的writeObject()里挪用默许的序列化办法ObjectOutputStream.defaultWriteObject();比如你不肯意将某些敏感的属性和信息序列化,你也能够挪用ObjectOutputStream.writeObject()办法明白指定必要序列化那些属性。关于用户可定制的序列化办法,我们将在前面提到。

★Bean下面的序列化只是一种基础使用,你把一个对象序列化到内部文件今后,用notepad翻开谁人文件,只能从为数未几的一些可读字符中猜到这是有关这个类的信息文件,这必要你熟习序列化文件的字节编码体例,那将是对照疾苦的(在《CoreJava2》第一卷里提到了相干编码体例,有乐趣的话能够检察参考材料),某些情形下我们大概必要被序列化的文件具有更好的可读性。另外一方面,作为Java组件的中心观点“JavaBeans”,从JDK1.4入手下手,其标准里也请求撑持文本体例的“临时的耐久化”(long-termpersistence)。翻开JDK文档,java.beans包里的有一个名为“Encoder”的类,这就是一个能够序列化bean的有用类。和它相干的两个次要类有XMLEcoder和XMLDecoder,明显,这是以XML文件的格局保留和读取bean的工具。他们的用法也很复杂,和下面ObjectOutputStream/ObjectInputStream对照相似。
次要类与办法形貌XMLEncoder.writeObject()将一个对象序列化到内部字撙节XMLDecoder.readObject()从内部字撙节读取偏重新机关对象
假如一个bean是以下格局:
publicclassMyBean{inti;char[]c;Strings;...(get和set操纵省略)...}
那末经由过程XMLEcoder序列化出来的XML文件具有如许的情势:
<?xmlversion="1.0"encoding="UTF-8"?><javaversion="1.4.0"class="java.beans.XMLDecoder"><objectclass="MyBean"><voidproperty="i"><int>1</int></void><voidproperty="c"><arrayclass="char"length="3"><voidindex="0"><int>a</int></void><voidindex="1"><int>b</int></void><voidindex="2"><int>c</int></void></array></void><voidproperty="s"><string>foxjump!</string></void></object></java>
像AWT和Swing中良多可视化组件都是bean,固然也是能够用这类体例序列化的,上面就是从JDK文档中摘录的一个JFrame序列化今后的XML文件:
<?xmlversion="1.0"encoding="UTF-8"?><javaversion="1.0"class="java.beans.XMLDecoder"><objectclass="javax.swing.JFrame"><voidproperty="name"><string>frame1</string></void><voidproperty="bounds"><objectclass="java.awt.Rectangle"><int>0</int><int>0</int><int>200</int><int>200</int></object></void><voidproperty="contentPane"><voidmethod="add"><objectclass="javax.swing.JButton"><voidproperty="label"><string>Hello</string></void></object></void></void><voidproperty="visible"><boolean>true</boolean></void></object></java>
因而但你想要保留的数据是一些不是太庞大的范例的话,把它做成bean再序列化也不掉为一种便利的选择。

★Properties在之前我总结的一篇关于汇合框架的小文章里提到过,Properties是汗青汇合类的一个典范的例子,这里次要不是先容它的汇合特征。人人大概都常常打仗一些设置文件,如Windows的ini文件,Apache的conf文件,另有Java里的properties文件等,这些文件傍边的数据以“关头字-值”对的体例保留。“情况变量”这个观点都晓得吧,它也是一种“key-value”对,之前也经常看到版上问“怎样获得体系某某信息”之类的成绩,实在良多都保留在情况变量里,只需用一条
System.getProperties().list(System.out);
就可以取得全体情况变量的列表:

--listingproperties--java.runtime.name=Java(TM)2RuntimeEnvironment,Stand...sun.boot.library.path=C:ProgramFilesJavaj2re1.4.2_05injava.vm.version=1.4.2_05-b04java.vm.vendor=SunMicrosystemsInc.java.vendor.url=http://java.sun.com/path.separator=;java.vm.name=JavaHotSpot(TM)ClientVMfile.encoding.pkg=sun.iouser.country=CNsun.os.patch.level=ServicePack1java.vm.specification.name=JavaVirtualMachineSpecificationuser.dir=d:mydocuments项目eclipseWTDemojava.runtime.version=1.4.2_05-b04java.awt.graphicsenv=sun.awt.Win32GraphicsEnvironmentjava.endorsed.dirs=C:ProgramFilesJavaj2re1.4.2_05li...os.arch=x86java.io.tmpdir=C:DOCUME~1cn2lx0q0LOCALS~1Templine.separator=

java.vm.specification.vendor=SunMicrosystemsInc.user.variant=os.name=WindowsXPsun.java2d.fontpath=java.library.path=C:ProgramFilesJavaj2re1.4.2_05i...java.specification.name=JavaPlatformAPISpecificationjava.class.version=48.0java.util.prefs.PreferencesFactory=java.util.prefs.WindowsPreferencesFac...os.version=5.1user.home=D:Userscn2lx0q0user.timezone=java.awt.printerjob=sun.awt.windows.WPrinterJobfile.encoding=GBKjava.specification.version=1.4user.name=cn2lx0q0java.class.path=d:mydocuments项目eclipseWTDemoi...java.vm.specification.version=1.0sun.arch.data.model=32java.home=C:ProgramFilesJavaj2re1.4.2_05java.specification.vendor=SunMicrosystemsInc.user.language=zhawt.toolkit=sun.awt.windows.WToolkitjava.vm.info=mixedmodejava.version=1.4.2_05java.ext.dirs=C:ProgramFilesJavaj2re1.4.2_05li...sun.boot.class.path=C:ProgramFilesJavaj2re1.4.2_05li...java.vendor=SunMicrosystemsInc.file.separator=java.vendor.url.bug=http://java.sun.com/cgi-bin/bugreport...sun.cpu.endian=littlesun.io.unicode.encoding=UnicodeLittlesun.cpu.isalist=pentiumi486i386
次要类与办法形貌load()从一个内部流读取属性store()将属性保留到内部流(出格是文件)getProperty()获得一个指定的属性setProperty()设置一个指定的属性list()列出这个Properties对象包括的全体“key-value”对System.getProperties()获得体系以后的情况变量
你能够如许保留一个properties文件:
Propertiesprop=newProperties();prop.setProperty("key1","value1");...FileOutputStreamout=newFileOutputStream("config.properties");prop.store(out,"--这里是文件头,能够到场正文--");
★Preferences假如我说Java内里能够不利用JNI的手腕操纵Windows的注册表你信不信?良多软件的菜单里都有“Setting”或“Preferences”如许的选项用来设定或修正软件的设置,这些设置信息能够保留到一个像下面所述的设置文件傍边,假如是Windows平台下,也大概会保留到体系注册表中。从JDK1.4入手下手,Java在java.util下到场了一个专门处置用户和体系设置信息的java.util.prefs包,个中一个类Preferences是一种对照“初级”的玩意。从实质上讲,Preferences自己是一个与平台有关的工具,但分歧的OS对它的SPI(ServiceProviderInterface)的完成倒是与平台相干的,因而,在分歧的体系中你大概看到首选项保留为当地文件、LDAP目次项、数据库条目等,像在Windows平台下,它就保留到了体系注册表中。不但云云,你还能够把首选项导出为XML文件或从XML文件导进。
次要类与办法形貌systemNodeForPackage()依据指定的Class对象失掉一个Preferences对象,这个对象的注册表路径是从“HKEY_LOCAL_MACHINE”入手下手的systemRoot()失掉以注册表路径HKEY_LOCAL_MACHINEOFTWAREJavasoftPrefs为根结点的Preferences对象userNodeForPackage()依据指定的Class对象失掉一个Preferences对象,这个对象的注册表路径是从“HKEY_CURRENT_USER”入手下手的userRoot()失掉以注册表路径HKEY_CURRENT_USEROFTWAREJavasoftPrefs为根结点的Preferences对象putXXX()设置一个属性的值,这里XXX能够为基础数值型范例,如int、long等,但首字母年夜写,暗示参数为响应的范例,也能够不写而间接用put,参数则为字符串getXXX()失掉一个属性的值exportNode()将全体首选项导出为一个XML文件exportSubtree()将部分首选项导出为一个XML文件importPreferences()从XML文件导进首选项
你能够按以下步骤保留数据:

PreferencesmyPrefs1=Preferences.userNodeForPackage(this);//这类办法是在“HKEY_CURRENT_USER”下按以后类的路径创建一个注册表项PreferencesmyPrefs2=Preferences.systemNodeForPackage(this);//这类办法是在“HKEY_LOCAL_MACHINE”下按以后类的路径创建一个注册表项PreferencesmyPrefs3=Preferences.userRoot().node("com.jungleford.demo");//这类办法是在“HKEY_CURRENT_USEROFTWAREJavasoftPrefs”下按“comjungleforddemo”的路径创建一个注册表项PreferencesmyPrefs4=Preferences.systemRoot().node("com.jungleford.demo");//这类办法是在“HKEY_LOCAL_MACHINEOFTWAREJavasoftPrefs”下按“comjungleforddemo”的路径创建一个注册表项myPrefs1.putInt("key1",10);myPrefs1.putDouble("key2",-7.15);myPrefs1.put("key3","value3");FileOutputStreamout=newFileOutputStream("prefs.xml");myPrefs1.exportNode(out);

收集I/O:Socket→RMI

★SocketSocket编程大概人人都很熟,以是就未几会商了,只是说经由过程socket把数据保留到远端服务器或从收集socket读取数据也不掉为一种值得思索的体例。

★RMIRMI机制实在就是RPC(远程历程挪用)的Java版本,它利用socket作为基础传输手腕,同时也是序列化最主要的一个使用。如今收集传输从编程的角度来看基础上都是以流的体例操纵,socket就是一个例子,将对象转换成字撙节的一个主要方针就是为了便利收集传输。设想一下传统的单机情况下的程序计划,关于Java言语的函数(办法)挪用(注重与C言语函数挪用的区分)的参数传送,会有两种情形:假如是基础数据范例,这类情形下和C言语是一样的,接纳值传送体例;假如是对象,则传送的是对象的援用,包含前往值也是援用,而不是一个完全的对象拷贝!试想一下在分歧的假造机之间举行办法挪用,即便是两个完整同名同范例的对象他们也极可能是分歧的援用!别的关于办法挪用历程,因为被挪用历程的压栈,内存“现场”完整被被挪用者占据,当被挪用办法前往时,才将挪用者的地点写回到程序计数器(PC),恢复挪用者的形态,假如是两个假造机,基本不成能用复杂压栈的体例来保留挪用者的形态。由于各种缘故原由,我们才必要创建RMI通讯实体之间的“代办署理”对象,比如“存根”就相称于远程服务器对象在客户机上的代办署理,stub就是这么来的,固然这是后话了。当地对象与远程对象(一定是物理地位上的分歧呆板,只需不是在统一个假造机内皆为“远程”)之间传送参数和前往值,大概有这么几种情况:
值传送:这又包含两种子情况:假如是基础数据范例,那末都是“可序列化”的,一切序列化成可传输的字撙节;假如是对象,并且不是“远程对象”(所谓“远程对象”是完成了java.rmi.Remote接口的对象),原本对象传送的应当是援用,但因为上述缘故原由,援用是不敷以证实对象身份的,以是传送的仍旧是一个序列化的拷贝(固然这个对象也必需满意上述“可序列化”的前提)。援用传送:能够援用传送的只能是“远程对象”。这里所谓的“援用”不要了解成了真的只是一个标记,它实际上是一个留在(客户机)当地stub中的,和远端服务器上谁人实在的对象张得千篇一律的镜像罢了!只是由于它有点“特权”(不必要经由序列化),在当地内存里已有了一个实例,真正援用的实际上是这个“孪生子”。因而可知,序列化在RMI傍边占据何等主要的位置。


数据库I/O:CMP、Hibernate

★甚么是“Persistence”用过VMWare的伴侣也许都晓得当一个guestOS正在运转的时分点击“Suspend”将假造OS挂起,它会把全部假造内存的内容保留到磁盘上,比如你为假造OS分派了128M的运转内存,那挂起今后你会在假造OS地点的目次下找到一个一样是128M的文件,这就是假造OS内存的完全镜像!这类内存的镜像手腕实在就是“Persistence”(耐久化)观点的由来。

★CMP和Hibernate由于我对J2EE的工具不是太熟习,任意找了点质料看看,以是忧虑说的不到位,此次就不作详细总结了,人要进修……真是一件疾苦的事变~~~>_<~~~

序列化再切磋

从以上手艺的会商中我们不难体味到,序列化是Java之以是可以杰出地完成其宣传的两年夜卖点——散布式(distributed)和跨平台(OSindependent)的一个主要基本。TIJ(即“ThinkinginJava”)谈到I/O体系时,把序列化称为“lightweightpersistence”——“轻量级的耐久化”,这的确很成心思。

★为何叫做“序列”化?收场白里我说更习气于把“Serialization”称为“序列化”而不是“串行化”,这是有缘故原由的。先容这个缘故原由之前先回忆一些盘算机基础的常识,我们晓得古代盘算机的内存空间都是线性编址的(甚么是“线性”晓得吧,就是一个元素只要一个独一的“先驱”和独一的“后继”,固然头尾元素是个破例;关于地点来讲,它的下一个地点固然不成能有两个,不然就乱套了),“地点”这个观点推行到数据布局,就相称于“指针”,这个在本科低年级也许就晓得了。注重了,既然是线性的,那“地点”就能够看做是内存空间的“序号”,申明它的构造是有按次的,“序号”大概说“序列号”恰是“Serialization”机制的一种表现。为何这么说呢?比如我们有两个对象a和b,分离是类A和B的实例,它们都是可序列化的,而A和B都有一个范例为C的属性,依据后面我们说过的准绳,C固然也必需是可序列化的。

importjava.io.*;...classAimplementsSerializable{Cc;...}

classBimplementsSerializable{Cc;...}

classCimplementsSerializable{...}

Aa;Bb;Cc1;...

注重,这里我们在实例化a和b的时分,成心让他们的c属性利用统一个C范例对象的援用,比如c1,那末请试想一下,但我们序列化a和b的时分,它们的c属性在内部字撙节(固然能够不单单是文件)里保留的是一份拷贝仍是两份拷贝呢?序列化在这里利用的是一品种似于“指针”的计划:它为每一个被序列化的对象标上一个“序列号”(serialnumber),但序列化一个对象的时分,假如其某个属性对象是已被序列化的,那末这里只向输入流写进该属性的序列号;从字撙节恢复被序列化的对象时,也依据序列号找到对应的流来恢复。这就是“序列化”称号的由来!这里我们看到“序列化”和“指针”是极类似的,只不外“指针”是内存空间的地点链,而序列化用的是内部流中的“序列号链”。利用“序列号”而不是内存地点来标识一个被序列化的对象,是由于从流中恢复对象到内存,其地点大概就一定是本来的地点了——我们必要的只是这些对象之间的援用干系,而不是古板的原始地位,这在RMI中就更是需要,在两台分歧的呆板之间传送对象(流),基本就不成能期望它们在两台呆板上都具有不异的内存地点。

★更天真的“序列化”:transient属性和ExternalizableSerializable的确很便利,便利到你几近不必要做任何分外的事情就能够轻松将内存中的对象保留到内部。但有两个成绩使得Serializable的能力收到束厄局促:一个是效力成绩,《CoreJava2》中指出,Serializable利用体系默许的序列化机制会影响软件的运转速率,由于必要为每一个属性的援用编号和查号,再加上I/O操纵的工夫(I/O和内存读写差的但是一个数目级的巨细),其价值固然是可不雅的。另外一个困扰是“裸”的Serializable不成定制,傻乎乎地甚么都给你序列化了,不论你是否是想这么做。实在你能够有最少三种定制序列化的选择。个中一种后面已提到了,就是在implementsSerializable的类内里增加公有的writeObject()和readObject()办法(这类Serializable就不裸了,^_^),在这两个办法里,该序列化甚么,不应序列化甚么,那就由你说了算了,你固然能够在这两个办法体内里分离挪用ObjectOutputStream.defaultWriteObject()和ObjectInputStream.defaultReadObject()仍旧实行默许的序列化举措(那你在代码上不就做无勤奋了?呵呵),也能够用ObjectOutputStream.writeObject()和ObjectInputStream.readObject()办法对你中意的属性举行序列化。但假造机一看到你界说了这两个办法,它就不再用默许的机制了。假如仅仅为了跳过某些属性不让它序列化,下面的举措仿佛显得贫苦,更复杂的办法是对不想序列化的属性加上transient关头字,申明它是个“暂态变量”,默许序列化的时分就不会把这些属性也塞到内部流里了。固然,你假如界说writeObject()和readObject()办法的化,仍旧能够把暂态变量举行序列化。题外话,像transient、violate、finally如许的关头字初学者大概会不太器重,而如今有的公司雇用就恰恰喜好问如许的成绩:(再一个计划就是不完成Serializable而改成完成Externalizable接口。我们研讨一下这两个接口的源代码,发明它们很相似,乃至简单搅浑。我们要记着的是:Externalizable默许其实不保留任何对象相干信息!任何保留和恢复对象的举措都是你本人界说的。Externalizable包括两个public的办法:
publicvoidwriteExternal(ObjectOutputout)throwsIOException;publicvoidreadExternal(ObjectInputin)throwsIOException,ClassNotFoundException;
乍一看这和下面的writeObject()和readObject()几近差未几,但Serializable和Externalizable走的是两个分歧的流程:Serializable在对象不存在的情形下,就能够仅凭内部的字节序列把全部对象重修出来;但Externalizable在重修对象时,先是挪用该类的默许机关函数(即不含参数的谁人机关函数)使得内存中先有这么一个实例,然后再挪用readExternal办法对实例中的属性举行恢复,因而,假如默许机关函数中和readExternal办法中都没有赋值的那些属性,出格他们长短基础范例的话,将会是空(null)。在这里必要注重的是,transient只能用在对Serializable而不是Externalizable的完成内里。

★序列化与克隆从“可序列化”的递回界说来看,一个序列化的对象貌似对象内存映象的内部克隆,假如没有共享援用的属性的化,那末应当是一个深度克隆。关于克隆的话题有能够谈良多,这里就不细说了,有乐趣的话能够参考IBMdeveloperWorks上的一篇文章:JAVA中的指针,援用及对象的clone

一点启发

作为一个实践的使用,我在写谁人浅易的邮件客户端JExp的时分已经对照过好几种保留Message对象(次要是几个关头属性和邮件的内容)到当地的办法,比如XML、Properties等,最初仍是选择了用序列化的体例,由于这类办法最复杂,约莫可算是“学乃至用”罢。这里“存取程序形态”实在只是一个引子话题而已,我想说的是——就好像后面我们会商的关于logging的话题一样——在Java眼前对统一个成绩你能够有良多种solution:熟习文件操纵的,你大概会以为Properties、XML或Bean对照便利,然后又发明了另有Preferences这么一个东东,也许又会感伤“天外有天”了,比及你打仗了良多种新办法今后,了局又会“异曲同工”,从头检查Serialization机制自己。这不但是Java,迷信也是一样的事理。

参考材料
CoreJava2.byCayS.Horstmann,GaryCornellJ2SE进阶.byJavaResearch.orgThinkinginJava.byBruceEckelJ2SE1.4.2Documentation.byjava.sun.comJavaNetworkProgramming.byElliotteR.HaroldJava散布式对象:RMI和CORBA.byIBMdeveloperWorks
在性能方面,在windows平台下,.net可能是占强项,要是把.net放在sun开发的操作系统上去运行呢?根本就运行不了,.net对其它操作系统的支持也很弱,性能也可能比不上java。
作者: 简单生活    时间: 2015-1-20 21:08
一直感觉JAVA很大,很杂,找不到学习方向,前两天在网上找到了这篇文章,感觉不错,给没有方向的我指了一个方向,先不管对不对,做下来再说。
作者: 若相依    时间: 2015-1-30 22:30
一直感觉JAVA很大,很杂,找不到学习方向,前两天在网上找到了这篇文章,感觉不错,给没有方向的我指了一个方向,先不管对不对,做下来再说。
作者: 兰色精灵    时间: 2015-2-1 21:22
你现在最缺的是实际的工作经验,而不是书本上那些凭空想出来的程序。
作者: 仓酷云    时间: 2015-2-6 01:57
一直感觉JAVA很大,很杂,找不到学习方向,前两天在网上找到了这篇文章,感觉不错,给没有方向的我指了一个方向,先不管对不对,做下来再说。
作者: 飘灵儿    时间: 2015-3-4 10:31
任职于太阳微系统的詹姆斯·高斯林等人于1990年代初开发Java语言的雏形,最初被命名为Oak,目标设置在家用电器等小型系统的程序语言
作者: 因胸联盟    时间: 2015-3-11 09:32
多重继承(以接口取代)等特性,增加了垃圾回收器功能用于回收不再被引用的对象所占据的内存空间,使得程序员不用再为内存管理而担忧。在 Java 1.5 版本中,Java 又引入了泛型编程(Generic Programming)、类型安全的枚举、不定长参数和自动装/拆箱等语言特性。
作者: 蒙在股里    时间: 2015-3-17 08:08
吧,现在很流行的Structs就是它的一种实现方式,不过Structs用起来实在是很繁,我们只要学习其精髓即可,我们完全可以设计自己的MVC结构。然后你再研究一下软件Refactoring (重构)和极限XP编程,相信你又会上一个台阶。 做完这些,你不如整理一下你的Java代码,把那些经典的程序和常见的应用整理出来,再精心打造一番,提高其重用性和可扩展性。你再找几个志同道合的朋友成立一个工作室吧
作者: 爱飞    时间: 2015-3-24 02:21
Java自面世后就非常流行,发展迅速,对C++语言形成了有力冲击。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于个人PC、数据中心、游戏控制台
作者: 透明    时间: 2015-3-28 01:33
Jive的资料在很多网站上都有,大家可以找来研究一下。相信你读完代码后,会有脱胎换骨的感觉。遗憾的是Jive从2.5以后就不再无条件的开放源代码,同时有licence限制。不过幸好还有中国一流的Java程序员关注它,外国人不开源了,中国人就不能开源吗?这里向大家推荐一个汉化的Jive版本—J道。Jive(J道版)是由中国Java界大名 鼎鼎的banq在Jive 2.1版本基础上改编而成, 全中文,增加了一些实用功能,如贴图,用户头像和用户资料查询等,而且有一个开发团队在不断升级。你可以访问banq的网站
作者: 第二个灵魂    时间: 2015-3-29 20:53
是一种为 Internet发展的计算机语言
作者: 灵魂腐蚀    时间: 2015-4-3 20:37
是一种简化的C++语言 是一种安全的语言,具有阻绝计算机病毒传输的功能
作者: 若天明    时间: 2015-4-6 00:52
你一定会高兴地说,哈哈,原来成为Java高手就这么简单啊!记得Tomjava也曾碰到过一个项目经理,号称Java很简单,只要三个月就可以学会。
作者: 不帅    时间: 2015-4-6 13:00
是一种由美国SUN计算机公司(Sun Microsystems, Inc.)所研究而成的语言
作者: admin    时间: 2015-4-7 18:04
自从Sun推出Java以来,就力图使之无所不包,所以Java发展到现在,按应用来分主要分为三大块:J2SE,J2ME和J2EE,这也就是Sun ONE(Open Net Environment)体系。J2SE就是Java2的标准版,主要用于桌面应用软件的编程;J2ME主要应用于嵌入是系统开发,如手机和PDA的编程;J2EE是Java2的企业版,主要用于分布式的网络程序的开发,如电子商务网站和ERP系统。
作者: 只想知道    时间: 2015-4-10 13:54
一般学编程语言都是从C语开始学的,我也不例外,但还是可能不学过程语言而直接学面向对象语言的,你是刚接触语言,还是从C开始学比较好,基础会很深点,如果你直接学习JAVA也能上手,一般大家在学语言的时候都记一些语言的关键词,常有的包和接口等。再去做逻辑代码的编写,以后的学习过程都是从逻辑代码编写中提升的,所以这方面都是经验积累的。你要开始学习就从
作者: 柔情似水    时间: 2015-4-12 09:19
Java是一种计算机编程语言,拥有跨平台、面向对java
作者: 小妖女    时间: 2015-4-13 09:21
是一种简化的C++语言 是一种安全的语言,具有阻绝计算机病毒传输的功能
作者: 山那边是海    时间: 2015-4-24 00:50
科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。




欢迎光临 仓酷云 (http://ckuyun.com/) Powered by Discuz! X3.2