﻿<?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-凿冰大虾的blog</title><link>http://www.blogjava.net/PrettyBoyCyb/</link><description>经历,沉淀,积累...</description><language>zh-cn</language><lastBuildDate>Mon, 06 Apr 2026 10:22:55 GMT</lastBuildDate><pubDate>Mon, 06 Apr 2026 10:22:55 GMT</pubDate><ttl>60</ttl><item><title>动态编译JAVA程序 (zz)</title><link>http://www.blogjava.net/PrettyBoyCyb/archive/2006/12/11/86931.html</link><dc:creator>PrettyBoy</dc:creator><author>PrettyBoy</author><pubDate>Mon, 11 Dec 2006 08:08:00 GMT</pubDate><guid>http://www.blogjava.net/PrettyBoyCyb/archive/2006/12/11/86931.html</guid><wfw:comment>http://www.blogjava.net/PrettyBoyCyb/comments/86931.html</wfw:comment><comments>http://www.blogjava.net/PrettyBoyCyb/archive/2006/12/11/86931.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/PrettyBoyCyb/comments/commentRss/86931.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/PrettyBoyCyb/services/trackbacks/86931.html</trackback:ping><description><![CDATA[
		<div class="postText">
				<p>
						<strong>[转贴者注]对于很多应用系统，常常需要动态装载和执行类和代码片断，这有利于部署的简易性和系统设计上的灵活性。本文给出了一个比较全面的介绍，值得参考。<br /><br /></strong>    在Sun JDK 1.2及后续版本中，包含了一组可在程序运行时刻编译和执行Java代码的API。这些API被包含在tools.jar类库中。这个功能允许Java程序在运行时动态编译、执行小的代码块，在有些情况下这个功能会让Java应用程序的架构更加灵活、开放。 <br /><br />　　本文假定读者已经在计算机中安装并配置好了Sun JDK 1.2或更高的版本，并对javac编译器命令有所了解。 <br /><br />　　<b>在Java程序中使用编译器 </b><br />　　假定要使用javac命令编译 /home/mytest目录下Test.java文件，并设定class文件存放在/home/mytest/classes路径下，输入下面命令： <br /><br />　　javac -d /home/mytest/classes Test.java <br /><br />　　达到同样的目的，也可以使用Sun提供的一个Java编译器的API来实现。它的使用也很简单，核心代码段如下： <br /><br /></p>
				<div class="codeStyle">
						<ol>
								<li>　　…  
</li>
								<li>
								</li>
								<li>　　<b><a href="http://www.javaresearch.org/source/jdk142/java/lang/String.java.html" target="_blank"><font class="classLink"><u>String</u></font></a></b>[] args = <b><font color="#0000ff">new</font></b> <b><a href="http://www.javaresearch.org/source/jdk142/java/lang/String.java.html" target="_blank"><font class="classLink"><u>String</u></font></a></b>[] {“-d”， “/homemytestclasses”， “Test.java”};  
</li>
								<li>
								</li>
								<li>　　Int status = javac.compile(args);  
</li>
								<li>
								</li>
								<li>　　…  </li>
						</ol>
				</div>
				<p>
						<br />
						<br />　　javac编译工具被安装在JDK根目录的/bin目录下，负责将源代码编译成运行于JVM的字节码。事实上，我们经常使用/bin目录下的javac编译工具来编译Java源文件。如果在Java程序中动态编译任意制定的Java语句，使用这个外部的javac编译器就显得不够灵活了。虽然有时可使用Runtime类来执行一个外部命令，但如果想知道代码是否被编译通过、编译时发生了什么错误，用Runtime类的exec()方法就很难实现了。 <br /><br />　　在Sun的JDK 1.2及后续版本中，JDK安装路径的/lib路径下包含了一个tools.jar文件，这个类库包含了一个完整的编译器包。com.sun.tools.javac.Main是编译器的主类入口，如果已经熟悉了javac编译器命令行的使用方法，很容易理解这个类的使用方法。方法compile(String[] p)执行编译动作，参数p是一个String数组，用来存放javac命令的参数选项，编译后的状态返回一个Int值，其对应值参考如下表所示： <br /><br />　　表 状态参数与对应值 <br /><br />　　EXIT_OK 0 <br /><br />　　EXIT_ERROR 1 <br /><br />　　EXIT_CMDERR 2 <br /><br />　　EXIT_SYSERR 3 <br /><br />　　EXIT_ABNORMAL 4 <br /><br />　　 <br /><br />　　<b>在程序执行时编译和执行Java语句 </b><br /><br />　　从上面一段中，我们已经基本了解了动态编译一个Java文件的方法。那么，如何运行时动态编译指定的Java语句呢？这里需要一个技巧。 <br /><br />　　假设要动态编译的Java条语句如下： <br /><br /></p>
				<div class="codeStyle">
						<ol>
								<li>　　<b><a href="http://www.javaresearch.org/source/jdk142/java/lang/System.java.html" target="_blank"><font class="classLink"><u>System</u></font></a></b>.out.println(“Hello，This runtime code！”);  </li>
						</ol>
				</div>
				<p>
						<br />
						<br />　　编译器不支持编译单个Java语句，被编译的对象必须是一个以.java为后缀的、结构合法的类源程序文件，所以需要对这个语句进行改造，变成一个完整的类，并把这条语句置入main方法中，便于测试。 <br /><br /></p>
				<div class="codeStyle">
						<ol>
								<li>　　<b><font color="#0000ff">public</font></b> <b><font color="#0000ff">class</font></b> &lt;临时类文件名&gt; {  
</li>
								<li>
								</li>
								<li>　　<b><font color="#0000ff">public</font></b> <b><font color="#0000ff">static</font></b> <b><font color="#0000ff">void</font></b> main(<b><a href="http://www.javaresearch.org/source/jdk142/java/lang/String.java.html" target="_blank"><font class="classLink"><u>String</u></font></a></b>[] args) <b><font color="#0000ff">throws</font></b> <b><a href="http://www.javaresearch.org/source/jdk142/java/lang/Exception.java.html" target="_blank"><font class="classLink"><u>Exception</u></font></a></b> {  
</li>
								<li>
								</li>
								<li>　　<b><a href="http://www.javaresearch.org/source/jdk142/java/lang/System.java.html" target="_blank"><font class="classLink"><u>System</u></font></a></b>.out.println(“Hello，This runtime code！”);  
</li>
								<li>
								</li>
								<li>　　}  
</li>
								<li>
								</li>
								<li>　　}  </li>
						</ol>
				</div>
				<p>
						<br />
						<br />　　这样，欲动态编译的代码已经被程序动态拼装成了上面那段代码，准备工作还没有结束，不过看起来工作在趋向稍微的复杂化。因为上述代码当前还存放在内存中，编译器似乎对一个硬盘文件更感兴趣。我们需要引用java.io.File类（JDK 1.2以上），创建一个临时的文件来存放上述代码的内容。java.io.File类的静态方法createTempFile()方法保证所创建的文件名是不重复的，这样会增大这段程序的灵活性。灵活性取决于真正应用到系统架构中的策略。 <br /><br />　　System.getProperty(“user.dir”)用来获得当前路径，在这里作为临时文件的存放目录。 <br /><br /></p>
				<div class="codeStyle">
						<ol>
								<li>　　<font color="#ff0000">File</font> file;  
