﻿<?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>C++博客-奇奇的空间-文章分类-JAVA</title><link>http://www.cppblog.com/jjbird/category/705.html</link><description>奇奇的空间</description><language>zh-cn</language><lastBuildDate>Tue, 20 May 2008 08:00:43 GMT</lastBuildDate><pubDate>Tue, 20 May 2008 08:00:43 GMT</pubDate><ttl>60</ttl><item><title>JDBC如何操作long/long raw/blob/clob数据类型 </title><link>http://www.cppblog.com/jjbird/articles/6763.html</link><dc:creator>奇奇</dc:creator><author>奇奇</author><pubDate>Mon, 08 May 2006 08:54:00 GMT</pubDate><guid>http://www.cppblog.com/jjbird/articles/6763.html</guid><wfw:comment>http://www.cppblog.com/jjbird/comments/6763.html</wfw:comment><comments>http://www.cppblog.com/jjbird/articles/6763.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jjbird/comments/commentRss/6763.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jjbird/services/trackbacks/6763.html</trackback:ping><description><![CDATA[
		<p>  如何写long和long raw类型</p>
		<p>  代码:<br />     case Types.LONGVARCHAR:<br />                java.io.StringReader long_var =<br />                    new java.io.StringReader(oldval.toString());<br />                stmt.setCharacterStream(pos,long_var,32768);<br />                return;<br />            case Types.LONGVARBINARY:<br />                java.io.File os_file = new java.io.File(oldval.toString());<br />                if (os_file.exists() &amp;&amp; os_file.isFile() &amp;&amp; os_file.canRead())<br />                {<br />                    try {<br />                        java.io.FileInputStream long_bin =<br />                            new java.io.FileInputStream(os_file);<br />                        stmt.setBinaryStream(pos,long_bin,(int)(os_file.length()));<br />                    } catch (java.io.IOException ioe) {}<br />                }<br />                else<br />                    stmt.setNull(pos,1);<br />                return;<br />                  __________________<br />   </p>
		<p>                  如何操作BLOB/CLOB类型<br />                  ============================<br />                  操作blob/clob时，先用select lobfld from tab where ... for <br />                  update，取得java.sql.Blob或javq.sql.Clob类型</p>
		<p>
				<br />  代码:<br />  stmt = prepareStatement(Database,p_query,variable_table);<br />            stmt.bind(variable_table);<br />            rset = stmt.stmt.executeQuery();<br />            java.sql.ResultSetMetaData rsetmeta = rset.getMetaData();<br />            if (rset.next())<br />            {<br />                if (rsetmeta.getColumnType(1) == java.sql.Types.CLOB)<br />                {<br />                    java.sql.Clob clob = rset.getClob(1);<br />                    long offs = 0;<br />                    if (clob != null)<br />                    {<br />                        char[] long_buf=new char[8192];<br />                        try {<br />                            int len=0;<br />                            clob.truncate(offs);    <br />                            java.io.Writer long_out = clob.setCharacterStream(0);<br />                            java.io.FileReader long_file = new java.io.FileReader(os_file);<br />                            while((len = long_file.read(long_buf))&gt;0)<br />                            {<br />                                long_out.write(long_buf,0,len);<br />                                offs = offs + len;<br />                            }<br />                            long_file.close();<br />                            long_out.close();<br />                        } <br />                         catch ( java.io.IOException ioe)<br />                        {<br />                            log.println(ioe.getMessage());<br />                        }<br />                    }<br />                }<br />                else if (rsetmeta.getColumnType(1) == java.sql.Types.BLOB)<br />                {<br />                    java.sql.Blob blob = rset.getBlob(1);<br />                    if (blob != null)<br />                    {<br />                        byte[] long_buf=new byte[8192];<br />                        long offs = 0;<br />                        try {<br />                            int len=0;<br />                            blob.truncate(offs);<br />                            java.io.OutputStream long_out = blob.setBinaryStream(0);<br />                            java.io.FileInputStream long_file = new java.io.FileInputStream(os_file);<br />                            while((len = long_file.read(long_buf))&gt;0)<br />                            {<br />                                long_out.write(long_buf,0,len);<br />                                offs = offs + len;<br />                            }<br />                            long_file.close();<br />                            long_out.close();<br />                        } <br />                         catch ( java.io.IOException ioe)<br />                        {<br />                            log.println(ioe.getMessage());<br />                        }<br />                    }<br />                }<br />                data = getMessage(jdbc_cfg,"JDBC.COMMAND.COMPLETED");<br />                log.println(data.getColumn(1));<br />            }<br />            else<br />            {<br />                log.println("0 "+jdbc_cfg.getNLSString("JDBC.COMMAND.ROWSSELECTED"));<br />            }<br />        }<br />                  __________________<br />       <br />                  如何读取long/longraw/blob/clob中的数据？</p>
		<p>  代码:<br />     stmt = prepareStatement(Database,p_query,variable_table);<br />            stmt.bind(variable_table);<br />            rset = stmt.stmt.executeQuery();<br />            java.sql.ResultSetMetaData rsetmeta = rset.getMetaData();<br />            if (rset.next())<br />            {<br />                if (rsetmeta.getColumnType(1) == java.sql.Types.LONGVARCHAR)<br />                {<br />                    java.io.Reader long_out = rset.getCharacterStream(1);<br />                    if (long_out != null)<br />                    {<br />                        char[] long_buf=new char[8192];<br />                        try {<br />                            int len=0;<br />                            java.io.FileWriter long_file = new java.io.FileWriter(os_file);<br />                            while((len = long_out.read(long_buf))&gt;0)<br />                                long_file.write(long_buf,0,len);<br />                            long_file.close();<br />                            long_out.close();<br />                        } <br />                         catch ( java.io.IOException ioe)<br />                        {<br />                            log.println(ioe.getMessage());<br />                        }<br />                    }<br />                }<br />                else if (rsetmeta.getColumnType(1) == java.sql.Types.LONGVARBINARY)<br />                {<br />                    java.io.InputStream long_out = rset.getBinaryStream(1);<br />                    if (long_out != null)<br />                    {<br />                        byte[] long_buf=new byte[8192];<br />                        try {<br />                            int len=0;<br />                            java.io.FileOutputStream long_file = new java.io.FileOutputStream(os_file);<br />                            while((len = long_out.read(long_buf))&gt;0)<br />                                long_file.write(long_buf,0,len);<br />                            long_file.close();<br />                            long_out.close();<br />                        } <br />                         catch ( java.io.IOException ioe)<br />                        {<br />                            log.println(ioe.getMessage());<br />                        }<br />                    }<br />                }<br />                else if (rsetmeta.getColumnType(1) == java.sql.Types.CLOB)<br />                {<br />                    java.sql.Clob clob = rset.getClob(1);<br />                    if (clob != null)<br />                    {<br />                        java.io.Reader long_out = clob.getCharacterStream();<br />                        if (long_out != null)<br />                        {<br />                            char[] long_buf=new char[8192];<br />                            try {<br />                                int len=0;<br />                                java.io.FileWriter long_file = new java.io.FileWriter(os_file);<br />                                while((len = long_out.read(long_buf))&gt;0)<br />                                    long_file.write(long_buf,0,len);<br />                                long_file.close();<br />                                long_out.close();<br />                            } <br />                             catch ( java.io.IOException ioe)<br />                            {<br />                                log.println(ioe.getMessage());<br />                            }<br />                        }<br />                    }<br />                }<br />                else if (rsetmeta.getColumnType(1) == java.sql.Types.BLOB)<br />                {<br />                    java.sql.Blob blob = rset.getBlob(1);<br />                    if (blob != null)<br />                    {<br />                        java.io.InputStream long_out = blob.getBinaryStream();<br />                        if (long_out != null)<br />                        {<br />                            byte[] long_buf=new byte[8192];<br />                            try {<br />                                int len=0;<br />                                java.io.FileOutputStream long_file = new java.io.FileOutputStream(os_file);<br />                                while((len = long_out.read(long_buf))&gt;0)<br />                                    long_file.write(long_buf,0,len);<br />                                long_file.close();<br />                                long_out.close();<br />                            } <br />                             catch ( java.io.IOException ioe)<br />                            {<br />                                log.println(ioe.getMessage());<br />                            }<br />                        }<br />                    }<br />                }<br />                data = getMessage(jdbc_cfg,"JDBC.COMMAND.COMPLETED");<br />                log.println(data.getColumn(1));<br />            }<br />            else<br />            {<br />                log.println("0 "+jdbc_cfg.getNLSString("JDBC.COMMAND.ROWSSELECTED"));<br />            }<br />                  __________________<br />  </p>
