﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-渔人码头-文章分类-Java基础</title><link>http://www.blogjava.net/fisher/category/17939.html</link><description>天行健，君子以自强不息。地势坤，君子以厚德载物。</description><language>zh-cn</language><lastBuildDate>Mon, 12 Mar 2007 04:47:51 GMT</lastBuildDate><pubDate>Mon, 12 Mar 2007 04:47:51 GMT</pubDate><ttl>60</ttl><item><title>Java中堆和栈的区别</title><link>http://www.blogjava.net/fisher/articles/103150.html</link><dc:creator>Fisher</dc:creator><author>Fisher</author><pubDate>Sun, 11 Mar 2007 13:14:00 GMT</pubDate><guid>http://www.blogjava.net/fisher/articles/103150.html</guid><wfw:comment>http://www.blogjava.net/fisher/comments/103150.html</wfw:comment><comments>http://www.blogjava.net/fisher/articles/103150.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fisher/comments/commentRss/103150.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fisher/services/trackbacks/103150.html</trackback:ping><description><![CDATA[
		<font size="2">   栈与堆都是Java用来在Ram中存放数据的地方。与C++不同，Java自动管理栈和堆，程序员不能直接地设置栈或堆。 <br /><br />     Java的堆是一个运行时数据区,类的对象从中分配空间。这些对象通过new、newarray、anewarray和multianewarray等指令建立，它们不需要程序代码来显式的释放。堆是由垃圾回收来负责的，堆的优势是可以动态地分配内存大小，生存期也不必事先告诉编译器，因为它是在运行时动态分配内存的，Java的垃圾收集器会自动收走这些不再使用的数据。但缺点是，由于要在运行时动态分配内存，存取速度较慢。 <br /><br />     栈的优势是，存取速度比堆要快，仅次于寄存器，栈数据可以共享。但缺点是，存在栈中的数据大小与生存期必须是确定的，缺乏灵活性。栈中主要存放一些基本类型的变量（,int, short, long, byte, float, double, boolean, char）和对象句柄。 <br /><br />     栈有一个很重要的特殊性，就是存在栈中的数据可以共享。假设我们同时定义： <br />int a = 3; <br />int b = 3； <br /><br />      编译器先处理int a = 3；首先它会在栈中创建一个变量为a的引用，然后查找栈中是否有3这个值，如果没找到，就将3存放进来，然后将a指向3。接着处理int b = 3；在创建完b的引用变量后，因为在栈中已经有3这个值，便将b直接指向3。这样，就出现了a与b同时均指向3的情况。 <br /><br />      这时，如果再令a=4；那么编译器会重新搜索栈中是否有4值，如果没有，则将4存放进来，并令a指向4；如果已经有了，则直接将a指向这个地址。因此a值的改变不会影响到b的值。 <br /><br />      要注意这种数据的共享与两个对象的引用同时指向一个对象的这种共享是不同的，因为这种情况a的修改并不会影响到b, 它是由编译器完成的，它有利于节省空间。而一个对象引用变量修改了这个对象的内部状态，会影响到另一个对象引用变量。 <br /><br />String是一个特殊的包装类数据。可以用： <br />String str = new String("abc"); <br />String str = "abc"; <br /><br />      两种的形式来创建，第一种是用new()来新建对象的，它会在存放于堆中。每调用一次就会创建一个新的对象。 而第二种是先在栈中创建一个对String类的对象引用变量str，然后查找栈中有没有存放"abc"，如果没有，则将"abc"存放进栈，并令str指向”abc”，如果已经有”abc” 则直接令str指向“abc”。 <br /><br />      比较类里面的数值是否相等时，用equals()方法；当测试两个包装类的引用是否指向同一个对象时，用==，下面用例子说明上面的理论。 <br />String str1 = "abc"; <br />String str2 = "abc"; <br />System.out.println(str1==str2); //true <br />可以看出str1和str2是指向同一个对象的。 <br /><br />String str1 =new String ("abc"); <br />String str2 =new String ("abc"); <br />System.out.println(str1==str2); // false <br />用new的方式是生成不同的对象。每一次生成一个。 <br /><br /><br />     因此用第二种方式创建多个”abc”字符串,在内存中其实只存在一个对象而已. 这种写法有利与节省内存空间. 同时它可以在一定程度上提高程序的运行速度，因为JVM会自动根据栈中数据的实际情况来决定是否有必要创建新对象。而对于String str = new String("abc")；的代码，则一概在堆中创建新对象，而不管其字符串值是否相等，是否有必要创建新对象，从而加重了程序的负担。 <br /><br />      另一方面, 要注意: 我们在使用诸如String str = "abc"；的格式定义类时，总是想当然地认为，创建了String类的对象str。担心陷阱！对象可能并没有被创建！而可能只是指向一个先前已经创建的对象。只有通过new()方法才能保证每次都创建一个新的对象。 <br />由于String类的immutable性质，当String变量需要经常变换其值时，应该考虑使用StringBuffer类，以提高程序效率。 <br /><br />转自<a href="http://hi.baidu.com/liufujian/blog/item/f9a736d19fb596389b5027b8.html">http://hi.baidu.com/liufujian/blog/item/f9a736d19fb596389b5027b8.html</a></font>
