仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1577|回复: 19
打印 上一主题 下一主题

[学习教程] JAVA网站制作之Java NIO API详解

[复制链接]
谁可相欹 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:40:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
诸如RMI,EJB等一些技术并不是你说的那么复杂,而是它们把一些复杂的工具封装成不复杂的工具了,理解这些工具是需要些时间。我问你,.net里有这些工具吗?要简单多少?。详解在JDK1.4之前,Java的IO操纵会合在java.io这个包中,是基于流的同步(blocking)API。关于年夜多半使用来讲,如许的API利用很便利,但是,一些对功能请求较高的使用,特别是服务端使用,常常必要一个更加无效的体例来处置IO。从JDK1.4起,NIOAPI作为一个基于缓冲区,并能供应异步(non-blocking)IO操纵的API被引进。本文对其举行深切的先容。



NIOAPI次要会合在java.nio和它的subpackages中:



java.nio

界说了Buffer及其数据范例相干的子类。个中被java.nio.channels中的类用来举行IO操纵的ByteBuffer的感化十分主要。



java.nio.channels

界说了一系列处置IO的Channel接口和这些接口在文件体系和收集通信上的完成。经由过程Selector这个类,还供应了举行异步IO操纵的举措。这个包能够说是NIOAPI的中心。



java.nio.channels.spi

界说了可用来完成channel和selectorAPI的笼统类。



java.nio.charset

界说了处置字符编码息争码的类。



java.nio.charset.spi

界说了可用来完成charsetAPI的笼统类。



java.nio.channels.spi和java.nio.charset.spi这两个包次要被用来对现有NIOAPI举行扩大,在实践的利用中,我们一样平常只和别的的3个包打交道。上面将对这3个包逐一先容。



Packagejava.nio

这个包次要界说了Buffer及其子类。Buffer界说了一个线性寄存primitivetype数据的容器接口。关于除boolean之外的其他primitivetype,都有一个响应的Buffer子类,ByteBuffer是个中最主要的一个子类。



上面这张UML类图形貌了java.nio中的类的干系:






Buffer

界说了一个能够线性寄存primitivetype数据的容器接口。Buffer次要包括了与范例(byte,char…)有关的功效。值得注重的是Buffer及其子类都不是线程平安的。



每一个Buffer都有以下的属性:



capacity

这个Buffer最多能放几数据。capacity一样平常在buffer被创立的时分指定。

limit

在Buffer长进行的读写操纵都不克不及超出这个下标。当写数据到buffer中时,limit一样平常和capacity相称,当读数据时,limit代表buffer中无效数据的长度。

position

读/写操纵确当前下标。当利用buffer的绝对地位举行读/写操纵时,读/写会从这个下标举行,并在操纵完成后,buffer会更新下标的值。

mark

一个一时寄存的地位下标。挪用mark()会将mark设为以后的position的值,今后挪用reset()会将position属性设置为mark的值。mark的值老是小于即是position的值,假如将position的值设的比mark小,以后的mark值会被丢弃失落。



这些属性老是满意以下前提:

0<=mark<=position<=limit<=capacity



limit和position的值除经由过程limit()和position()函数来设置,也能够经由过程上面这些函数来改动:



Bufferclear()

把position设为0,把limit设为capacity,一样平常在把数据写进Buffer前挪用。

Bufferflip()

把limit设为以后position,把position设为0,一样平常在从Buffer读出数据前挪用。

Bufferrewind()

把position设为0,limit稳定,一样平常在把数据重写进Buffer前挪用。



Buffer对象有多是只读的,这时候,任何对该对象的写操纵城市触发一个ReadOnlyBufferException。isReadOnly()办法能够用来判别一个Buffer是不是只读。



ByteBuffer

在Buffer的子类中,ByteBuffer是一个位置较为特别的类,由于在java.io.channels中界说的各类channel的IO操纵基础上都是环绕ByteBuffer睁开的。



ByteBuffer界说了4个static办法来做创立事情:



ByteBufferallocate(intcapacity)

创立一个指定capacity的ByteBuffer。

ByteBufferallocateDirect(intcapacity)

创立一个direct的ByteBuffer,如许的ByteBuffer在介入IO操纵时功能会更好(很有多是在底层的完成利用了DMA手艺),响应的,创立和接纳direct的ByteBuffer的价值也会高一些。isDirect()办法能够反省一个buffer是不是是direct的。