</li>
								<li>
								</li>
								<li>　　file = <font color="#ff0000">File</font>.createTempFile(“JavaRuntime”， “.java”， <b><font color="#0000ff">new</font></b> <font color="#ff0000">File</font>(<b><a href="http://www.javaresearch.org/source/jdk142/java/lang/System.java.html" target="_blank"><font class="classLink"><u>System</u></font></a></b>.getProperty(“user.dir”)));  
</li>
								<li>
								</li>
								<li>　　<b><a href="http://www.javaresearch.org/source/jdk142/java/lang/String.java.html" target="_blank"><font class="classLink"><u>String</u></font></a></b> filename = file.getName();  
</li>
								<li>
								</li>
								<li>　　<b><a href="http://www.javaresearch.org/source/jdk142/java/lang/String.java.html" target="_blank"><font class="classLink"><u>String</u></font></a></b> classname = getClassName(filename);  
</li>
								<li>
								</li>
								<li>　　<i><font color="#339900">//将代码输出到文件 </font></i></li>
								<li>
								</li>
								<li>　　<font color="#ff0000">PrintWriter</font> out = <b><font color="#0000ff">new</font></b> <font color="#ff0000">PrintWriter</font>(<b><font color="#0000ff">new</font></b> <font color="#ff0000">FileOutputStream</font>(file));  
</li>
								<li>
								</li>
								<li>　　out.println(“<b><font color="#0000ff">public</font></b> <b><font color="#0000ff">class</font></b>” + classname + “ {”};  
</li>
								<li>
								</li>
								<li>　　out.println(“..代码..”);  
</li>
								<li>
								</li>
								<li>　　out.println(“}”);  
</li>
								<li>
								</li>
								<li>　　<i><font color="#339900">//关闭文件流 </font></i></li>
								<li>
								</li>
								<li>　　out.flush();  
</li>
								<li>
								</li>
								<li>　　out.close();  </li>
						</ol>
				</div>
				<p>
						<br />　　我们约定被创建的临时文件名以“JavaRuntime”为头缀（可任意命名），后缀名以“.java”结尾。一个待编译的Java源文件已被动态生成。下一步要从com.sun.tools.javac包中创建一个Main实例，调用javac.compile()方法编译这个临时文件： <br /><br /></p>
				<div class="codeStyle">
						<ol>
								<li>　　Private <b><font color="#0000ff">static</font></b> com.sun.tools.javac.Main javac = <b><font color="#0000ff">new</font></b> com.sun.tools.javac.Main();  
</li>
								<li>
								</li>
								<li>　　<b><a href="http://www.javaresearch.org/source/jdk142/java/lang/String.java.html" target="_blank"><font class="classLink"><u>String</u></font></a></b>[] args = <b><font color="#0000ff">new</font></b> <b><a href="http://www.javaresearch.org/source/jdk142/java/lang/String.java.html" target="_blank"><font class="classLink"><u>String</u></font></a></b>[] {“-d”， <b><a href="http://www.javaresearch.org/source/jdk142/java/lang/System.java.html" target="_blank"><font class="classLink"><u>System</u></font></a></b>.getProperty(“user.dir”)，filename };  
</li>
								<li>
								</li>
								<li>　　Int status = javac.compile(args);  </li>
						</ol>
				</div>
				<p>
						<br />
						<br />　　假定临时文件通过了编译器文法验证等验证，编译成功（status值等于0，参看前表），在当前程序的运行目录下就会多了一个Java类文件。我们将通过执行这个Java 类文件，来模拟执行欲动态编译代码的结果。 <br /><br />　　Java提供在运行时刻加载类的特性，可动态识别和调用类构造方法、类字段和类方法。java.lang.reflect.Method实现了Member接口，可以调用接口的方法来获得方法类的名称、修饰词等。方法getRuturnType()、getParameterTypes()、getExeptionTypess()等返回被表示方法的构造信息。Method另一个重要的特性是可以调用invoke()执行这个方法（详细使用方法可以查看java.lang.reflect包文档）。下面这段代码中创建一个java.lang.reflect.Method类方法，调用getMethod()方法获得被拼装的main方法的映射，这段代码如下： <br /><br /></p>
				<div class="codeStyle">
						<ol>
								<li>　　<b><font color="#0000ff">try</font></b> {  
</li>
								<li>
								</li>
								<li>　　<i><font color="#339900">// 访问这个类 </font></i></li>
								<li>
								</li>
								<li>　　<b><a href="http://www.javaresearch.org/source/jdk142/java/lang/Class.java.html" target="_blank"><font class="classLink"><u>Class</u></font></a></b> cls = <b><a href="http://www.javaresearch.org/source/jdk142/java/lang/Class.java.html" target="_blank"><font class="classLink"><u>Class</u></font></a></b>.forName(classname);  
</li>
								<li>
								</li>
								<li>　　<i><font color="#339900">//调用main方法 </font></i></li>
								<li>
								</li>
								<li>　　<font color="#ff0000">Method</font> main = cls.getMethod(“main”， <b><font color="#0000ff">new</font></b> <b><a href="http://www.javaresearch.org/source/jdk142/java/lang/Class.java.html" target="_blank"><font class="classLink"><u>Class</u></font></a></b>[] { <b><a href="http://www.javaresearch.org/source/jdk142/java/lang/String.java.html" target="_blank"><font class="classLink"><u>String</u></font></a></b>[].<b><font color="#0000ff">class</font></b> });  
</li>
								<li>
								</li>
								<li>　　main.invoke(<b><font color="#0000ff">null</font></b>， <b><font color="#0000ff">new</font></b> <b><a href="http://www.javaresearch.org/source/jdk142/java/lang/Object.java.html" target="_blank"><font class="classLink"><u>Object</u></font></a></b>[] { <b><font color="#0000ff">new</font></b> <b><a href="http://www.javaresearch.org/source/jdk142/java/lang/String.java.html" target="_blank"><font class="classLink"><u>String</u></font></a></b>[0] });  
</li>
								<li>
								</li>
								<li>　　}<b><font color="#0000ff">catch</font></b> (<b><a href="http://www.javaresearch.org/source/jdk142/java/lang/SecurityException.java.html" target="_blank"><font class="classLink"><u>SecurityException</u></font></a></b> se) {  
</li>
								<li>
								</li>
								<li>　　debug(“access to the information is denied:” + se.toString());  
</li>
								<li>
								</li>
								<li>　　}<b><font color="#0000ff">catch</font></b> (<b><a href="http://www.javaresearch.org/source/jdk142/java/lang/NoSuchMethodException.java.html" target="_blank"><font class="classLink"><u>NoSuchMethodException</u></font></a></b> nme) {  
</li>
								<li>
								</li>
								<li>　　debug(“a matching method is not found or <b><font color="#0000ff">if</font></b> then name is or :  
</li>
								<li>
								</li>
								<li>　　” + nme.toString());  
</li>
								<li>
								</li>
								<li>　　}<b><font color="#0000ff">catch</font></b> (<b><a href="http://www.javaresearch.org/source/jdk142/java/lang/reflect/InvocationTargetException.java.html" target="_blank"><font class="classLink"><u>InvocationTargetException</u></font></a></b> ite) {  
</li>
								<li>
								</li>
								<li>　　debug(“<b><a href="http://www.javaresearch.org/source/jdk142/java/lang/Exception.java.html" target="_blank"><font class="classLink"><u>Exception</u></font></a></b> in main: ” + ite.getTargetException());  
</li>
								<li>
								</li>
								<li>　　}<b><font color="#0000ff">catch</font></b> (<b><a href="http://www.javaresearch.org/source/jdk142/java/lang/Exception.java.html" target="_blank"><font class="classLink"><u>Exception</u></font></a></b> e){  
</li>
								<li>
								</li>
								<li>　　debug(e.toString());  
</li>
								<li>
								</li>
								<li>　　}  </li>
						</ol>
				</div>
				<p>
						<br />　　运行结果参如下： <br /><br />　　Hello，This runtime code！ <br /><br />　　 <br /><br />　　<b>示范程序 </b><br /><br />　　下面给出了一个简单的Java程序，这个程序说明了如何利用Sun的javac编译器完成动态编译Java语句。运行该程序需要计算机安装JDK 1.2以上版本，并在classpath中或运行时指定tools.jar文件位置。 <br /><br />　　程序结构： <br /><br />　　◆ compile() 编译Java代码，返回生成的临时文件； <br /><br />　　◆ run()运行编译的class文件； <br /><br />　　◆ debug()输出调试信息； <br /><br />　　◆ getClassName()从一个Java源文件获得类名； <br /><br />　　◆ readLine()从控制台读取用户输入的Java Code。 <br /><br /></p>
				<div class="codeStyle">
						<ol>
								<li>　　Import java.io.<b><a href="http://www.javaresearch.org/source/jdk142/java/io/File.java.html" target="_blank"><font class="classLink"><u>File</u></font></a></b>;  