<img src ="http://www.cppblog.com/jjbird/aggbug/6763.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jjbird/" target="_blank">奇奇</a> 2006-05-08 16:54 <a href="http://www.cppblog.com/jjbird/articles/6763.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java的输入输出流</title><link>http://www.cppblog.com/jjbird/articles/6760.html</link><dc:creator>奇奇</dc:creator><author>奇奇</author><pubDate>Mon, 08 May 2006 08:52:00 GMT</pubDate><guid>http://www.cppblog.com/jjbird/articles/6760.html</guid><wfw:comment>http://www.cppblog.com/jjbird/comments/6760.html</wfw:comment><comments>http://www.cppblog.com/jjbird/articles/6760.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jjbird/comments/commentRss/6760.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jjbird/services/trackbacks/6760.html</trackback:ping><description><![CDATA[
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td valign="top" width="421">
										<div align="left">
												<p>Java语言的输入输出功能是十分强大而灵活的，美中不足的是看上去输入输出的代码并不是很简洁，因为你往往需要包装许多不同的对象。在Java类库中，<a class="bluekey" href="http://www.yesky.com/key/938/160938.html" target="_blank"><font color="#000000">IO</font></a>部分的内容是很庞大的，因为它涉及的领域很广泛:标准输入输出，文件的操作，网络上的数据流，字符串流，对象流，zip文件流....本文的目的是为大家做一个简要的介绍。</p>
												<p align="left">　　流是一个很形象的概念，当程序需要读取数据的时候，就会开启一个通向数据源的流，这个数据源可以是文件，内存，或是网络连接。类似的，当程序需要写入数据的时候，就会开启一个通向目的地的流。这时候你就可以想象数据好像在这其中“流”动一样，如下图：</p>
										</div>
								</td>
						</tr>
						<tr>
								<td colspan="2" height="20">
										<p>
												<br />
										</p>
								</td>
						</tr>
				</tbody>
		</table>
		<p align="center">
				<img height="108" alt=" " onerror="function anonymous()&#xD;&#xA;{&#xD;&#xA;this.src='http://www.yesky.com/image20010518/42132.gif';&#xD;&#xA;}" hspace="3" src="http://www.java3z.com/cwbwebhome/article/article2/images/42132.gif" width="438" align="center" vspace="1" border="1" />
		</p>
		<p align="center">
				<img height="108" alt=" " onerror="function anonymous()&#xD;&#xA;{&#xD;&#xA;this.src='http://www.yesky.com/image20010518/42133.gif';&#xD;&#xA;}" hspace="3" src="http://www.java3z.com/cwbwebhome/article/article2/images/42133.gif" width="429" align="center" vspace="1" border="1" />
		</p>
		<p align="left">　　Java中的流分为两种，一种是字节流，另一种是字符流，分别由四个抽象类来表示（每种流包括输入和输出两种所以一共四个）:InputStream，OutputStream，Reader，Writer。Java中其他多种多样变化的流均是由它们派生出来的:</p>
		<p align="center">
				<img height="199" alt=" " onerror="function anonymous()&#xD;&#xA;{&#xD;&#xA;this.src='http://www.yesky.com/image20010518/42134.gif';&#xD;&#xA;}" hspace="3" src="http://www.java3z.com/cwbwebhome/article/article2/images/42134.gif" width="462" align="center" vspace="1" border="1" />
				<br />
				<br />
				<img height="142" alt=" " onerror="function anonymous()&#xD;&#xA;{&#xD;&#xA;this.src='http://www.yesky.com/image20010518/42135.gif';&#xD;&#xA;}" hspace="3" src="http://www.java3z.com/cwbwebhome/article/article2/images/42135.gif" width="458" align="center" vspace="1" border="1" />
		</p>
		<p align="center">
				<img height="169" alt=" " onerror="function anonymous()&#xD;&#xA;{&#xD;&#xA;this.src='http://www.yesky.com/image20010518/42136.gif';&#xD;&#xA;}" hspace="3" src="http://www.java3z.com/cwbwebhome/article/article2/images/42136.gif" width="462" align="center" vspace="1" border="1" />
		</p>
		<p align="center">
				<img height="222" alt=" " onerror="function anonymous()&#xD;&#xA;{&#xD;&#xA;this.src='http://www.yesky.com/image20010518/42137.gif';&#xD;&#xA;}" hspace="3" src="http://www.java3z.com/cwbwebhome/article/article2/images/42137.gif" width="465" align="center" vspace="1" border="1" />
		</p>
		<p align="left">　　在这其中InputStream和OutputStream在早期的Java版本中就已经存在了，它们是基于字节流的，而基于字符流的Reader和Writer是后来加入作为补充的。以上的层次图是Java类库中的一个基本的层次体系。</p>
		<p align="left">　　在这四个抽象类中，InputStream和Reader定义了完全相同的接口：</p>
		<table class="code" cellspacing="2" cellpadding="0" width="100%" bgcolor="#ffffff" border="0">
				<tbody>
						<tr>
								<td>
										<font color="#0000ff">
												<span class="unnamed1">int</span>
										</font>
										<span class="unnamed1"> read（）<br /><font color="#0000ff">int</font> read（<font color="#0000ff">char</font> cbuf[]）<br /><font color="#0000ff">int</font> read（<font color="#0000ff">char</font> cbuf[], <font color="#0000ff">int </font>offset, <font color="#0000ff">int</font> length）</span>
								</td>
						</tr>
				</tbody>
		</table>
		<p align="left">　　而OutputStream和Writer也是如此：</p>
		<table class="code" cellspacing="2" cellpadding="0" width="100%" bgcolor="#ffffff" border="0">
				<tbody>
						<tr>
								<td>
										<font color="#0000ff">
												<span class="unnamed1">int</span>
										</font>
										<span class="unnamed1"> write（<font color="#0000ff">int</font> c）<br /><font color="#0000ff">int</font> write（<font color="#0000ff">char</font> cbuf[]）<br /><font color="#0000ff">int</font> write（<font color="#0000ff">char</font> cbuf[], <font color="#0000ff">int</font> offset, <font color="#0000ff">int</font> length）</span>
								</td>
						</tr>
				</tbody>
		</table>
		<p align="left">　　这六个方法都是最基本的，read（）和write（）通过方法的重载来读写一个字节，或者一个字节数组。</p>
		<p align="left">　　更多灵活多变的功能是由它们的子类来扩充完成的。知道了Java输入输出的基本层次结构以后，本文在这里想给大家一些以后可以反复应用例子，对于所有子类的细节及其功能并不详细讨论。</p>
		<table class="code" cellspacing="2" cellpadding="0" width="100%" bgcolor="#ffffff" border="0">
				<tbody>
						<tr>
								<td>
										<div align="center">
												<p align="left">
														<font color="#0000ff">
																<span class="unnamed1">import</span>
														</font>
														<span class="unnamed1"> java.io.*；</span>
												</p>
										</div>
										<ol>
												<div align="left">
														<p class="unnamed1" align="left">
																<font color="#0000ff">public class</font> IOStreamDemo {<br /><br />      <font color="#0000ff">public void</font> samples（） throws IOException {</p>
														<p align="left">
																<span class="unnamed1">           <font color="#006600">//1. 这是从键盘读入一行数据,返回的是一个字符串</font><br />           <font color="#ff0000">BufferedReader</font> stdin =<font color="#0000ff"><a class="bluekey" href="http://www.yesky.com/key/1252/161252.html" target="_blank">new</a></font> BufferedReader（new InputStreamReader（System.in））； <br />           <font color="#ff0000">System</font>.out.print（<font color="#ff00ff">"Enter a line:"</font>）；<br />           <font color="#ff0000">System</font>.out.println（stdin.readLine（））；</span>
														</p>
														<p class="unnamed1" align="left">           <font color="#006600">//2. 这是从文件中逐行读入数据 </font></p>
														<p class="unnamed1" align="left">           <font color="#ff0000">BufferedReader</font> in = <font color="#0000ff">new</font> BufferedReader（<font color="#0000ff">new</font> FileReader（<font color="#ff00ff">"IOStreamDemo.java"</font>））；<br />           <font color="#0000ff">String</font> s, s2 = <font color="#0000ff">new</font> String（）；<br />           <font color="#0000ff">while</font>（（s = in.readLine（））!= <font color="#0000ff">null</font>）<br />                      s2 += s + <font color="#ff00ff">"\n"</font>；<br />           in.close（）；<br /></p>
														<p class="unnamed1" align="left">           <font color="#006600">//3. 这是从一个字符串中逐个读入字节 </font><br />           <font color="#ff0000">StringReader</font> in1 = <font color="#0000ff">new</font> StringReader（s2）；<br />           <font color="#0000ff">int</font> c；<br />           <font color="#0000ff">while</font>（（c = in1.read（）） != -1）<br />                      <font color="#ff0000">System</font>.out.print（（char）c）；<br /></p>
														<p align="left">
																<span class="unnamed1">           <font color="#006600">//4. 这是将一个字符串写入文件 </font><br />           <font color="#0000ff">try</font> {<br />                      <font color="#ff0000">BufferedReader</font> in2 = <font color="#0000ff">new</font> BufferedReader（new StringReader（s2））；<br />                      <font color="#ff0000">PrintWriter</font> out1 = <font color="#000000">new</font> PrintWriter（new BufferedWriter（new FileWriter（<font color="#ff00ff">"IODemo.out"</font>）））；<br />                      <font color="#0000ff">int</font> lineCount = 1；<br />                      <font color="#0000ff">while</font>（（s = in2.readLine（）） != <font color="#0000ff">null</font> ）<br />                                 out1.println（lineCount++ + <font color="#ff00ff">": "</font> + s）；<br />                      out1.close（）；<br />           } <font color="#0000ff">catch</font>（EOFException e） {<br />                      <font color="#ff0000">System</font>.err.println（<font color="#ff00ff">"End of stream"</font>）；<br />           }<br />      } </span>
														</p>} </div>
										</ol>
								</td>
						</tr>
				</tbody>
		</table>
		<p align="left">　　对于上面的例子，需要说明的有以下几点：</p>
		<div>
		</div>
		<div align="center">
				<p align="left">　　1.<font color="#ff0000"> BufferedReader</font>是<font color="#ff0000">Reader</font>的一个子类，它具有缓冲的作用，避免了频繁的从物理设备中读取信息。它有以下两个构造函数：</p>
				<table class="code" cellspacing="2" cellpadding="0" width="100%" bgcolor="#ffffff" border="0">
						<tbody>
								<tr>
										<td>
												<font color="#ff0000">
														<span class="unnamed1">BufferedReader</span>
												</font>
												<span class="unnamed1">（<font color="#0000ff">Reader</font> in） <br /><font color="#ff0000">BufferedReader</font>（<font color="#0000ff">Reader</font> in, <font color="#0000ff">int</font> sz） </span>
										</td>
								</tr>
						</tbody>
				</table>
				<p align="left">　　这里的sz是指定缓冲区的大小。</p>
				<p align="left">　　它的基本方法：</p>
				<table class="code" cellspacing="2" cellpadding="0" width="100%" bgcolor="#ffffff" border="0">
						<tbody>
								<tr>
										<td>
												<font color="#0000ff">
														<span class="unnamed1">void</span>
												</font>
												<span class="unnamed1">
														<font color="#000000"> close（</font>） <font color="#006600">//关闭流 </font><br /><br />           <font color="#0000ff">void </font>mark（int readAheadLimit）<font color="#006600"> //标记当前位置</font><br /><br />           <font color="#0000ff">boolean</font> markSupported（） <font color="#006600">//是否支持标记</font><br /><br />           <font color="#0000ff">int</font> read（） <font color="#006600">//继承自Reader的基本方法</font><br /><br />           <font color="#0000ff">int</font> read（<font color="#0000ff">char</font>[] cbuf, <font color="#0000ff">int</font> off,<font color="#000000"><font color="#0000ff">int</font></font> len） <font color="#006600">//继承自Reader的基本方法</font><br /><br />           <font color="#0000ff">String</font> readLine（） <font color="#006600">//读取一行内容并以字符串形式返回</font><br /><br />           <font color="#0000ff">boolean</font> ready（） <font color="#006600">//判断流是否已经做好读入的准备</font><br /><br />           <font color="#0000ff">void</font> reset（） <font color="#006600">//重设到最近的一个标记</font><br /><br />           <font color="#0000ff">long</font> skip（<font color="#0000ff">long</font> n） <font color="#006600">//跳过指定个数的字符读取</font></span>
										</td>
								</tr>
						</tbody>
				</table>
				<p align="left">　　2. <font color="#000000">InputStreamReader</font>是<font color="#000000">InputStream</font>和<font color="#000000">Reader</font>之间的桥梁，由于System.in是字节流，需要用它来包装之后变为字符流供给             <font color="#ff0000">BufferedReader</font>使用。<br /></p>
				<p align="left">　　3. <font color="#0000ff">PrintWriter</font> out1 = <font color="#0000ff">new</font> PrintWriter（<font color="#0000ff">new</font> BufferedWriter（<font color="#0000ff">new</font> FileWriter（<font color="#ff00ff">"IODemo.out"</font>）））；</p>
				<p align="left">　　这句话体现了Java输入输出系统的一个特点，为了达到某个目的，需要包装好几层。首先，输出目的地是文件IODemo.out，所以最内层包装的是FileWriter，建立一个输出文件流，接下来，我们希望这个流是缓冲的，所以用<font color="#ff0000">BufferedWriter</font>来包装它以达到目的，最后，我们需要格式化输出结果，于是将<font color="#ff0000">PrintWriter</font>包在最外层。<br /></p>
				<p align="left">　　Java提供了这样一个功能，将标准的输入输出流转向，也就是说，我们可以将某个其他的流设为标准输入或输出流，看下面这个例子：</p>
				<table class="code" cellspacing="2" cellpadding="0" width="100%" bgcolor="#ffffff" border="0">
						<tbody>
								<tr>
										<td>
												<p align="left">
														<font color="#0000ff">
																<span class="unnamed1">import</span>
														</font>
														<span class="unnamed1"> java.io.*；</span>
												</p>
												<p class="unnamed1" align="left">
														<font color="#0000ff">public class</font> Redirecting {<br /><font color="#0000ff"><br />       public static void </font>main（<font color="#0000ff">String</font>[] args） throws <font color="#ff0000">IOException</font> {<br />              <font color="#0000ff">PrintStream</font> console = System.out；<br />              <font color="#0000ff">BufferedInputStream</font> in = <font color="#0000ff">new</font><font color="#ff0000">BufferedInputStream</font>（ <font color="#0000ff">new</font><font color="#ff0000"> FileInputStream</font>（ <font color="#ff00ff">"Redirecting.java"</font>））；<br />              <font color="#0000ff">PrintStream</font> out =<font color="#0000ff"> new</font><font color="#ff0000">PrintStream</font>（ new <font color="#ff0000">BufferedOutputStream</font>（<font color="#0000ff"> new FileOutputStream</font>（<font color="#ff00ff">"test.out"</font>）））；<br />              System.setIn（in）；<br />              System.setOut（out）；</p>
												<p align="left">
														<span class="unnamed1">              <font color="#ff0000">BufferedReader</font> br = <font color="#0000ff">new</font><font color="#ff0000">BufferedReader</font>（ <font color="#0000ff">new</font><font color="#ff0000">InputStreamReader</font>（System.in））；<br />              <font color="#0000ff">String</font> s；<br />              <font color="#0000ff">while</font>（（s = br.readLine（）） !=<font color="#0000ff"> null</font>）<br />                     System.out.println（s）；<br />              out.close（）； <br />              System.setOut（console）；<br />      } <br />}</span>
												</p>
										</td>
								</tr>
						</tbody>
				</table>
				<p align="left">　　在这里java.lang.System的静态方法</p>
				<table class="code" cellspacing="2" cellpadding="0" width="100%" bgcolor="#ffffff" border="0">
						<tbody>
								<tr>
										<td>
												<font color="#0000ff">
														<span class="unnamed1">static void</span>
												</font>
												<span class="unnamed1"> setIn（InputStream in） <br /><font color="#0000ff">static void</font> setOut（PrintStream out） </span>
										</td>
								</tr>
						</tbody>
				</table>
				<p align="left">　　提供了重新定义标准输入输出流的方法，这样做是很方便的，比如一个程序的结果有很多，有时候甚至要翻页显示，这样不便于观看结果，这是你就可以将标准输出流定义为一个文件流，程序运行完之后打开相应的文件观看结果，就直观了许多。</p>
				<p align="left">　　Java流有着另一个重要的用途，那就是利用对象流对对象进行序列化。下面将开始介绍这方面的问题。</p>
				<p align="left">　　在一个程序运行的时候，其中的变量数据是保存在内存中的，一旦程序结束这些数据将不会被保存，一种解决的办法是将数据写入文件，而Java中提供了一种机制，它可以将程序中的对象写入文件，之后再从文件中把对象读出来重新建立。这就是所谓的对象序列化Java中引入它主要是为了RMI（Remote Method Invocation）和<a class="bluekey" href="http://www.yesky.com/key/4445/149445.html" target="_blank">Java Bean</a>所用，不过在平时应用中，它也是很有用的一种技术。</p>
				<p align="left">　　所有需要实现对象序列化的对象必须首先实现Serializable接口。下面看一个例子：</p>
				<table class="code" cellspacing="2" cellpadding="0" width="100%" bgcolor="#ffffff" border="0">
						<tbody>
								<tr>
										<td>
												<p align="left">
														<font color="#0000ff">
																<span class="unnamed1">import</span>
														</font>
														<span class="unnamed1"> java.io.*；<br /><font color="#0000ff">import</font> java.util.*；</span>
												</p>
												<p class="unnamed1" align="left">
														<font color="#0000ff">public class</font>
														<a class="bluekey" href="http://www.yesky.com/key/833/160833.html" target="_blank">Logon</a> implements Serializable {<br /><br />       <font color="#0000ff">private Date</font> date = <font color="#0000ff">new</font> Date（）；<br />       <font color="#0000ff">private String</font> username；<br />       <font color="#0000ff">private transient String</font> password；</p>
												<p class="unnamed1" align="left">
														<br />       Logon（<font color="#0000ff">String</font><a class="bluekey" href="http://www.yesky.com/key/99/160099.html" target="_blank">name</a>, <font color="#0000ff">String</font> pwd） {<br />              username = name；<br />              password = pwd；<br />       }</p>
												<p class="unnamed1" align="left">
														<br />       <font color="#0000ff">public String</font> toString（） {<br />              <font color="#0000ff">String</font> pwd = （password == <font color="#0000ff">null</font>） ? <font color="#ff00ff">"（n/a）"</font> : password；<br />              return <font color="#ff00ff">"logon info: \n "</font> + <font color="#ff00ff">"username: "</font> + username + <font color="#ff00ff">"\n date: "</font> + date +<font color="#ff00ff"> "\n password: "</font> + pwd；<br />       }</p>
												<p class="unnamed1" align="left">
														<font color="#0000ff">
																<br />       public static void</font> main（<font color="#ff0000">String[]</font> args） throws <font color="#ff0000">IOException</font>, ClassNotFoundException {<br />              <font color="#0000ff">Logon</font> a = <font color="#0000ff">new</font> Logon（<font color="#ff00ff">"Morgan"</font>, <font color="#ff00ff">"morgan83"</font>）；<br />              <font color="#ff0000">System</font>.out.println（ <font color="#ff00ff">"logon a = "</font> + a）；<br />              <font color="#ff0000">ObjectOutputStream</font> o = <font color="#0000ff">new</font><font color="#ff0000">ObjectOutputStream</font>（ <font color="#0000ff">new</font><font color="#ff0000">FileOutputStream</font>（<font color="#ff00ff">"Logon.out"</font>））；<br />              o.writeObject（a）；<br />              o.close（）；</p>
												<p align="left">
														<span class="unnamed1">              <font color="#0000ff">int</font> seconds = 5；<br />              <font color="#0000ff">long</font> t = <font color="#ff0000">System</font>.currentTimeMillis（） + seconds * 1000；<br />              <font color="#0000ff">while</font>（<font color="#ff0000">System</font>.currentTimeMillis（） &lt; t） ；<br /><br />              <font color="#ff0000">ObjectInputStream</font> in = <font color="#0000ff">new</font><font color="#ff0000"> ObjectInputStream</font>（ <font color="#0000ff">new</font><font color="#ff0000">FileInputStream</font>（<font color="#ff00ff">"Logon.out"</font>））；<br />              <font color="#ff0000">System</font>.out.println（ <font color="#ff00ff">"Recovering object at "</font> + <font color="#0000ff">new</font> Date（））；<br />              a = （Logon）in.readObject（）；<br />              <font color="#ff0000">System</font>.out.println（<font color="#ff00ff">"logon a = "</font> + a）； <br />       }<br />}</span>
												</p>
										</td>
								</tr>
						</tbody>
				</table>
				<p align="left">　　类Logon是一个记录登录信息的类，包括用户名和密码。首先它实现了接口Serializable，这就标志着它可以被序列化。之后再main方法里<font color="#ff0000">ObjectOutputStream</font> o = <font color="#0000ff">new</font><font color="#ff0000">ObjectOutputStream</font>（ <font color="#0000ff">new</font><font color="#ff0000">FileOutputStream</font>（<font color="#ff00ff">"Logon.out"</font>））；新建一个对象输出流包装一个文件流，表示对象序列化的目的地是文件Logon.out。然后用方法<font color="#ff0000">writeObject</font>开始写入。想要还原的时候也很简单<font color="#ff0000">ObjectInputStream </font>in = <font color="#0000ff">new</font><font color="#ff0000">ObjectInputStream</font>（ <font color="#0000ff">new</font><font color="#ff0000">FileInputStream</font>（<font color="#ff00ff">"Logon.out"</font>））；新建一个对象输入流以文件流Logon.out为参数，之后调用readObject方法就可以了。</p>
				<p align="left">　　需要说明一点，对象序列化有一个神奇之处就是，它建立了一张对象网，将当前要序列化的对象中所持有的引用指向的对象都包含起来一起写入到文件，更为奇妙的是，如果你一次序列化了好几个对象，它们中相同的内容将会被共享写入。这的确是一个非常好的机制。它可以用来实现深层拷贝。</p>
				<p align="left">　　关键字transient在这里表示当前内容将不被序列化，比如例子中的密码，需要保密，所以没有被写入文</p>
		</div>
<img src ="http://www.cppblog.com/jjbird/aggbug/6760.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jjbird/" target="_blank">奇奇</a> 2006-05-08 16:52 <a href="http://www.cppblog.com/jjbird/articles/6760.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java读书笔记（二）</title><link>http://www.cppblog.com/jjbird/articles/2432.html</link><dc:creator>奇奇</dc:creator><author>奇奇</author><pubDate>Wed, 04 Jan 2006 09:54:00 GMT</pubDate><guid>http://www.cppblog.com/jjbird/articles/2432.html</guid><wfw:comment>http://www.cppblog.com/jjbird/comments/2432.html</wfw:comment><comments>http://www.cppblog.com/jjbird/articles/2432.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jjbird/comments/commentRss/2432.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jjbird/services/trackbacks/2432.html</trackback:ping><description><![CDATA[<P>11、写java程序时，你随时可以System.out.println("things");只要你想打印。<BR>12、JDK:Java Developer's Kit<BR>13、<A href="http://www.bruceeckel.com/">http://www.bruceeckel.com/</A><BR>14、sdk安装后，要设置path和java_home环境变量<BR>&nbsp;Java 2环境变量的设置如下例所示: <BR>&nbsp;Solaris平台: setenv JAVA_HOME Java2的安装路径 <BR>&nbsp;setenv PATH $JAVA_HOME/bin:${PATH} <BR>&nbsp;Windows平台: set JAVA_HOME=Java2的安装路径 <BR>&nbsp;set PATH=$JAVA_HOMEbin;%PATH% <BR>15、javadoc这个提取注释的工具，会输出HTML文件，自动生成一份文档<BR>开始：/**<BR>结束：*/<BR>两种用法：嵌入式的HTML和用“文档标记@(doc tags)”<BR>16、对象的赋值，实际上是在拷贝它的reference。如：n1=n2;这时n1、n2指向同一个对象。原先的reference被覆盖，指向的对象被清除。这种现象被称为aliasing（别名效应）<BR>17、正则表达式&nbsp; -?\\d+&nbsp; “前面可能有一个减号，后面跟着一串阿拉伯数字”<BR>阿拉伯数字用‘\d’表示，但是必须再加一个反斜杠才能把它转义为一个反斜杠。<BR>18、have a cookie。递增运算符也是C++命名的原因之一，它的寓意是“比C更进一步”，Bill Joy(Sun 的创建者之一）说，“java=C++--”,他的意思是，java 是一种去除了C++中多余的复杂性的语言。<BR>19、==、!=比较的是对象的reference，即使对象的内容相同，但是reference是不同的话，比较也是不等的。<BR>要想比较两个对象的实际内容，可以用equals()方法。但是对于自己创建的类，必须重新复写equals()，因为它的缺省行为是比较reference。<BR>20、处理逻辑运算符的时候会碰到一种叫“短接”，只要能准确的知道整个表达式是真是假，就立刻做出判断，无需计算逻辑表达式的后半部分。<BR>21、在java里，唯一能放标签的地方是在循环语句的外面。而且必须直接放——在循环语句和标签之间不能有任何东西。continue label会在中断内部循环的同时中断外部循环，在一气退到label，然后从头开始执行循环，但是这次是从外部开始；break label也会退到label，但是它不会在进入循环。实际上它是同时退出两个循环。<BR></P><img src ="http://www.cppblog.com/jjbird/aggbug/2432.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jjbird/" target="_blank">奇奇</a> 2006-01-04 17:54 <a href="http://www.cppblog.com/jjbird/articles/2432.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java学习笔记（一）</title><link>http://www.cppblog.com/jjbird/articles/2428.html</link><dc:creator>奇奇</dc:creator><author>奇奇</author><pubDate>Wed, 04 Jan 2006 07:35:00 GMT</pubDate><guid>http://www.cppblog.com/jjbird/articles/2428.html</guid><wfw:comment>http://www.cppblog.com/jjbird/comments/2428.html</wfw:comment><comments>http://www.cppblog.com/jjbird/articles/2428.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jjbird/comments/commentRss/2428.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jjbird/services/trackbacks/2428.html</trackback:ping><description><![CDATA[<P>1、OOP: 面向对象的编程(Object_Oriented Programming)<BR><BR>2、抽象的过程：对机器建模-〉对问题建模-〉面向对象的方法<BR>机器模型“解决空间”；待解决的问题的模型“问题空间”<BR><BR>3、我们将问题空间的元素同它在解决空间的表述称为“对象”。<BR>对象有状态、行为和标识。<BR><BR>4、HTML:HyperText Markup Language<BR><BR>5、CGI:通用网关接口(Common Gateway Interface)<BR><BR>6、Sun Microsystems的Java语言和类库（可从java.sun.com自由下载）会附带一份可以用Web浏览器阅读的电子文档。<BR><BR>7、数据存在哪里？<BR>1)寄存器(registers),这是反映最快的存储。因为它的位置在存储器里。<BR>2)栈（stack),位于常规内存区，处理器通过栈指针直接访问。栈指针向下移动就创建了新的存储空间，向上移动就释放内存空间。java把某些数据，别是对象的refernce存放在栈里，但对象本身并没有放在栈里。<BR>3)堆(heap),这是一段“多用途的内存池”，也在内存里面。所有java对象都保存在这里。分配堆的存储空间要比分配栈的慢一些。new来创建。<BR>4)静态存储(static storage),“在固定的位置”（尽管它还是在RAM里面），用static关键词来指明。但java对象本身是绝不会放到静态存储中去的。<BR>5)固定存储（constant storage),常量值。<BR>6)非内存的存储(Non-RAM storage),完全独立于程序，即使程序失去了对数据的控制，它也仍然还在。“流对象”：会被送往另一台机器的，由对象转化而成的字节流；“persistent对象”：保存在磁盘上的，能在程序中止之后仍保存在其他介质上的东西。<BR><BR>8、特例：primitive类型“非reference的自动变量”。<BR>primitive类型&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;Wrapper类型<BR>boolean&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Boolean<BR>char&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Character<BR>byte&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Byte<BR>short&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Short<BR>int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Integer<BR>long&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Long<BR>float&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Float<BR>double&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Double<BR>void&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Void<BR><BR>9、两种方法可以引用static变量。1)通过一个对象st1.i；2)直接用类的名字StaticTest.i。静态方法的思路也差不多。<BR>class StaticTest{<BR>&nbsp;static int i=47;<BR>}<BR>StaticTest st1=new StaticTest();<BR>10、有一个类库java.lang会被自动的引入所有java文件。</P>
<P><BR>javac *.java<BR>java *<BR>appletviewer *.html</P>
<P>&lt;applet <BR>&nbsp;code =*.class width=100 height=100&gt;<BR>&lt;/applet&gt;</P><img src ="http://www.cppblog.com/jjbird/aggbug/2428.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jjbird/" target="_blank">奇奇</a> 2006-01-04 15:35 <a href="http://www.cppblog.com/jjbird/articles/2428.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>