ByteBufferwrap(byte[]array)

ByteBufferwrap(byte[]array,intoffset,intlength)

把一个byte数组或byte数组的一部分包装成ByteBuffer。



ByteBuffer界说了一系列get和put操纵来从中读写byte数据,以下面几个:



byteget()

ByteBufferget(byte[]dst)

byteget(intindex)



ByteBufferput(byteb)

ByteBufferput(byte[]src)

ByteBufferput(intindex,byteb)



这些操纵可分为相对定位和绝对定为两种,绝对定位的读写操纵依托position来定位Buffer中的地位,并在操纵完成后会更新position的值。

在别的范例的buffer中,也界说了不异的函数来读写数据,独一分歧的就是一些参数和前往值的范例。



除读写byte范例数据的函数,ByteBuffer的一个出格的地方是它还界说了读写别的primitive数据的办法,如:



intgetInt()

从ByteBuffer中读出一个int值。

ByteBufferputInt(intvalue)

写进一个int值到ByteBuffer中。



读写别的范例的数据扳连到字节序成绩,ByteBuffer会按其字节序(年夜字节序或小字节序)写进或读出一个别的范例的数据(int,long…)。字节序能够用order办法来获得和设置:



ByteOrderorder()

前往ByteBuffer的字节序。

ByteBufferorder(ByteOrderbo)

设置ByteBuffer的字节序。



ByteBuffer另外一个出格的中央是能够在它的基本上失掉别的范例的buffer。如:



CharBufferasCharBuffer()

为以后的ByteBuffer创立一个CharBuffer的视图。在该视图buffer中的读写操纵会依照ByteBuffer的字节序感化到ByteBuffer中的数据上。



用这类办法创立出来的buffer会从ByteBuffer的position地位入手下手到limit地位停止,能够看做是这段数据的视图。视图buffer的readOnly属性和direct属性与ByteBuffer的分歧,并且也只要经由过程这类办法,才能够失掉其他数据范例的directbuffer。



ByteOrder

用来暗示ByteBuffer字节序的类,可将其当作java中的enum范例。次要界说了上面几个static办法和属性:



ByteOrderBIG_ENDIAN

代表年夜字节序的ByteOrder。

ByteOrderLITTLE_ENDIAN

代表小字节序的ByteOrder。

ByteOrdernativeOrder()

前往以后硬件平台的字节序。



MappedByteBuffer

ByteBuffer的子类,是文件内容在内存中的映照。这个类的实例必要经由过程FileChannel的map()办法来创立。





接上去看看一个利用ByteBuffer的例子,这个例子从尺度输出一直地读进字符,当读满一行后,将搜集的字符写到尺度输入:

publicstaticvoidmain(String[]args)

throwsIOException

{

//创立一个capacity为256的ByteBuffer

ByteBufferbuf=ByteBuffer.allocate(256);

while(true){

//从尺度输出流读进一个字符

intc=System.in.read();

//当读到输出流停止时,加入轮回

if(c==-1)

break;



//把读进的字符写进ByteBuffer中

buf.put((byte)c);

//当读完一行时,输入搜集的字符

if(c==
){

//挪用flip()使limit变成以后的position的值,position变成0,

//为接上去从ByteBuffer读取做筹办

buf.flip();

//构建一个byte数组

byte[]content=newbyte[buf.limit()];

//从ByteBuffer中读取数据到byte数组中

buf.get(content);

//把byte数组的内容写到尺度输入

System.out.print(newString(content));

//挪用clear()使position变成0,limit变成capacity的值,

//为接上去写进数据到ByteBuffer中做筹办

buf.clear();

}

}

}






Packagejava.nio.channels

这个包界说了Channel的观点,Channel体现了一个能够举行IO操纵的通道(好比,经由过程FileChannel,我们能够对文件举行读写操纵)。java.nio.channels包括了文件体系和收集通信相干的channel类。这个包经由过程Selector和SelectableChannel这两个类,还界说了一个举行异步(non-blocking)IO操纵的API,这对必要高功能IO的使用十分主要。



上面这张UML类图形貌了java.nio.channels中interface的干系:






Channel

Channel体现了一个能够举行IO操纵的通道,该interface界说了以下办法:



booleanisOpen()

该Channel是不是是翻开的。

voidclose()

封闭这个Channel,相干的资本会被开释。



ReadableByteChannel

界说了一个可从中读取byte数据的channelinterface。



intread(ByteBufferdst)