</li>
								<li>
								</li>
								<li>　　…  
</li>
								<li>
								</li>
								<li>　　Public <b><font color="#0000ff">class</font></b> RuntimeCode{  
</li>
								<li>
								</li>
								<li>　　<i><font color="#339900">/**编译器*/</font></i>  
</li>
								<li>
								</li>
								<li>　　<b><font color="#0000ff">private</font></b> <b><font color="#0000ff">static</font></b> com.sun.tools.javac.Main javac = <b><font color="#0000ff">new</font></b> com.sun.tools.javac.Main();  
</li>
								<li>
								</li>
								<li>　　<i><font color="#339900">/**等待用户输入JavaCode，然后编译、执行*/</font></i>  
</li>
								<li>
								</li>
								<li>　　<b><font color="#0000ff">public</font></b> <b><font color="#0000ff">static</font></b> <b><font color="#0000ff">void</font></b> main(<b><a href="http://www.javaresearch.org/source/jdk142/java/lang/String.java.html" target="_blank"><font class="classLink"><u>String</u></font></a></b>[] args) <b><font color="#0000ff">throws</font></b> <b><a href="http://www.javaresearch.org/source/jdk142/java/lang/Exception.java.html" target="_blank"><font class="classLink"><u>Exception</u></font></a></b>{  
</li>
								<li>
								</li>
								<li>　　…  
</li>
								<li>
								</li>
								<li>　　run(compile(code));  
</li>
								<li>
								</li>
								<li>　　}  
</li>
								<li>
								</li>
								<li>　　<i><font color="#339900">/**编译JavaCode，返回临时文件对象*/</font></i>  
</li>
								<li>
								</li>
								<li>　　<b><font color="#0000ff">private</font></b> <b><font color="#0000ff">synchronized</font></b> <b><font color="#0000ff">static</font></b> <font color="#ff0000">File</font> compile(<b><a href="http://www.javaresearch.org/source/jdk142/java/lang/String.java.html" target="_blank"><font class="classLink"><u>String</u></font></a></b> code)  
</li>
								<li>
								</li>
								<li>　　<b><font color="#0000ff">throws</font></b> <font color="#ff0000">IOException</font>，<b><a href="http://www.javaresearch.org/source/jdk142/java/lang/Exception.java.html" target="_blank"><font class="classLink"><u>Exception</u></font></a></b> {  
</li>
								<li>
								</li>
								<li>　　<font color="#ff0000">File</font> file;  
</li>
								<li>
								</li>
								<li>　　<i><font color="#339900">//在用户当前文件目录创建一个临时代码文件 </font></i></li>
								<li>
								</li>
								<li>　　file = <font color="#ff0000">File</font>.createTempFile(“JavaRuntime”， “.java”，  
</li>
								<li>
								</li>
								<li>　　<b><font color="#0000ff">new</font></b> <font color="#ff0000">File</font>(<b><a href="http://www.javaresearch.org/source/jdk142/java/lang/System.java.html" target="_blank"><font class="classLink"><u>System</u></font></a></b>.getProperty(“user.dir”)));  
</li>
								<li>
								</li>
								<li>　　<i><font color="#339900">//当虚拟机退出时，删除此临时java源文件 </font></i></li>
								<li>
								</li>
								<li>　　file.deleteOnExit();  
</li>
								<li>
								</li>
								<li>　　<i><font color="#339900">//获得文件名和类名字 </font></i></li>
								<li>
								</li>
								<li>　　<b><a href="http://www.javaresearch.org/source/jdk142/java/lang/String.java.html" target="_blank"><font class="classLink"><u>String</u></font></a></b> filename = file.getName();  
</li>
								<li>
								</li>
								<li>　　<b><a href="http://www.javaresearch.org/source/jdk142/java/lang/String.java.html" target="_blank"><font class="classLink"><u>String</u></font></a></b> classname = getClassName(filename);  
</li>
								<li>
								</li>
								<li>　　<i><font color="#339900">//将代码输出到文件 </font></i></li>
								<li>
								</li>
								<li>　　<font color="#ff0000">PrintWriter</font> out = <b><font color="#0000ff">new</font></b> <font color="#ff0000">PrintWriter</font>(<b><font color="#0000ff">new</font></b> <font color="#ff0000">FileOutputStream</font>(file));  
</li>
								<li>
								</li>
								<li>　　out.println(“<i><font color="#339900">/**”); </font></i></li>
								<li>
								</li>
								<li>
										<i>
												<font color="#339900">　　… </font>
										</i>
								</li>
								<li>
								</li>
								<li>
										<i>
												<font color="#339900">　　//关闭文件流 </font>
										</i>
								</li>
								<li>
								</li>
								<li>
										<i>
												<font color="#339900">　　out.flush(); </font>
										</i>
								</li>
								<li>
								</li>
								<li>
										<i>
												<font color="#339900">　　out.close(); </font>
										</i>
								</li>
								<li>
								</li>
								<li>
										<i>
												<font color="#339900">　　//编译代码文件 </font>
										</i>
								</li>
								<li>
								</li>
								<li>
										<i>
												<font color="#339900">　　String[] args = new String[] {“-d”， System.getProperty(“user.dir”)，filename }; </font>
										</i>
								</li>
								<li>
								</li>
								<li>
										<i>
												<font color="#339900">　　//返回编译的状态代码 </font>
										</i>
								</li>
								<li>
								</li>
								<li>
										<i>
												<font color="#339900">　　int status = javac.compile(args); </font>
										</i>
								</li>
								<li>
								</li>
								<li>
										<i>
												<font color="#339900">　　//处理编译状态 </font>
										</i>
								</li>
								<li>
								</li>
								<li>
										<i>
												<font color="#339900">　　… </font>
										</i>
								</li>
								<li>
								</li>
								<li>
										<i>
												<font color="#339900">　　} </font>
										</i>
								</li>
								<li>
								</li>
								<li>
										<i>
												<font color="#339900">　　/**执行刚刚编译的类文件*/</font>
										</i>  
</li>
								<li>
								</li>
								<li>　　<b><font color="#0000ff">private</font></b> <b><font color="#0000ff">static</font></b> <b><font color="#0000ff">synchronized</font></b> <b><font color="#0000ff">void</font></b> run(<font color="#ff0000">File</font> file)  
</li>
								<li>
								</li>
								<li>　　…  
</li>
								<li>
								</li>
								<li>　　<i><font color="#339900">//当虚拟机退出时，删除此临时编译的类文件 </font></i></li>
								<li>
								</li>
								<li>　　<b><font color="#0000ff">new</font></b> <font color="#ff0000">File</font>(file.getParent()， classname + “.<b><font color="#0000ff">class</font></b>”).deleteOnExit();  
</li>
								<li>
								</li>
								<li>　　<b><font color="#0000ff">try</font></b> {  
</li>
								<li>
								</li>
								<li>　　<i><font color="#339900">// 访问这个类 </font></i></li>
								<li>
								</li>
								<li>　　<b><a href="http://www.javaresearch.org/source/jdk142/java/lang/Class.java.html" target="_blank"><font class="classLink"><u>Class</u></font></a></b> cls = <b><a href="http://www.javaresearch.org/source/jdk142/java/lang/Class.java.html" target="_blank"><font class="classLink"><u>Class</u></font></a></b>.forName(classname);  
</li>
								<li>
								</li>
								<li>　　<i><font color="#339900">//映射main方法 </font></i></li>
								<li>
								</li>
								<li>　　<font color="#ff0000">Method</font> main = cls.getMethod(“main”， <b><font color="#0000ff">new</font></b> <b><a href="http://www.javaresearch.org/source/jdk142/java/lang/Class.java.html" target="_blank"><font class="classLink"><u>Class</u></font></a></b>[] { <b><a href="http://www.javaresearch.org/source/jdk142/java/lang/String.java.html" target="_blank"><font class="classLink"><u>String</u></font></a></b>[].<b><font color="#0000ff">class</font></b> });  
</li>
								<li>
								</li>
								<li>　　<i><font color="#339900">//执行main方法 </font></i></li>
								<li>
								</li>
								<li>　　main.invoke(<b><font color="#0000ff">null</font></b>， <b><font color="#0000ff">new</font></b> <b><a href="http://www.javaresearch.org/source/jdk142/java/lang/Object.java.html" target="_blank"><font class="classLink"><u>Object</u></font></a></b>[] { <b><font color="#0000ff">new</font></b> <b><a href="http://www.javaresearch.org/source/jdk142/java/lang/String.java.html" target="_blank"><font class="classLink"><u>String</u></font></a></b>[0] });  
</li>
								<li>
								</li>
								<li>　　}<b><font color="#0000ff">catch</font></b> (<b><a href="http://www.javaresearch.org/source/jdk142/java/lang/SecurityException.java.html" target="_blank"><font class="classLink"><u>SecurityException</u></font></a></b> se) {  
</li>
								<li>
								</li>
								<li>　　…  
</li>
								<li>
								</li>
								<li>　　}  
</li>
								<li>
								</li>
								<li>　　}  
</li>
								<li>
								</li>
								<li>　　<i><font color="#339900">/**打印调试信息*/</font></i>  
</li>
								<li>
								</li>
								<li>　　<b><font color="#0000ff">private</font></b> <b><font color="#0000ff">static</font></b> <b><font color="#0000ff">void</font></b> debug(<b><a href="http://www.javaresearch.org/source/jdk142/java/lang/String.java.html" target="_blank"><font class="classLink"><u>String</u></font></a></b> msg) {  
</li>
								<li>
								</li>
								<li>　　<b><a href="http://www.javaresearch.org/source/jdk142/java/lang/System.java.html" target="_blank"><font class="classLink"><u>System</u></font></a></b>.err.println(msg);  
</li>
								<li>
								</li>
								<li>　　}  
</li>
								<li>
								</li>
								<li>　　<i><font color="#339900">/**根据一个java源文件名获得类名*/</font></i>  
</li>
								<li>
								</li>
								<li>　　<b><font color="#0000ff">private</font></b> <b><font color="#0000ff">static</font></b> <b><a href="http://www.javaresearch.org/source/jdk142/java/lang/String.java.html" target="_blank"><font class="classLink"><u>String</u></font></a></b> getClassName(<b><a href="http://www.javaresearch.org/source/jdk142/java/lang/String.java.html" target="_blank"><font class="classLink"><u>String</u></font></a></b> filename){  
</li>
								<li>
								</li>
								<li>　　<b><font color="#0000ff">return</font></b> filename.substring(0，filename.<b><font color="#0000ff">length</font></b>()-5);  
</li>
								<li>
								</li>
								<li>　　}  
</li>
								<li>
								</li>
								<li>　　<i><font color="#339900">/**从控制台获得用户输入的Java代码段*/</font></i>  
</li>
								<li>
								</li>
								<li>　　…  
</li>
								<li>
								</li>
								<li>　　}  </li>
						</ol>
				</div>
				<p>
						<br />　　编译运行上述代码，在please input java code提示下输入以下代码： <br /><br />　　for(int i=0;i&lt;10;i++){System.out.println(“this is:”+i);} <br /><br />　　运行结果如下所示： <br /><br />　　Please input java code： <br /><br />　　for(int i=0;i&lt;10;i++){System.out.println(“this is:”+i);} <br /><br />　　wait.... <br /><br />　　-------------------- <br /><br />　　this is:0 <br /><br />　　this is:1 <br /><br />　　this is:2 <br /><br />　　this is:3 <br /><br />　　this is:4 <br /><br />　　this is:5 <br /><br />　　this is:6 <br /><br />　　this is:7 <br /><br />　　this is:8 <br /><br />　　this is:9 <br /><br />　　 <br /><br />　　总结 <br /><br />　　在大中型企业应用系统平台中，使用代码动态编译技术结合OO编程模型，可在系统不菪机条件下保证系统的可扩展性和伸缩性。如果你是一个Java程序员，稍加调整以上代码，还可以帮助调试小段的Java代码．</p>
		</div>
<img src ="http://www.blogjava.net/PrettyBoyCyb/aggbug/86931.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/PrettyBoyCyb/" target="_blank">PrettyBoy</a> 2006-12-11 16:08 <a href="http://www.blogjava.net/PrettyBoyCyb/archive/2006/12/11/86931.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JDBC专题介绍(zz)</title><link>http://www.blogjava.net/PrettyBoyCyb/archive/2006/11/17/81813.html</link><dc:creator>PrettyBoy</dc:creator><author>PrettyBoy</author><pubDate>Fri, 17 Nov 2006 09:44:00 GMT</pubDate><guid>http://www.blogjava.net/PrettyBoyCyb/archive/2006/11/17/81813.html</guid><wfw:comment>http://www.blogjava.net/PrettyBoyCyb/comments/81813.html</wfw:comment><comments>http://www.blogjava.net/PrettyBoyCyb/archive/2006/11/17/81813.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/PrettyBoyCyb/comments/commentRss/81813.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/PrettyBoyCyb/services/trackbacks/81813.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: JDBC专题介绍												Ref：				http://kb.csdn.net/java/Articles/200506/73344a78-6148-475b-b42f-ab03f95e95a8.html				1. 介绍 　　许多开发者和用户都在寻找Java程序中访问数据库的便捷方法。由于Java是一个健壮，安全，易于使用的，易于理解且可以从网络中自动d...&nbsp;&nbsp;<a href='http://www.blogjava.net/PrettyBoyCyb/archive/2006/11/17/81813.html'>阅读全文</a><img src ="http://www.blogjava.net/PrettyBoyCyb/aggbug/81813.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/PrettyBoyCyb/" target="_blank">PrettyBoy</a> 2006-11-17 17:44 <a href="http://www.blogjava.net/PrettyBoyCyb/archive/2006/11/17/81813.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在java中取得当前的系统时间并且转化成自己想要的格式</title><link>http://www.blogjava.net/PrettyBoyCyb/archive/2006/11/15/81171.html</link><dc:creator>PrettyBoy</dc:creator><author>PrettyBoy</author><pubDate>Wed, 15 Nov 2006 01:50:00 GMT</pubDate><guid>http://www.blogjava.net/PrettyBoyCyb/archive/2006/11/15/81171.html</guid><wfw:comment>http://www.blogjava.net/PrettyBoyCyb/comments/81171.html</wfw:comment><comments>http://www.blogjava.net/PrettyBoyCyb/archive/2006/11/15/81171.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/PrettyBoyCyb/comments/commentRss/81171.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/PrettyBoyCyb/services/trackbacks/81171.html</trackback:ping><description><![CDATA[    需要引进 java.util.Calendar 和 java.text.SimpleDateFormat 这两个类:<br /><br />       Calendar rightNow = Calendar.getInstance();<br />        SimpleDateFormat fmt = new SimpleDateFormat("yyyyMMddhhmmss");<br />        String sysDatetime = fmt.format(rightNow.getTime());   <br /><br />   可以对 new SimpleDateFormat("yyyyMMddhhmmss") 中引号里面的格式进行编辑,转换成自己相要的格式,比如还可以转<br />   换成   new   SimpleDateFormat("yyyy/MM/dd   hh:mm:ss   ") 的格式。<br /><img src ="http://www.blogjava.net/PrettyBoyCyb/aggbug/81171.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/PrettyBoyCyb/" target="_blank">PrettyBoy</a> 2006-11-15 09:50 <a href="http://www.blogjava.net/PrettyBoyCyb/archive/2006/11/15/81171.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何实现图片的上传以及将图片保存到Mysql</title><link>http://www.blogjava.net/PrettyBoyCyb/archive/2006/11/14/81059.html</link><dc:creator>PrettyBoy</dc:creator><author>PrettyBoy</author><pubDate>Tue, 14 Nov 2006 02:03:00 GMT</pubDate><guid>http://www.blogjava.net/PrettyBoyCyb/archive/2006/11/14/81059.html</guid><wfw:comment>http://www.blogjava.net/PrettyBoyCyb/comments/81059.html</wfw:comment><comments>http://www.blogjava.net/PrettyBoyCyb/archive/2006/11/14/81059.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/PrettyBoyCyb/comments/commentRss/81059.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/PrettyBoyCyb/services/trackbacks/81059.html</trackback:ping><description><![CDATA[MySQLにファイルを格納する <!--TITLE END--><h5 class="cmsabstract"><!--ABSTRACT-->MySQLは多くのフィールド（データ）型をサポートしており、文字や数値、日付や時間のほか、バイナリデータまで格納できます。バイナリデータを格納するのは、「BLOB（ブロブ）型」。今回は、このBLOB型を使って、デジカメ写真を格納する方法を紹介します。 <!--ABSTRACT END--></h5><!--BODY--><!--code start--><table cellspacing="0" cellpadding="0" width="390" border="0"><tbody><tr><td><a href="http://www.javadeveloper.jp/">JAVA Developer</a> 2003年11月号より転載 
<p></p><table cellspacing="0" cellpadding="5" width="100%" bgcolor="#009999" border="0"><tbody><tr><td><b><font color="#ffffff">MySQLのBLOB型は4つ </font></b></td></tr></tbody></table>　MySQLは、TINYBLOB、BLOB、MEDIUMBLOB、LONGBLOBという4種類の可変長バイナリデータを格納する型をサポートしています（表1）。それぞれの違いは、格納できるデータの最大長です。今回の目的はデジカメ写真ですので、1M～2MB前後のデータを格納できるMEDIUMBLOB型を使います。 
<p></p><table cellspacing="0" cellpadding="5" border="1"><tbody><tr><td>型</td><td>最大サイズ（バイト）</td></tr><tr><td>TINYBLOB</td><td>255（28－1）</td></tr><tr><td>BLOB</td><td>65,535（216－1）</td></tr><tr><td>MEDIUMBLOB</td><td>16,777,215（224－1）</td></tr><tr><td>LONGBLOB</td><td>4,294,967,295（232－1）</td></tr></tbody></table><p></p><table cellspacing="0" cellpadding="5" width="100%" bgcolor="#009999" border="0"><tbody><tr><td><b><font color="#ffffff">アップロードはJakartaCommons FileUploadを利用 </font></b></td></tr></tbody></table>　まずはクライアントPCからサーバーへのファイルアップロード機能を実装していきます。<br />　はじめは、ファイルアップロード用のフォームです。ここでのポイントは、methodに必ず「post」を指定し、「enctype="multipart/form-data"」を記述することです。また、アップロードするファイル名は、「&lt;input type="file" name="file1"&gt;」のように、typeで「file」を指定します。 
<p></p><table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="0"><tbody><tr><td valign="top" align="left" bgcolor="#999999"><font color="#ffffff"><b>リスト1　アップロードフォーム（抜粋）</b></font></td></tr><tr><td valign="top" align="left" bgcolor="#eeeeee"><tt><br />&lt;form name="upload" method="post"<br />     enctype="multipart/form-data"&gt;<br />ファイル1:&lt;input type="file" name="file1"&gt;&lt;br&gt;<br />ファイル2:&lt;input type="file" name="file2"&gt;&lt;br&gt;<br />ファイル3:&lt;input type="file" name="file3"&gt;&lt;br&gt;<br />&lt;input type="submit" value="アップロード"&gt;<br />&lt;input type="reset" value="リセット"&gt;&lt;br&gt;<br />&lt;/form&gt;<br /><br /></tt></td></tr></tbody></table><p>　このフォームからデータを受け取って処理する部分には、JakartaCommons FileUpload 1.0（commons-fileupload-1.0.jar）を利用します。FileUploadのDiskFileUploadクラスでは、アップロードできる最大サイズ、メモリー内に保持するサイズなどを指定したあと、requestオブジェクトをパースし、ListにアップロードするFileItemオブジェクトを格納します（リスト2-(1)）。Iteratorを使ってFileItemオブジェクトを取り出し、ImageFileオブジェクトを生成して、アップロードデータを格納していきます（リスト3）。 
</p><p></p><table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="0"><tbody><tr><td valign="top" align="left" bgcolor="#999999"><font color="#ffffff"><b>リスト2　ファイルのアップロードを実装（抜粋）</b></font></td></tr><tr><td valign="top" align="left" bgcolor="#eeeeee"><tt><br />DiskFileUpload uploader = <br />   new DiskFileUpload();<br />uploader.setSizeMax(UPLOAD_LIMIT_SIZE);<br />uploader.setSizeThreshold(IN_MEMORY_SIZE);<br /><br />List items = <br />   uploader.parseRequest(request); //-(1)<br />Iterator iter = items.iterator();<br />while (iter.hasNext()) {<br />   ImageFile image = new ImageFile();<br />   if (image.set((FileItem)iter.next())) {<br />       iData.add(image);<br />   }<br />}<br /><br /></tt></td></tr></tbody></table><p></p><table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="0"><tbody><tr><td valign="top" align="left" bgcolor="#999999"><font color="#ffffff"><b>リスト3　ImageFileクラス</b></font></td></tr><tr><td valign="top" align="left" bgcolor="#eeeeee"><tt><br />public class ImageFile {<br />   public String fileName;<br />   public String contentType;<br />   public int fileSize;<br />   public InputStream inputStream;<br /><br />   public boolean set(FileItem item) <br />           throws IOException {<br />       fileSize = (int)item.getSize();<br />       if (fileSize &gt; 0) {<br />           fileName = item.getName();<br />           contentType =      <br />               item.getContentType();<br />           inputStream = <br />               item.getInputStream();<br />           return (fileName != null &amp;&amp;<br />                   contentType != null);<br />       }<br />       return false;<br />   }<br />}<br /><br /></tt></td></tr></tbody></table><p>　次に、ImageFileオブジェクトのデータをデータベースへ登録します。ここでは、BLOB型へのデータ登録にPreparedStatementを使います（リスト4-(2)）。PreparedStatementには、データ型別にsetXXXメソッドが用意されており、その中にBLOB型に対応するsetBinaryStreamメソッドがあります（リスト4-(3)）。このほかBLOB型に対応するメソッドとしては、setBlobやsetBytesメソッドがあります。 
</p><p></p><table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="0"><tbody><tr><td valign="top" align="left" bgcolor="#999999"><font color="#ffffff"><b>リスト4　PreparedStatementを使って登録（抜粋）</b></font></td></tr><tr><td valign="top" align="left" bgcolor="#eeeeee"><tt><br />Connection con = ds.getConnection();<br />PreparedStatement stmt =  <br />   con.prepareStatement(<br />   "INSERT INTO "+ <br />   "image(name,type,size,rawdata,entry) "+<br />   "VALUES(?, ?, ?, ?, ?)"); //-(2)<br /><br />stmt.setString(1, image.fileName);<br />stmt.setString(2, image.contentType);<br />stmt.setInt(3, image.size);<br />stmt.setBinaryStream(4, <br />   image.inputStream, image.size); //-(3)<br />java.util.Date now = new java.util.Date();<br />stmt.setTimestamp(5, <br />   new Timestamp(now.getTime()));<br /><br />stmt.executeUpdate();<br /><br />stmt.close();<br />con.close();<br /><br /></tt></td></tr></tbody></table><br />※imageはImageFileクラスのオブジェクト 
<p>　ここまでで、アップロードからデータベースへ登録するまでのコーディングは終了です。テスト用にいくつかファイルをアップロードし、データベースに登録されていることを確認します。 
</p><p></p><table cellspacing="0" cellpadding="5" width="100%" bgcolor="#009999" border="0"><tbody><tr><td><b><font color="#ffffff">「PacketTooBigException」で<br />ファイルが格納できない </font></b></td></tr></tbody></table><p><img alt="図1" src="http://image.itmedia.co.jp/enterprise/img/jd0311_01.gif" border="0" /><br />図1　例外発生！ 
</p><p>　さらにファイルをアップロードしていくと、比較的大きめのファイルの場合に例外が発生して、うまく格納できないという症状に遭遇しました（図1）。例外はJDBCが投げているものです。例外名を手がかりにFAQを探してみると、それらしき記述を発見。解決策は、my.iniの[mysqld]セクションに、次のオプションを記述するというものです。 
</p><p></p><table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="0"><tbody><tr><td valign="top" align="left" bgcolor="#eeeeee"><tt><br />max_allowed_packet=4M<br /><br /></tt></td></tr></tbody></table><p>　このオプションは、パケットの最大サイズを指定するものです。上記の場合はパケットサイズを4MBに指定しています。4MBは、普段使っているデジカメのファイルサイズより多少余裕を持たせた値です。あまり大きすぎても無駄にメモリーを使うだけですから、登録したいファイルサイズを考慮した値を指定しましょう。<br />　MySQLを再起動し、先ほどうまく格納できなかったファイルを再度アップロード。今度は問題なく格納できました。これで、ファイルのアップロードからデータベースへの格納までは大丈夫。アップロードしたイメージの表示や検索などの機能は、これからじっくり盛り込んでいこうと思います。<br />　読者の皆さんも、BLOB型を活用してみませんか。 
</p><p><b>参考リンク</b><br />●<a href="http://jakarta.apache.org/commons/fileupload/index.html">FileUpload 1.0</a><br />●<a href="http://www.koyane.org/">Jakarta CommonsなどのAPI翻訳</a><br /></p><p><b>関連リンク</b><br /><img height="16" alt="▼" src="http://image.itmedia.co.jp/news/images/arrow02.gif" width="10" align="bottom" /><a href="http://www.javadeveloper.jp/">JAVA Developer</a><br /><img height="16" alt="▼" src="http://image.itmedia.co.jp/news/images/arrow02.gif" width="10" align="bottom" /><a href="http://books-support.softbank.co.jp/teiki/jvd/">定期購読のご案内</a><br /><img height="16" alt="▼" src="http://image.itmedia.co.jp/news/images/arrow02.gif" width="10" align="bottom" /><a href="http://www.sbpnet.jp/info/tokuyaku_tech.asp">バックナンバー販売協力店</a><br /></p></td></tr></tbody></table><img src ="http://www.blogjava.net/PrettyBoyCyb/aggbug/81059.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/PrettyBoyCyb/" target="_blank">PrettyBoy</a> 2006-11-14 10:03 <a href="http://www.blogjava.net/PrettyBoyCyb/archive/2006/11/14/81059.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>2006.11.13  java对图片的处理(保存和显示)(zz)</title><link>http://www.blogjava.net/PrettyBoyCyb/archive/2006/11/13/80922.html</link><dc:creator>PrettyBoy</dc:creator><author>PrettyBoy</author><pubDate>Mon, 13 Nov 2006 08:31:00 GMT</pubDate><guid>http://www.blogjava.net/PrettyBoyCyb/archive/2006/11/13/80922.html</guid><wfw:comment>http://www.blogjava.net/PrettyBoyCyb/comments/80922.html</wfw:comment><comments>http://www.blogjava.net/PrettyBoyCyb/archive/2006/11/13/80922.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/PrettyBoyCyb/comments/commentRss/80922.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/PrettyBoyCyb/services/trackbacks/80922.html</trackback:ping><description><![CDATA[
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">java</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中的图片处理是很让人头疼的一件事情。目前</span>
				<span lang="EN-US">java api</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中的</span>
				<span lang="EN-US">imageIO</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">可以将</span>
				<span lang="EN-US">gif</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">图片转换成</span>
				<span lang="EN-US">png</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">图片，</span>
				<span lang="EN-US">jpg</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">图片可以正常转换。据说</span>
				<span lang="EN-US">gif</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">转</span>
				<span lang="EN-US">jpg</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">也是有办法的，但是将</span>
				<span lang="EN-US">jpg</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">转成</span>
				<span lang="EN-US">gif</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，我费了很大的工夫才找到一个很好的解决方案。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US"> <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /?><o:p></o:p></span>
		</p>
		<span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">首先介绍的是一段很好的缩放图片的代码：：<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img id="Codehighlighter1_83_1323_Open_Image" onclick="this.style.display='none'; Codehighlighter1_83_1323_Open_Text.style.display='none'; Codehighlighter1_83_1323_Closed_Image.style.display='inline'; Codehighlighter1_83_1323_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_83_1323_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_83_1323_Closed_Text.style.display='none'; Codehighlighter1_83_1323_Open_Image.style.display='inline'; Codehighlighter1_83_1323_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000"> BufferedImage resize(BufferedImage source, </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> targetW, </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> targetH) </span><span id="Codehighlighter1_83_1323_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_83_1323_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> targetW，targetH分别表示目标长和宽</span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">        </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> type </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> source.getType();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        BufferedImage target </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">double</span><span style="COLOR: #000000"> sx </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> (</span><span style="COLOR: #0000ff">double</span><span style="COLOR: #000000">) targetW </span><span style="COLOR: #000000">/</span><span style="COLOR: #000000"> source.getWidth();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">double</span><span style="COLOR: #000000"> sy </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> (</span><span style="COLOR: #0000ff">double</span><span style="COLOR: #000000">) targetH </span><span style="COLOR: #000000">/</span><span style="COLOR: #000000"> source.getHeight();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">这里想实现在targetW，targetH范围内实现等比缩放。如果不需要等比缩放<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">则将下面的if else语句注释即可</span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">        </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(sx</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">sy)<br /><img id="Codehighlighter1_406_490_Open_Image" onclick="this.style.display='none'; Codehighlighter1_406_490_Open_Text.style.display='none'; Codehighlighter1_406_490_Closed_Image.style.display='inline'; Codehighlighter1_406_490_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_406_490_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_406_490_Closed_Text.style.display='none'; Codehighlighter1_406_490_Open_Image.style.display='inline'; Codehighlighter1_406_490_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />        </span><span id="Codehighlighter1_406_490_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_406_490_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            sx </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> sy;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            targetW </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> (</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">)(sx </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000"> source.getWidth());<br /><img id="Codehighlighter1_495_580_Open_Image" onclick="this.style.display='none'; Codehighlighter1_495_580_Open_Text.style.display='none'; Codehighlighter1_495_580_Closed_Image.style.display='inline'; Codehighlighter1_495_580_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_495_580_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_495_580_Closed_Text.style.display='none'; Codehighlighter1_495_580_Open_Image.style.display='inline'; Codehighlighter1_495_580_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />        }</span></span><span style="COLOR: #0000ff">else</span><span id="Codehighlighter1_495_580_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_495_580_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            sy </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> sx;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            targetH </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> (</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">)(sy </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000"> source.getHeight());<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />        }</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img id="Codehighlighter1_630_938_Open_Image" onclick="this.style.display='none'; Codehighlighter1_630_938_Open_Text.style.display='none'; Codehighlighter1_630_938_Closed_Image.style.display='inline'; Codehighlighter1_630_938_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_630_938_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_630_938_Closed_Text.style.display='none'; Codehighlighter1_630_938_Open_Image.style.display='inline'; Codehighlighter1_630_938_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (type </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> BufferedImage.TYPE_CUSTOM) </span><span id="Codehighlighter1_630_938_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_630_938_Open_Text"><span style="COLOR: #000000">{ </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">handmade</span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">            ColorModel cm </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> source.getColorModel();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            WritableRaster raster </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> cm.createCompatibleWritableRaster(targetW, targetH);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            </span><span style="COLOR: #0000ff">boolean</span><span style="COLOR: #000000"> alphaPremultiplied </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> cm.isAlphaPremultiplied();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            target </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> BufferedImage(cm, raster, alphaPremultiplied, </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />        }</span></span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            target </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> BufferedImage(targetW, targetH, type);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        Graphics2D g </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> target.createGraphics();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">smoother than exlax:</span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">        g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        g.drawRenderedImage(source, AffineTransform.getScaleInstance(sx, sy));<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        g.dispose();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> target;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div><br /><span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">接下来是将</span><span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体">InputStream</span><span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">保存为</span><span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体">jpg</span><span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">文件<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> saveImageAsJpg (InputStream in, File saveFile,</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> width,</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> hight)    <br /><img id="Codehighlighter1_116_376_Open_Image" onclick="this.style.display='none'; Codehighlighter1_116_376_Open_Text.style.display='none'; Codehighlighter1_116_376_Closed_Image.style.display='inline'; Codehighlighter1_116_376_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_116_376_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_116_376_Closed_Text.style.display='none'; Codehighlighter1_116_376_Open_Image.style.display='inline'; Codehighlighter1_116_376_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />            </span><span style="COLOR: #0000ff">throws</span><span style="COLOR: #000000"> Exception </span><span id="Codehighlighter1_116_376_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_116_376_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        BufferedImage srcImage;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        srcImage </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> ImageIO.read(in);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(width </span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">||</span><span style="COLOR: #000000"> hight </span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">)<br /><img id="Codehighlighter1_232_298_Open_Image" onclick="this.style.display='none'; Codehighlighter1_232_298_Open_Text.style.display='none'; Codehighlighter1_232_298_Closed_Image.style.display='inline'; Codehighlighter1_232_298_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_232_298_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_232_298_Closed_Text.style.display='none'; Codehighlighter1_232_298_Open_Image.style.display='inline'; Codehighlighter1_232_298_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />        </span><span id="Codehighlighter1_232_298_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_232_298_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />             srcImage </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> resize(srcImage, width, hight);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />        }</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        ImageIO.write(srcImage, </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">JPEG</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">, saveFile);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        in.close();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div></span></span>
		<br />
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">参数解释：</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">in</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">：：是一个</span>
				<span lang="EN-US">jpg</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">图片的</span>
				<span lang="EN-US">InputStream</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">saveFile</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">：：目标文件</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">width</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">：：目标宽度，如果不需要缩放则置</span>
				<span lang="EN-US">0</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">hight</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">：：目标高度，如果不需要缩放则置</span>
				<span lang="EN-US">0</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US"> <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US"> <o:p></o:p></span>
		</p>
		<span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">然后是将</span>
		<span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体">InputStream</span>
		<span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">保存为</span>
		<span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体">gif</span>
		<span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">文件：<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> saveImageAsGif(InputStream in, File fileToSave,</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> width, </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> hight)<br /><img id="Codehighlighter1_118_476_Open_Image" onclick="this.style.display='none'; Codehighlighter1_118_476_Open_Text.style.display='none'; Codehighlighter1_118_476_Closed_Image.style.display='inline'; Codehighlighter1_118_476_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_118_476_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_118_476_Closed_Text.style.display='none'; Codehighlighter1_118_476_Open_Image.style.display='inline'; Codehighlighter1_118_476_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />            </span><span style="COLOR: #0000ff">throws</span><span style="COLOR: #000000"> Exception </span><span id="Codehighlighter1_118_476_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_118_476_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        BufferedImage srcImage;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        srcImage </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> ImageIO.read(in);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(width</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">&amp;&amp;</span><span style="COLOR: #000000"> hight </span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">)<br /><img id="Codehighlighter1_231_297_Open_Image" onclick="this.style.display='none'; Codehighlighter1_231_297_Open_Text.style.display='none'; Codehighlighter1_231_297_Closed_Image.style.display='inline'; Codehighlighter1_231_297_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_231_297_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_231_297_Closed_Text.style.display='none'; Codehighlighter1_231_297_Open_Image.style.display='inline'; Codehighlighter1_231_297_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />        </span><span id="Codehighlighter1_231_297_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_231_297_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />             srcImage </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> resize(srcImage, width, hight);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />        }</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        FileOutputStream out </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> FileOutputStream(fileToSave);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        GifEncoder encoder </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> GifEncoder(srcImage, out);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        encoder.encode();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        in.close();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div><br /><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">参数解释：</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman">in</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">：：是一个</span><span lang="EN-US"><font face="Times New Roman">jpg</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">或者</span><span lang="EN-US"><font face="Times New Roman">gif</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">图片的</span><span lang="EN-US"><font face="Times New Roman">InputStream</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman">saveFile</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">：：目标文件</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman">width</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">：：目标宽度，如果不需要缩放则置</span><span lang="EN-US"><font face="Times New Roman">0</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman">hight</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">：：目标高度，如果不需要缩放则置</span><span lang="EN-US"><font face="Times New Roman">0</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"> <o:p></o:p></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman">GifEncoder</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这个类是</span><span lang="EN-US"><font face="Times New Roman">java api</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中没有的，也是我找寻了很久的一个东西。它是</span><span lang="EN-US"><font face="Times New Roman">Acme.JPM.Encoders.GifEncoder</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，只要找到这个包，将</span><span lang="EN-US"><font face="Times New Roman">jpg</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">转为</span><span lang="EN-US"><font face="Times New Roman">gif</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">就不是问题了。</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"> <o:p></o:p></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"> <o:p></o:p></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman">Jpg</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">图片使用的是</span><span lang="EN-US"><font face="Times New Roman">24-bit</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的编码，</span><span lang="EN-US"><font face="Times New Roman">png</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">有</span><span lang="EN-US"><font face="Times New Roman">png-24</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</span><span lang="EN-US"><font face="Times New Roman">png-8</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">两种，但是</span><span lang="EN-US"><font face="Times New Roman">gif</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是</span><span lang="EN-US"><font face="Times New Roman">8-bit</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的编码。如果强行将</span><span lang="EN-US"><font face="Times New Roman">jpg</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">图片信息流按字节拆开，转换成</span><span lang="EN-US"><font face="Times New Roman">gif</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">图片，即使使用标准</span><span lang="EN-US"><font face="Times New Roman">256</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">色，也会出现严重的失真。</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"> <o:p></o:p></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">我曾经使用了</span><span lang="EN-US"><font face="Times New Roman">gif4j_light_trial_1.0.jar</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这个包，但是这个包让我很失望。尽管它可以将多张图片合成一个动态的</span><span lang="EN-US"><font face="Times New Roman">gif</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">图片，但是它是付费的，免费使用期只有一个月。并且，在使用它将</span><span lang="EN-US"><font face="Times New Roman">jpg</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">图片转换成</span><span lang="EN-US"><font face="Times New Roman">gif</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">图片之后中间会有一条白色的横线，不知道这是系统的缺陷还是在费用包中做的手脚。</span></p></span>
<img src ="http://www.blogjava.net/PrettyBoyCyb/aggbug/80922.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/PrettyBoyCyb/" target="_blank">PrettyBoy</a> 2006-11-13 16:31 <a href="http://www.blogjava.net/PrettyBoyCyb/archive/2006/11/13/80922.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>