<img src ="http://www.blogjava.net/fisher/aggbug/103150.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fisher/" target="_blank">Fisher</a> 2007-03-11 21:14 <a href="http://www.blogjava.net/fisher/articles/103150.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java IO</title><link>http://www.blogjava.net/fisher/articles/102008.html</link><dc:creator>Fisher</dc:creator><author>Fisher</author><pubDate>Mon, 05 Mar 2007 14:41:00 GMT</pubDate><guid>http://www.blogjava.net/fisher/articles/102008.html</guid><wfw:comment>http://www.blogjava.net/fisher/comments/102008.html</wfw:comment><comments>http://www.blogjava.net/fisher/articles/102008.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fisher/comments/commentRss/102008.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fisher/services/trackbacks/102008.html</trackback:ping><description><![CDATA[
		<p>
				<br />1、流：<br />它是通过缓冲机制将数据从生产者（如键盘、磁盘文件、内存或其他设备）传送到接受该数据的消费者（如屏幕、文件或者内存等）的这一过程的抽象。<br />2、有关的Java包：<br />Java.io包中包括许多类提供许多有关文件的各个方面操作。<br />3、有关文件名及目录名的类：File 类独立于系统平台，利用构造函数<br />File( String path)、<br />File(String path, String FileName)、<br />File(File dir, String name) 等创建出File 对象；再利用canRead() 、canWrite()、 getParent()、 getPath()等成员函数实现对文件的各个属性的操作。<br />import java.io.*;<br />public class FileTest<br />{ public static void main(String []args)<br />{<br />String FileName="C:\\temp\\myfile.dat"<br />File myFile=new File(FileName);<br />If( ! myFile. exists() )<br />{ System.err.println("Can't Find " + FileName);<br />return;<br />}<br />System.out.println("File " + FileName + "is " +myFile.length() + "bytes Long !");<br />If( myFile. isDirectory() )<br />{ System.err.println("File" + FileName +"Is a Directory !");<br />return;<br />}<br />}<br />}<br />4、有关文件内容（数据）操作的类：<br />4.1 输入输出抽象基类InputStream/OutputStream ，实现文件内容操作的基本功能函数read()、 write()、close()、skip()等；一般都是创建出其派生类对象（完成指定的特殊功能）来实现文件读写。在文件读写的编程过程中主要应该注意异常处理的技术。<br />4.2 FileInputStream/FileOutputStream：<br />用于本地文件读写（二进制格式读写并且是顺序读写，读和写要分别创建出不同的文件流对象）；<br />本地文件读写编程的基本过程为：<br />① 生成文件流对象（对文件读操作时应该为FileInputStream类，而文件写应该为FileOutputStream类）； <br />② 调用FileInputStream或FileOutputStream类中的功能函数如read()、write(int b)等）读写文件内容；<br />③ 关闭文件（close()）。<br />4.3 PipedInputStream/PipedOutputStream：<br />用于管道输入输出（将一个程序或一个线程的输出结果直接连接到另一个程序或一个线程的输入端口，实现两者数据直接传送。操作时需要连结）； <br />4.3.1 管道的连接：<br />方法之一是通过构造函数直接将某一个程序的输出作为另一个程序的输入，在定义对象时指明目标管道对象<br />PipedInputStream pInput=new PipedInputStream();<br />PipedOutputStream pOutput= new PipedOutputStream(pInput);<br />方法之二是利用双方类中的任一个成员函数 connect()相连接<br />PipedInputStream pInput=new PipedInputStream();<br />PipedOutputStream pOutput= new PipedOutputStream();<br />pinput.connect(pOutput);<br />4.3.2 管道的输入与输出：<br />输出管道对象调用write()成员函数输出数据（即向管道的输入端发送数据）；而输入管道对象调用read()成员函数可以读起数据（即从输出管道中获得数据）。这主要是借助系统所提供的缓冲机制来实现的。<br />4.4、随机文件读写：<br />RandomAccessFile类（它直接继承于Object类而非InputStream/OutputStream类），从而可以实现读写文件中任何位置中的数据（只需要改变文件的读写位置的指针）。 <br />随机文件读写编程的基本过程为：<br />① 生成流对象并且指明读写类型； <br />② 移动读写位置；<br />③ 读写文件内容；<br />④ 关闭文件。<br />StringBuffer buf=new StringBuffer();<br />char ch;<br />while( (ch=(char)System.in.read()) !='\n')<br />{<br />buf.append( ch);<br />} //读写方式可以为"r" or "rw"<br />RandomAccessFile myFileStream=new RandomAccessFile("myFile.dat"," rw"); <br />myFileStream . seek(myFileStream.length()) ;<br />myFileStream.writeBytes(buf.toString()); //将用户从键盘输入的内容添加到文件的尾部<br />myFileStream.close(); <br />4.5 DataInput/DataOutput接口：实现与机器无关的各种数据格式读写（如readChar() 、readInt()、readLong()、readFloat()，而readLine()将返回一个String）。其中RandomAccessFile类实现了该接口，具有比FileInputStream或FileOutputStream类更灵活的数据读写方式。<br />4.6 标准输入输出流：System.in（如：char c=System.in.read()）和System.out（如：System.out.println()、System.out.println()）。<br />try<br />{ char ch=System.in.read(); //返回二进制数据（低8位为键盘的ASCII码）<br />}<br />catch(IOException e)<br />{<br />}<br />4.7、文件操作的一般方法：<br />（1）生成一个输入输出文件类的对象（根据所要操作的类型）；<br />（2）调用此类的成员函数实现文件数据内容的读写；<br />（3）关闭此文件。</p>
		<p> </p>