从channel中读取byte数据并写到ByteBuffer中。前往读取的byte数。



WritableByteChannel

界说了一个可向其写byte数据的channelinterface。



intwrite(ByteBuffersrc)

从ByteBuffer中读取byte数据并写到channel中。前往写出的byte数。



ByteChannel

ByteChannel并没有界说新的办法,它的感化只是把ReadableByteChannel和WritableByteChannel兼并在一同。



ScatteringByteChannel

承继了ReadableByteChannel并供应了同时往几个ByteBuffer中写数据的才能。



GatheringByteChannel

承继了WritableByteChannel并供应了同时从几个ByteBuffer中读数据的才能。



InterruptibleChannel

用来体现一个能够被异步封闭的Channel。这体现在两方面:

1.当一个InterruptibleChannel的close()办法被挪用时,别的block在这个InterruptibleChannel的IO操纵上的线程会吸收到一个AsynchronousCloseException。

2.当一个线程block在InterruptibleChannel的IO操纵上时,另外一个线程挪用该线程的interrupt()办法会招致channel被封闭,该线程收到一个ClosedByInterruptException,同时线程的interrupt形态会被设置。





接上去的这张UML类图形貌了java.nio.channels中类的干系:






异步IO

异步IO的撑持能够算是NIOAPI中最主要的功效,异步IO同意使用程序同时监控多个channel以进步功能,这一功效是经由过程Selector,SelectableChannel和SelectionKey这3个类来完成的。



SelectableChannel代表了能够撑持异步IO操纵的channel,能够将其注册在Selector上,这类注册的干系由SelectionKey这个类来体现(见UML图)。Selector这个类经由过程select()函数,给使用程序供应了一个能够同时监控多个IOchannel的办法:



使用程序经由过程挪用select()函数,让Selector监控注册在其上的多个SelectableChannel,当有channel的IO操纵能够举行时,select()办法就会前往以让使用程序反省channel的形态,并作响应的处置。



上面是JDK1.4中异步IO的一个例子,这段code利用了异步IO完成了一个timeserver:

privatestaticvoidacceptConnections(intport)throwsException{

//翻开一个Selector

SelectoracceptSelector=

SelectorProvider.provider().openSelector();



//创立一个ServerSocketChannel,这是一个SelectableChannel的子类

ServerSocketChannelssc=ServerSocketChannel.open();

//将其设为non-blocking形态,如许才干举行异步IO操纵

ssc.configureBlocking(false);



//给ServerSocketChannel对应的socket绑定IP和端口

InetAddresslh=InetAddress.getLocalHost();

InetSocketAddressisa=newInetSocketAddress(lh,port);

ssc.socket().bind(isa);



//将ServerSocketChannel注册到Selector上,前往对应的SelectionKey

SelectionKeyacceptKey=

ssc.register(acceptSelector,SelectionKey.OP_ACCEPT);



intkeysAdded=0;



//用select()函数来监控注册在Selector上的SelectableChannel

//前往值代表了有几channel能够举行IO操纵(readyforIO)

while((keysAdded=acceptSelector.select())>0){

//selectedKeys()前往一个SelectionKey的汇合,

//个中每一个SelectionKey代表了一个能够举行IO操纵的channel。

//一个ServerSocketChannel能够举行IO操纵意味着有新的TCP毗连连进了

SetreadyKeys=acceptSelector.selectedKeys();

Iteratori=readyKeys.iterator();



while(i.hasNext()){

SelectionKeysk=(SelectionKey)i.next();

//必要将处置过的key从selectedKeys这个汇合中删除

i.remove();

//从SelectionKey失掉对应的channel

ServerSocketChannelnextReady=

(ServerSocketChannel)sk.channel();

//承受新的TCP毗连

Sockets=nextReady.accept().socket();

//把以后的工夫写到这个新的TCP毗连中

PrintWriterout=

newPrintWriter(s.getOutputStream(),true);

Datenow=newDate();

out.println(now);

//封闭毗连

out.close();

}

}

}


这是个地道用于演示的例子,由于只要一个ServerSocketChannel必要监控,以是实在其实不真的必要利用到异步IO。不外正由于它的复杂,能够很简单地看分明异步IO是怎样事情的。



SelectableChannel

这个笼统类是一切撑持异步IO操纵的channel(如DatagramChannel、SocketChannel)的父类。SelectableChannel能够注册到一个或多个Selector上以举行异步IO操纵。



SelectableChannel能够是blocking和non-blocking形式(一切channel创立的时分都是blocking形式),只要non-blocking的SelectableChannel才能够介入异步IO操纵。



SelectableChannelconfigureBlocking(booleanblock)

设置blocking形式。

booleanisBlocking()

前往blocking形式。



经由过程register()办法,SelectableChannel能够注册到Selector上。



intvalidOps()

前往一个bitmask,暗示这个channel上撑持的IO操纵。以后在SelectionKey中,用静态常量界说了4种IO操纵的bit值:OP_ACCEPT,OP_CONNECT,OP_READ和OP_WRITE。

SelectionKeyregister(Selectorsel,intops)

将以后channel注册到一个Selector上并前往对应的SelectionKey。在这今后,经由过程挪用Selector的select()函数就能够监控这个channel。ops这个参数是一个bitmask,代表了必要监控的IO操纵。

SelectionKeyregister(Selectorsel,intops,Objectatt)

这个函数和上一个的意义一样,多出来的att参数会作为attachment被寄存在前往的SelectionKey中,这在必要寄存一些sessionstate的时分十分有效。

booleanisRegistered()

该channel是不是已注册在一个或多个Selector上。



SelectableChannel还供应了失掉对应SelectionKey的办法:



SelectionKeykeyFor(Selectorsel)

前往该channe在Selector上的注册干系所对应的SelectionKey。若无注册干系,前往null。



Selector

Selector能够同时监控多个SelectableChannel的IO情况,是异步IO的中心。



Selectoropen()

Selector的一个静态办法,用于创立实例。



在一个Selector中,有3个SelectionKey的汇合:

1.keyset代表了一切注册在这个Selector上的channel,这个汇合能够经由过程keys()办法拿到。

2.Selected-keyset代表了一切经由过程select()办法监测到能够举行IO操纵的channel,这个汇合能够经由过程selectedKeys()拿到。

3.Cancelled-keyset代表了已cancel了注册干系的channel,鄙人一个select()操纵中,这些channel对应的SelectionKey会从keyset和cancelled-keyset中移走。这个汇合没法间接会见。



以下是select()相干办法的申明:



intselect()

监控一切注册的channel,当个中有注册的IO操纵能够举行时,该函数前往,并将对应的SelectionKey到场selected-keyset。

intselect(longtimeout)

能够设置超时的select()操纵。

intselectNow()

举行一个当即前往的select()操纵。

Selectorwakeup()

使一个还未前往的select()操纵立即前往。



SelectionKey

代表了Selector和SelectableChannel的注册干系。



Selector界说了4个静态常量来暗示4种IO操纵,这些常量能够举行位操纵组分解一个bitmask。



intOP_ACCEPT

有新的收集毗连能够accept,ServerSocketChannel撑持这一异步IO。

intOP_CONNECT

代表毗连已创建(或堕落),SocketChannel撑持这一异步IO。

intOP_READ

intOP_WRITE

代表了读、写操纵。



以下是其次要办法:



Objectattachment()

前往SelectionKey的attachment,attachment能够在注册channel的时分指定。

Objectattach(Objectob)

设置SelectionKey的attachment。

SelectableChannelchannel()

前往该SelectionKey对应的channel。

Selectorselector()

前往该SelectionKey对应的Selector。

voidcancel()

cancel这个SelectionKey所对应的注册干系。

intinterestOps()

前往代表必要Selector监控的IO操纵的bitmask。

SelectionKeyinterestOps(intops)

设置interestOps。

intreadyOps()

前往一个bitmask,代表在响应channel上能够举行的IO操纵。



ServerSocketChannel

撑持异步操纵,对应于java.net.ServerSocket这个类,供应了TCP协定IO接口,撑持OP_ACCEPT操纵。



ServerSocketsocket()

前往对应的ServerSocket对象。

SocketChannelaccept()

承受一个毗连,前往代表这个毗连的SocketChannel对象。



SocketChannel

撑持异步操纵,对应于java.net.Socket这个类,供应了TCP协定IO接口,撑持OP_CONNECT,OP_READ和OP_WRITE操纵。这个类还完成了ByteChannel,ScatteringByteChannel和GatheringByteChannel接口。

DatagramChannel和这个类对照类似,其对应于java.net.DatagramSocket,供应了UDP协定IO接口。



Socketsocket()

前往对应的Socket对象。