<img src ="http://www.blogjava.net/fisher/aggbug/102008.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fisher/" target="_blank">Fisher</a> 2007-03-05 22:41 <a href="http://www.blogjava.net/fisher/articles/102008.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JSP 使用 彩色图片验证码( Servlet 生成)</title><link>http://www.blogjava.net/fisher/articles/95257.html</link><dc:creator>Fisher</dc:creator><author>Fisher</author><pubDate>Mon, 22 Jan 2007 03:50:00 GMT</pubDate><guid>http://www.blogjava.net/fisher/articles/95257.html</guid><wfw:comment>http://www.blogjava.net/fisher/comments/95257.html</wfw:comment><comments>http://www.blogjava.net/fisher/articles/95257.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fisher/comments/commentRss/95257.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fisher/services/trackbacks/95257.html</trackback:ping><description><![CDATA[起servlet服务吧 <br />首页 <br />&lt;img src="RandomCodeCtrl"/&gt; <br /><br />web.xml <br />&lt;servlet&gt; <br />&lt;servlet-name&gt;RandomCodeCtrl&lt;/servlet-name&gt; <br />&lt;servlet-class&gt;com.chainway.util.RandomCodeCtrl&lt;/servlet-class&gt; <br />&lt;load-on-startup&gt;4&lt;/load-on-startup&gt; <br />&lt;/servlet&gt; <br />&lt;servlet-mapping&gt; <br />&lt;servlet-name&gt;RandomCodeCtrl&lt;/servlet-name&gt; <br />&lt;url-pattern&gt;/RandomCodeCtrl&lt;/url-pattern&gt; <br />&lt;/servlet-mapping&gt; <br /><br />RandomCodeCtrl: <br />package com.chainway.util; <br /><br />import java.io.IOException; <br />import javax.servlet.ServletException; <br />import javax.servlet.http.HttpServlet; <br />import javax.servlet.http.HttpServletRequest; <br />import javax.servlet.http.HttpServletResponse; <br /><br />public class RandomCodeCtrl extends HttpServlet { <br />private static final long serialVersionUID = 1L; <br />protected void doGet(HttpServletRequest req,HttpServletResponse resp) throws ServletException, IOException { <br />resp.setContentType("image/jpeg"); <br />resp.setHeader("Pragma","No-cache"); <br />resp.setHeader("Cache-Control","no-cache"); <br />resp.setDateHeader("Expires", 0); <br />RandomCode rc = new RandomCode(); <br />try{ <br />rc.getRandcode(req,resp); <br />}catch(Exception e){ <br />System.err.println(e); <br />} <br />} <br />public void doPost(HttpServletRequest request, HttpServletResponse response) <br />throws ServletException, IOException { <br />doGet(request, response); <br />} <br />} <br /><br />//生成类 <br />//数字文字图片验证码 <br />package com.chainway.util; <br /><br />import java.awt.Color; <br />import java.awt.Font; <br />import java.awt.Graphics; <br />import java.awt.image.BufferedImage; <br />import java.util.Random; <br />import javax.imageio.ImageIO; <br />import javax.servlet.http.HttpServletRequest; <br />import javax.servlet.http.HttpServletResponse; <br />import javax.servlet.http.HttpSession; <br />public class RandomCode { <br />/** <br />* 随机取得一个字体 <br />* @param Random random 随机数 <br />* @return Font 返回一个新字体 <br />*/ <br />private synchronized Font getsFont(Random random){ <br />return new Font("Fixedsys",Font.CENTER_BASELINE,18); <br />} <br />/** <br />* 返回一个随机颜色 <br />* @param int fc 随机数 <br />* @param int bc 随机数 <br />* @param Random random 随机数 <br />* @return Color 返回一个新颜色 <br />*/ <br />synchronized Color getRandColor(int fc,int bc,Random random){ <br />if(fc&gt;255) fc=255; <br />if(bc&gt;255) bc=255; <br />int r=fc+random.nextInt(bc-fc-6); <br />int g=fc+random.nextInt(bc-fc-4); <br />int b=fc+random.nextInt(bc-fc-8); <br />return new Color(r,g,b); <br />} <br />/** <br />* 生成随机数图片 <br />*/ <br />public synchronized void getRandcode(HttpServletRequest request,HttpServletResponse response)throws Exception{ <br />System.setProperty("java.awt.headless","true"); <br />HttpSession session = request.getSession(); <br />int width=80, height=26;//设置图片大小 <br />BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); <br />Graphics g = image.getGraphics(); <br />Random random = new Random(); <br />g.fillRect(0, 0, width, height);//设定边框 <br />g.setFont(new Font("Times New Roman",Font.ROMAN_BASELINE,18)); <br />g.setColor(getRandColor(111,133,random)); <br />//产生随机线 <br />for (int i=0;i&lt;11;i++){ <br />int x = random.nextInt(width); <br />int y = random.nextInt(height); <br />int xl = random.nextInt(13); <br />int yl = random.nextInt(15); <br />g.drawLine(x,y,x+xl,y+yl); <br />} <br />//产生随机点 <br />g.setColor(getRandColor(130,150,random)); <br />//产生5个随机数 <br />String sRand=""; <br />for (int i=0;i&lt;5;i++){ <br />g.setFont(getsFont(random)); <br />g.setColor(new Color(random.nextInt(101),random.nextInt(111),random.nextInt(121))); <br />//String rand=String.valueOf(getRandomString(random.nextInt(36))); <br />String rand=String.valueOf(getRandomString(random.nextInt(10))); <br />sRand+=rand; <br />g.translate(random.nextInt(3),random.nextInt(3)); <br />g.drawString(rand,13*i,16); <br />} <br />session.removeAttribute("Rand"); <br />session.setAttribute("Rand",sRand); <br />g.dispose(); <br />ImageIO.write(image, "JPEG", response.getOutputStream()); <br />} <br /><br />public synchronized String getRandomString(int num){ <br />String randstring = "0123456789"; <br />//String randstring = "0123456789abcdefghijklmnopqrstuvwxyz"; <br />return String.valueOf(randstring.charAt(num)); <br />} <br /><br />} <br /><br />//登陆判断方法 <br />从session里面取验证码数字进行比较<img src ="http://www.blogjava.net/fisher/aggbug/95257.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fisher/" target="_blank">Fisher</a> 2007-01-22 11:50 <a href="http://www.blogjava.net/fisher/articles/95257.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>