booleanconnect(SocketAddressremote)

booleanfinishConnect()

connect()举行一个毗连操纵。假如以后SocketChannel是blocking形式,这个函数会比及毗连操纵完成或毛病产生才前往。假如以后SocketChannel是non-blocking形式,函数在毗连能立即被创建时前往true,不然函数前往false,使用程序必要在今后用finishConnect()办法来完成毗连操纵。



Pipe

包括了一个读和一个写的channel(Pipe.SourceChannel和Pipe.SinkChannel),这对channel能够用于历程中的通信。



FileChannel

用于对文件的读、写、映照、锁定等操纵。和映照操纵相干的类有FileChannel.MapMode,和锁定操纵相干的类有FileLock。值得注重的是FileChannel其实不撑持异步操纵。



Channels

这个类供应了一系列static办法来撑持stream类和channel类之间的互操纵。这些办法能够将channel类包装为stream类,好比,将ReadableByteChannel包装为InputStream或Reader;也能够将stream类包装为channel类,好比,将OutputStream包装为WritableByteChannel。





Packagejava.nio.charset

这个包界说了Charset及响应的encoder和decoder。上面这张UML类图形貌了这个包中类的干系,能够将个中Charset,CharsetDecoder和CharsetEncoder了解成一个AbstractFactory形式的完成:






Charset

代表了一个字符集,同时供应了factorymethod来构建响应的CharsetDecoder和CharsetEncoder。



Charset供应了以下static的办法:



SortedMapavailableCharsets()

前往以后体系撑持的一切Charset对象,用charset的名字作为set的key。

booleanisSupported(StringcharsetName)

判别该名字对应的字符集是不是被以后体系撑持。

CharsetforName(StringcharsetName)

前往该名字对应的Charset对象。



Charset中对照主要的办法有:



Stringname()

前往该字符集的标准名。

Setaliases()

前往该字符集的一切别号。

CharsetDecodernewDecoder()

创立一个对应于这个Charset的decoder。

CharsetEncodernewEncoder()

创立一个对应于这个Charset的encoder。



CharsetDecoder

将按某种字符集编码的字撙节解码为unicode字符数据的引擎。



CharsetDecoder的输出是ByteBuffer,输入是CharBuffer。举行decode操纵时一样平常按以下步骤举行:



1.挪用CharsetDecoder的reset()办法。(第一次利用时可不挪用)

2.挪用decode()办法0到n次,将endOfInput参数设为false,告知decoder有大概另有新的数据送进。

3.挪用decode()办法最初一次,将endOfInput参数设为true,告知decoder一切数据都已送进。

4.挪用decoder的flush()办法。让decoder无机会把一些外部形态写到输入的CharBuffer中。



CharsetDecoderreset()

重置decoder,并扫除decoder中的一些外部形态。

CoderResultdecode(ByteBufferin,CharBufferout,booleanendOfInput)

从ByteBuffer范例的输出中decode尽量多的字节,并将了局写到CharBuffer范例的输入中。依据decode的了局,大概前往3种CoderResult:CoderResult.UNDERFLOW暗示已没有输出能够decode;CoderResult.OVERFLOW暗示输入已满;别的的CoderResult暗示decode过程当中有毛病产生。依据前往的了局,使用程序能够接纳响应的措施,好比,增添输出,扫除输入等等,然后再次挪用decode()办法。

CoderResultflush(CharBufferout)

有些decoder会在decode的过程当中保存一些外部形态,挪用这个办法让这些decoder无机会将这些外部形态写到输入的CharBuffer中。挪用乐成前往CoderResult.UNDERFLOW。假如输入的空间不敷,该函数前往CoderResult.OVERFLOW,这时候使用程序应当扩展输入CharBuffer的空间,然后再次挪用该办法。

CharBufferdecode(ByteBufferin)

一个便利的办法把ByteBuffer中的内容decode到一个新创立的CharBuffer中。在这个办法中包含了后面提到的4个步骤,以是不克不及和前3个函数一同利用。



decode过程当中的毛病有两种:malformed-inputCoderResult暗示输出中数占有误;unmappable-characterCoderResult暗示输出中无数据没法被解码成unicode的字符。怎样处置decode过程当中的毛病取决于decoder的设置。关于这两种毛病,decoder能够经由过程CodingErrorAction设置成:

1.疏忽毛病

2.呈报毛病。(这会招致毛病产生时,decode()办法前往一个暗示该毛病的CoderResult。)

3.交换毛病,用decoder中的交换字串交换失落有毛病的部分。



CodingErrorActionmalformedInputAction()

前往malformed-input的堕落处置。

CharsetDecoderonMalformedInput(CodingErrorActionnewAction)

设置malformed-input的堕落处置。

CodingErrorActionunmappableCharacterAction()

前往unmappable-character的堕落处置。

CharsetDecoderonUnmappableCharacter(CodingErrorActionnewAction)

设置unmappable-character的堕落处置。

Stringreplacement()

前往decoder的交换字串。

CharsetDecoderreplaceWith(StringnewReplacement)

设置decoder的交换字串。



CharsetEncoder

将unicode字符数据编码为特定字符集的字撙节的引擎。其接口和CharsetDecoder相相似。



CoderResult

形貌encode/decode操纵了局的类。



CodeResult包括两个static成员:



CoderResultOVERFLOW

暗示输入已满

CoderResultUNDERFLOW

暗示输出已有数据可用。



其次要的成员函数有:



booleanisError()

booleanisMalformed()

booleanisUnmappable()

booleanisOverflow()

booleanisUnderflow()

用于判别该CoderResult形貌的毛病。



intlength()

前往毛病的长度,好比,没法被转换成unicode的字节长度。

voidthrowException()

抛出一个和这个CoderResult绝对应的exception。



CodingErrorAction

暗示encoder/decoder中毛病处置办法的类。可将其当作一个enum范例。有以下static属性:



CodingErrorActionIGNORE

疏忽毛病。

CodingErrorActionREPLACE

用交换字串交换有毛病的部分。

CodingErrorActionREPORT

呈报毛病,关于分歧的函数,有多是前往一个和毛病有关的CoderResult,也有多是抛出一个CharacterCodingException。





参考文献

DavidFlanaganCJavainaNutshell





windows系统样,他们做了什么事或者留了一些后门程序,谁都不知道,二,java开发是跨平台,任何系统上都可以运行,对于保密型系统和大型系统开发这是必要的
冷月葬花魂 该用户已被删除
沙发
发表于 2015-1-21 12:35:38 | 只看该作者
应用在电视机、电话、闹钟、烤面包机等家用电器的控制和通信。由于这些智能化家电的市场需求没有预期的高,Sun公司放弃了该项计划。随着1990年代互联网的发展
只想知道 该用户已被删除
板凳
发表于 2015-1-25 15:48:50 | 只看该作者
当然你也可以参加一些开源项目,一方面可以提高自己,另一方面也是为中国软件事业做贡献嘛!开发者在互联网上用CVS合作开发,用QQ,MSN,E-mail讨论联系,天南海北的程序员分散在各地却同时开发同一个软件,是不是很有意思呢?
分手快乐 该用户已被删除
地板
发表于 2015-2-2 22:39:09 | 只看该作者
Java是一个纯的面向对象的程序设计语言,它继承了 C++语言面向对象技术的核心。Java舍弃了C ++语言中容易引起错误的指针(以引用取代)、运算符重载(operator overloading)
精灵巫婆 该用户已被删除
5#
发表于 2015-2-6 17:10:18 | 只看该作者
Java是一种计算机编程语言,拥有跨平台、面向对java
若相依 该用户已被删除
6#
发表于 2015-2-7 20:35:29 | 只看该作者
你快去找一份Java的编程工作来做吧(如果是在校学生可以去做兼职啊),在实践中提高自己,那才是最快的。不过你得祈祷在公司里碰到一个高手,而且他 还愿意不厌其烦地教你,这样好象有点难哦!还有一个办法就是读开放源码的程序了。我们知道开放源码大都出自高手,他们设计合理,考虑周到,再加上有广大的程序员参与,代码的价值自然是字字珠叽,铿锵有力(对不起,偶最近《金装四大才子》看多了)。
小女巫 该用户已被删除
7#
发表于 2015-2-9 15:54:00 | 只看该作者
一般学编程语言都是从C语开始学的,我也不例外,但还是可能不学过程语言而直接学面向对象语言的,你是刚接触语言,还是从C开始学比较好,基础会很深点,如果你直接学习JAVA也能上手,一般大家在学语言的时候都记一些语言的关键词,常有的包和接口等。再去做逻辑代码的编写,以后的学习过程都是从逻辑代码编写中提升的,所以这方面都是经验积累的。你要开始学习就从
灵魂腐蚀 该用户已被删除
8#
发表于 2015-2-21 15:45:29 | 只看该作者
《JAVA语言程序设计》或《JAVA从入门到精通》这两本书开始学,等你编程有感觉的时候也可以回看一下。《JAVA读书笔记》这本书,因为讲的代码很多,也很容易看懂,涉及到面也到位。是你学习技术巩固的好书,学完后就看看《JAVA编程思想》这本书,找找一个自己写的代码跟书上的代码有什么不一样。
金色的骷髅 该用户已被删除
9#
发表于 2015-3-3 21:48:05 | 只看该作者
学Java必读的两个开源程序就是Jive和Pet Store.。 Jive是国外一个非常著名的BBS程序,完全开放源码。论坛的设计采用了很多先进的技术,如Cache、用户认证、Filter、XML等,而且论坛完全屏蔽了对数据库的访问,可以很轻易的在不同数据库中移植。论坛还有方便的安装和管理程序,这是我们平时编程时容易忽略的一部份(中国程序员一般只注重编程的技术含量,却完全不考虑用户的感受,这就是我们与国外软件的差距所在)。
简单生活 该用户已被删除
10#
发表于 2015-3-4 03:17:12 | 只看该作者
《JAVA语言程序设计》或《JAVA从入门到精通》这两本书开始学,等你编程有感觉的时候也可以回看一下。《JAVA读书笔记》这本书,因为讲的代码很多,也很容易看懂,涉及到面也到位。是你学习技术巩固的好书,学完后就看看《JAVA编程思想》这本书,找找一个自己写的代码跟书上的代码有什么不一样。
小妖女 该用户已被删除
11#
发表于 2015-3-8 19:25:01 | 只看该作者
是一种使用者不需花费很多时间学习的语言
再现理想 该用户已被删除
12#
发表于 2015-3-11 19:15:59 | 只看该作者
Pet Store.(宠物店)是SUN公司为了演示其J2EE编程规范而推出的开放源码的程序,应该很具有权威性,想学J2EE和EJB的朋友不要 错过了。
老尸 该用户已被删除
13#
发表于 2015-3-19 08:24:15 | 只看该作者
《JAVA语言程序设计》或《JAVA从入门到精通》这两本书开始学,等你编程有感觉的时候也可以回看一下。《JAVA读书笔记》这本书,因为讲的代码很多,也很容易看懂,涉及到面也到位。是你学习技术巩固的好书,学完后就看看《JAVA编程思想》这本书,找找一个自己写的代码跟书上的代码有什么不一样。
飘飘悠悠 该用户已被删除
14#
发表于 2015-3-22 17:46:13 | 只看该作者
是一种使网页(Web Page)产生生动活泼画面的语言
山那边是海 该用户已被删除
15#
发表于 2015-4-1 03:15:33 | 只看该作者
一直感觉JAVA很大,很杂,找不到学习方向,前两天在网上找到了这篇文章,感觉不错,给没有方向的我指了一个方向,先不管对不对,做下来再说。
变相怪杰 该用户已被删除
16#
发表于 2015-4-23 06:42:28 | 只看该作者
是一种语言,用以产生「小应用程序(Applet(s))
爱飞 该用户已被删除
17#
发表于 2015-5-6 10:10:38 | 只看该作者
你现在最缺的是实际的工作经验,而不是书本上那些凭空想出来的程序。
兰色精灵 该用户已被删除
18#
发表于 2015-6-22 17:15:18 | 只看该作者
不过,每次的执行编译后的字节码需要消耗一定的时间,这同时也在一定程度上降低了 Java 程序的运行效率。
蒙在股里 该用户已被删除
19#
发表于 2015-6-23 21:44:48 | 只看该作者
[url]http://www.jdon.com/[/url]去下载,或到同济技术论坛的服务器[url]ftp://nro.shtdu.edu.cn[/url]去下,安装上有什么问题,可以到论坛上去提问。
愤怒的大鸟 该用户已被删除
20#
发表于 2015-7-9 10:59:22 | 只看该作者
多重继承(以接口取代)等特性,增加了垃圾回收器功能用于回收不再被引用的对象所占据的内存空间,使得程序员不用再为内存管理而担忧。在 Java 1.5 版本中,Java 又引入了泛型编程(Generic Programming)、类型安全的枚举、不定长参数和自动装/拆箱等语言特性。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-5-15 17:14

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表