??xml version="1.0" encoding="utf-8" standalone="yes"?>在线aⅴ亚洲中文字幕,无码乱人伦一区二区亚洲一,亚洲伊人久久大香线蕉苏妲己http://www.tkk7.com/hua/category/10660.html即世界明天毁灭Q我也要在今天种下我的葡萄树?zh-cnFri, 02 Mar 2007 06:41:17 GMTFri, 02 Mar 2007 06:41:17 GMT60Java 中文问题的根源分析及解决 http://www.tkk7.com/hua/articles/56558.html?/dc:creator>?/author>Tue, 04 Jul 2006 08:46:00 GMThttp://www.tkk7.com/hua/articles/56558.htmlhttp://www.tkk7.com/hua/comments/56558.htmlhttp://www.tkk7.com/hua/articles/56558.html#Feedback0http://www.tkk7.com/hua/comments/commentRss/56558.htmlhttp://www.tkk7.com/hua/services/trackbacks/56558.html 在基?Java 语言的编E中Q我们经常碰到汉字的处理及显C的问题。一大堆看不懂的q肯定不是我们愿意看到的显C效果,怎样才能够让那些汉字正确昄呢?Java 语言默认的编码方式是UNICODE Q而我们中国h通常使用的文件和数据库都是基?GB2312 或?BIG5 {方式编码的Q怎样才能够恰当地选择汉字~码方式q正地处理汉字的编码呢Q本文将从汉字编码的常识入手Q结?Java ~程实例Q分析以上两个问题ƈ提出解决它们的方案?

现在 Java ~程语言已经q泛应用于互联网世界Q早?Sun 公司开?Java 语言的时候,已l考虑到对非英文字W的支持了。Sun 公司公布?Java q行环境QJREQ本w就分英文版和国际版Q但只有国际版才支持非英文字W。不q在 Java ~程语言的应用中Q对中文字符的支持ƈ非如?Java Soft 的标准规范中所宣称的那样完,因ؓ中文字符集不只一个,而且不同的操作系l对中文字符的支持也不尽相同Q所以会有许多和汉字~码处理有关的问题在我们q行应用开发中困扰着我们。有很多关于q些问题的解{,但都比较琐碎Qƈ不能够满_家迫切解决问题的愿望Q关?Java 中文问题的系l研Iƈ不多Q本文从汉字~码常识出发Q分?Java 中文问题Q希望对大家解决q个问题有所帮助?

汉字~码的常?

我们知道Q英文字W一般是以一个字节来表示的,最常用的编码方法是 ASCII 。但一个字节最多只能区?56个字W,而汉字成千上万,所以现在都以双字节来表C汉字,Z能够与英文字W分开Q每个字节的最高位一定ؓ1Q这样双字节最多可以表C?4K格字W。我们经常碰到的~码方式?GB2312、BIG5、UNICODE {。关于具体编码方式的详细资料Q有兴趣的读者可以查阅相兌料。我肤浅谈一下和我们关系密切?GB2312 ?UNICODE。GB2312 码,中华人民共和国国家标准汉字信息交换用~码Q是一个由中华人民共和国国家标准d发布的关于简化汉字的~码Q通行于中国大陆地区及新加坡,U国标码。两个字节中Q第一个字节(高字节)的gؓ区号值加32Q?0HQ,W二个字节(低字节)的gؓ位号值加32Q?0HQ,用这两个值来表示一个汉字的~码。UNICODE 码是微Y提出的解军_国字W问题的多字节等长编码,它对英文字符采取前面加?”字节的{略实现{长兼容。如 “A??ASCII 码ؓ0x41QUNICODE ׃ؓ0x00Q?x41。利用特D的工具各种~码之间可以互相转换?

Java 中文问题的初步认?

我们Z Java ~程语言q行应用开发时Q不可避免地要处理中文。Java ~程语言默认的编码方式是 UNICODEQ而我们通常使用的数据库及文仉是基?GB2312 ~码的,我们l常到q样的情况:览Z JSP 技术的|站看到的是qQ文件打开后看到的也是qQ被 Java 修改q的数据库的内容在别的场合应用时无法l箋正确地提供信息?

String sEnglish = “apple?

String sChinese = “苹果?

String s = “苹?apple ?

sEnglish 的长度是5QsChinese的长度是4Q?s 默认的长度是14。对?sEnglish来说Q?Java 中的各个c都支持得非常好Q肯定能够正显C。但对于 sChinese ?s 来说Q虽?Java Soft 声明 Java 的基本类已经考虑到对多国字符的支持(默认 UNICODE ~码Q,但是如果操作pȝ的默认编码不?UNICODE Q而是国标码等。从 Java 源代码到得到正确的结果,要经q?“Java 源代?> Java 字节?> ;虚拟?>操作pȝ->昄讑֤”的q程。在上述q程中的每一步骤Q我们都必须正确地处理汉字的~码Q才能够使最l的昄l果正确?

?Java 源代?> Java 字节码”,标准?Java ~译?javac 使用的字W集是系l默认的字符集,比如在中?Windows 操作pȝ上就?GBK ,而在 Linux 操作pȝ上就是ISO-8859-1Q所以大家会发现?Linux 操作pȝ上编译的cM源文件中的中文字W都Z问题Q解决的办法是在编译的时候添?encoding 参数Q这h能够与^台无兟뀂用法是

javac –encoding GBK?

?Java 字节?>虚拟?>操作pȝ”, Java q行环境 QJREQ?分英文版和国际版Q但只有国际版才支持非英文字W?Java 开发工具包 QJDKQ?肯定支持多国字符Q但q所有的计算机用户都安装?JDK 。很多操作系l及应用软gZ能够更好的支?Java Q都内嵌?JRE 的国际版本,己支持多国字W提供了方便?

“操作系l?>昄讑֤”,对于汉字来说Q操作系l必L持ƈ能够昄它。英文操作系l如果不搭配Ҏ的应用Y件的话,是肯定不能够昄中文的?

q有一个问题,是?Java ~程q程中,对中文字W进行正的~码转换。例如,向网输Z文字W串的时候,不论你是?

out.println(string); // string 是含中文的字W串

q是?

Q都必须?UNICODE ?GBK 的{换,或者手动,或者自动。在 JSP 1.0中,可以定义输出字符集,从而实现内码的自动转换。用法是


但是在一?JSP 版本中ƈ没有提供对输出字W集的支持,Q例?JSP 0.92Q,q就需要手动编码输ZQ方法非常多。最常用的方法是

String s1 = request.getParameter(“keyword?;

String s2 = new String(s1.getBytes(“ISO-8859-1?,”GBK?;

getBytes Ҏ用于中文字W以“ISO-8859-1”编码方式{化成字节数组Q而“GBK?是目标编码方式。我们从以ISO-8859-1方式~码的数据库中读Z文字W串 s1 Q经q上q{换过E,在支?GBK 字符集的操作pȝ和应用Y件中p够正显CZ文字W串 s2 ?

Java 中文问题的表层分析及处理

背景

开发环?
JDK1.15
Vcafe2.0
JPadPro

服务器端
NT IIS
Sybase System
JconnectQJDBCQ?

客户?
IE5.0
Pwin98


.CLASS 文g存放在服务器端,由客L的浏览器q行 APPLET Q?APPLET 只v调入 FRAME cȝȝ序的作用。界面包?Textfield QTextAreaQListQChoice {?

I. 取中?

?JDBC 执行 SELECT 语句从服务器端读取数据(中文Q后Q将数据?APPEND Ҏ加到 TextAreaQTAQ?Q不能正显C。但加到 List 中时Q大部分汉字却可正确昄?

数据按“ISO-8859-1?~码方式转化为字节数l,再按pȝ~省~码方式 QDefault Character EncodingQ?转化?STRING Q即可在 TA ?List 中正显C?

E序D如下:

dbstr2 = results.getString(1);

//After reading the result from DB serverQconverting it to string.

dbbyte1 = dbstr2.getBytes(“iso-8859-1?;

dbstr1 = new String(dbbyte1);

在{换字W串时不采用pȝ默认~码方式Q而直接采用?GBK?或?“GB2312?,?A ?B 两种情况下,从数据库取数据都没有问题?

II. 写中文到数据?

处理方式与“取中文”相逆,先将 SQL 语句按系l缺省编码方式{化ؓ字节数组Q再按“ISO-8859-1”编码方式{化ؓ STRING Q最后送去执行Q则中文信息可正写入数据库?

E序D如下:

sqlstmt = tf_input.getText();

//Before sending statement to DB serverQconverting it to sql statement.

dbbyte1 = sqlstmt.getBytes();

sqlstmt = newString(dbbyte1,”iso-8859-1?;

_stmt = _con.createStatement();

_stmt.executeUpdate(sqlstmt);

…?

问题Q如果客h上存?CLASSPATH 指向 JDK ?CLASSES.ZIP ӞUCؓ A 情况Q,上述E序代码可正执行。但是如果客h只有览器,而没?JDK ?CLASSPATH ӞUCؓ B 情况Q,则汉字无法正{换?

我们的分析:

1.l过试Q在 A 情况下,E序q行时系l的~省~码方式?GBK 或?GB2312 。在 B 情况下,E序启动时浏览器?JAVA 控制C出现如下错误信息Q?

Can't find resource for sun.awt.windows.awtLocalization_zh_CN

然后pȝ的缺省编码方式ؓ?859-1”?

2.如果在{换字W串时不采用pȝ~省~码方式Q而是直接采用 “GBK?或“GB2312”,则在 A 情况下程序仍然可正常q行Q在 B 情况下,pȝ出现错误Q?

UnsupportedEncodingException?

3.在客h上,?JDK ?CLASSES.ZIP 解压后,攑֜另一个目录中Q?CLASSPATH 只包含该目录。然后一辚w步删除该目录中?.CLASS 文gQ另一边运行测试程序,最后发现在一千多?CLASS 文g中,只有一个是必不可少的,该文件是Q?

sun.io.CharToByteDoubleByte.class?

该文g拷到服务器端和其它的cL在一Pq在E序的开?IMPORT 它,?B 情况下程序仍然无法正常运行?

4.?A 情况下,如果?CLASSPTH 中去?sun.io.CharToByteDoubleByte.class Q则E序q行时测得默认编码方式ؓ?859-1”,否则?“GBK??“GB2312??

如果 JDK 的版本ؓ1.2以上的话Q在 B 情况下遇到的问题得到了很好的解决Q测试的步骤同上Q有兴趣的读者可以尝试一下?br />在简体中?MS Windows 98 + JDK 1.3 下,可以?System.getProperties() 得到 Java q行环境的一些基本属性,c?PoorChinese 可以帮助我们得到q些属性?

c?PoorChinese 的源代码Q?

public class PoorChinese {

public static void main(String[] args) {

System.getProperties().list(System.out);

}

}

执行 java PoorChinese 后,我们会得?

pȝ变量 file.encoding 的gؓ GBK Quser.language 的gؓ zh Q?user.region 的gؓ CN Q这些系l变量的值决定了pȝ默认的编码方式是 GBK ?

在上q系l中Q下面的代码?GB2312 文g转换?Big5 文gQ它们能够帮助我们理?Java 中汉字编码的转化:


import java.io.*;

import java.util.*;


public class gb2big5 {


static int iCharNum=0;


public static void main(String[] args) {

System.out.println("Input GB2312 file, output Big5 file.");

if (args.length!=2) {

System.err.println("Usage: jview gb2big5 gbfile big5file");

System.exit(1);

}

String inputString = readInput(args[0]);

writeOutput(inputString,args[1]);

System.out.println("Number of Characters in file: "+iCharNum+".");

}


static void writeOutput(String str, String strOutFile) {

try {

FileOutputStream fos = new FileOutputStream(strOutFile);

Writer out = new OutputStreamWriter(fos, "Big5");

out.write(str);

out.close();

}

catch (IOException e) {

e.printStackTrace();

e.printStackTrace();

}

}


static String readInput(String strInFile) {

StringBuffer buffer = new StringBuffer();

try {

FileInputStream fis = new FileInputStream(strInFile);

InputStreamReader isr = new InputStreamReader(fis, "GB2312");

Reader in = new BufferedReader(isr);

int ch;

while ((ch = in.read()) > -1) {

iCharNum += 1;

buffer.append((char)ch);

}

in.close();

return buffer.toString();

}

catch (IOException e) {

e.printStackTrace();

return null;

}

}

}


~码转化的过E如下:

ByteToCharGB2312 CharToByteBig5

GB2312------------------>Unicode------------->Big5

执行 java gb2big5 gb.txt big5.txt Q如?gb.txt 的内Ҏ“今天星期三”,则得到的文g big5.txt 中的字符能够正确昄Q而如?gb.txt 的内Ҏ“情快乐”,则得到的文g big5.txt 中对应于“节”和“乐”的字符都是W号“?”(0x3FQ,可见 sun.io.ByteToCharGB2312 ?sun.io.CharToByteBig5 q两个基本类q没有编好?

正如上例一P Java 的基本类也可能存在问题。由于国际化的工作ƈ不是在国内完成的Q所以在q些基本cd布之前,没有l过严格的测试,所以对中文字符的支持ƈ不像 Java Soft 所声称的那样完。前不久Q我的一位技术上的朋友发信给我说Q他l于扑ֈ?Java Servlet 中文问题的根源。两周以来,他一直ؓ Java Servlet 的中文问题所困扰Q因为每面对一个含有中文字W的字符串都必须q行强制转换才能够得到正的l果Q这好象是大家公认的唯一的解军_法)。后来,他确实不惛_此l安分下MQ因L事情实不应该是高E序员所要做的工作,他就扑և Servlet 解码的源代码q行分析Q因Z怀疑问题就出在解码q部分。经q四个小时的奋斗Q他l于扑ֈ了问题的Ҏ所在。原来他的怀疑是正确的, Servlet 的解码部分完全没有考虑双字节,直接?%XX 当作一个字W。(原来 Java Soft 也会犯这qZU的错误Q)

如果你对q个问题有兴或者遇C同样的烦恼的话,你可以按照他的步骤对 Servlet.jar q行修改Q?

扑ֈ源代?HttpUtils 中的 static private String parseName Q在q回前将 sbQStringBufferQ?复制?byte bs[] Q然?return new String(bs,”GB2312?。作上述修改后就需要自p码了Q?

HashTable form=HttpUtils .parseQueryString(request.getQueryString())或?

form=HttpUtils.parsePostData(…?

千万别忘了编译后攑ֈ Servlet.jar 里面?

五?关于 Java 中文问题的ȝ

Java ~程语言成长于网l世界,q就要求 Java 对多国字W有很好的支持?Java ~程语言适应了计的|络化的需求,为它能够在网l世界迅速成长奠定了坚实的基?Java 的缔造?QJava SoftQ?已经考虑?Java ~程语言对多国字W的支持Q只是现在的解决Ҏ有很多缺陷在里面Q需要我们付怸些补偿性的措施。而世界标准化l织也在努力把hcL有的文字l一在一U编码之中,其中一U方案是 ISO10646 Q它用四个字节来表示一个字W。当Ӟ在这U方案未被采用之前,q是希望 Java Soft 能够严格地测试它的品,为用户带来更多的方便?

附一个用于从数据库和|络中取Z文ؕ码的处理函数Q入参是有问题的字符Ԍ出参是问题已l解决了的字W串?

String parseChinese(String in)

{

String s = null;

byte temp [];

if (in == null)

{

System.out.println("Warn:Chinese null founded!");

return new String("");

}

try

{

temp=in.getBytes("iso-8859-1");

temp=in.getBytes("iso-8859-1");

s = new String(temp);

}

{

System.out.println("Warn:Chinese null founded!");

return new String("");

}

try

{

temp=in.getBytes("iso-8859-1");

s = new String(temp);

}

catch(UnsupportedEncodingException e)

{

System.out.println (e.toString());

}

return s;

}


]]>
JAVA 在图像处理中的应?/title><link>http://www.tkk7.com/hua/articles/56464.html</link><dc:creator>?/dc:creator><author>?/author><pubDate>Tue, 04 Jul 2006 01:41:00 GMT</pubDate><guid>http://www.tkk7.com/hua/articles/56464.html</guid><wfw:comment>http://www.tkk7.com/hua/comments/56464.html</wfw:comment><comments>http://www.tkk7.com/hua/articles/56464.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/hua/comments/commentRss/56464.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/hua/services/trackbacks/56464.html</trackback:ping><description><![CDATA[ <font face="Courier New">怿大家qx到q一些在JAVA中对囑փq行处理的需求,比如需要对上传的图片加上自q{֐或图标,或者生成和解析动态的GIF囄Q以及处理PSD文g囑փ信息。本文就JAVA在图像处理中一些基本应用进行了介绍。希望通过能够对大家在以后的图像处理中有些帮助?br />一、对一个现有的囄q行文字和图标的合成<br />                      <br />我们先从下面的这D늮单的代码开?br />import java.awt.*; <br />import javax.imageio.ImageIO;<br />import com.sun.image.codec.jpeg.*;<br />/** <br />* @author Anders.Hu<br />* 2005-01-12<br />*/<br />public class Test {<br />public static void main(String[] args) {<br /> try {<br />   //d模板囄内容<br />   BufferedImage image = ImageIO.read(new FileInputStream("c:\\1.jpg"));<br />   Graphics2D g = image.createGraphics();//得到囑Ş上下?br />   g.setColor(Color.BLACK); //讄ȝ颜色<br />   //讄字体<br />   g.setFont(new Font("宋体", Font.LAYOUT_LEFT_TO_RIGHT, 15));//写入{֐<br />   g.drawString("很好吃诶Q要不要也来一口?",43, image.getHeight() - 10);<br />   g.dispose();<br />   FileOutputStream out = new FileOutputStream("c:\\2.jpg");<br />   JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);<br />   encoder.encode(image);<br />   out.close();<br />   } catch(Exception e) {<br />    e.printStackTrace();<br />   }<br />}<br />} <br /><br />怿大家看到q里已经知道了大致的操作q程Q我xq是在这里把基本的原理简单说明一下便于对后箋内容的阐qͼ首先我们通过javax.imageio.ImageIO的readҎd囑փ在BufferedImage中,然后我们可以通过BufferedImage的createGraphicsҎ取得囑փ的上下文便于对图像的处理Q如加上自己喜爱的文字或囄{,最后调用JPEGCodec的encodeҎq行JPEG~码,然后是保存到文件中了?br />q就是我q行上面代码的结?br /><br />需要提出的是JPEGCodec是非标准c,如果E序是运行JDK1.4以上版本的话,可以采取以下代码q行JPEG~码ImageIO.write(image, "JPEG", out);<br />可能在你的实际需求还要加入一些图标的修饰Q要做到q一步,我们只需要在上面的代码中利用Graphics2D的drawImageҎ做到。下面是加入图标的代?br />public static void main(String[] args) {<br /> try {<br />    BufferedImage image = ImageIO.read(new FileInputStream("c:\\1.jpg"));<br />    //d图标<br />    BufferedImage image_biao = ImageIO.read(new FileInputStream("c:\\i.jpg"));<br />    Graphics2D g = image.createGraphics();<br />    g.setColor(Color.YELLOW);<br />    g.setFont(new Font("宋体", Font.LAYOUT_LEFT_TO_RIGHT, 25));<br />    g.drawString("很好吃诶Q要不要也来一口?",43, image.getHeight() - 80);<br />    //写入图标<br />    g.drawImage(image_biao, 20,image.getHeight() - 80, image_biao.getWidth(null),<br />      image_biao.getHeight(null), null);<br />    g.dispose();<br />    FileOutputStream out = new FileOutputStream("c:\\3.jpg");<br />    JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);<br />    encoder.encode(image);<br />    out.close();<br />   } catch(Exception e) {<br />    e.printStackTrace();<br />   }<br />} <br /><br />代码q行的结果如?br /><br />二、生成和解析动态的GIF囄<br />有了以上对图象的基本处理之后Q我们再来看看对动态GIF囄的处理?br />GIF是一U由CompuServe创徏的压~和传送图像文件的格式?br />GIF囑փ是基于颜色列表的Q存储的数据是该点的颜色对应于颜色列表的索引|Q最多只支持8位(256Ԍ。GIF文g内部分成许多存储块,用来存储多幅囑փQFrameQ或者是军_囑փ表现行ؓ的控制块Q用以实现动d交互式应用。因此我们要生成和分析GIF囑փ的话Q就需要对GIF文g格式q行分析Q这里我们采用网上的一个开源代码进行处理?br />先在http://www.fmsware.com/stuff/gif.zip 下蝲处理GIF囄的代码,解压之后可以发现有AnimatedGifEncoder.java, GifDecoder.java, LZWEncoder.java,NeuQuant.javaq?个JAVA文gQ在q些文g的开头都已经有了单的说明。其中AnimatedGifEncoder.是用来生成GIF文g的类Q而GifDecoder则是用来解析GIF动态图像Frame信息的类。LZWEncoder是LZW压羃法c,NeuQuant是用来生成颜色列表的cR?br />把它们加入到我们的项目文件中Q然后我们就来利用AnimatedGifEncoder来写一D合成动态GIF文g的代码?br />import java.io.FileInputStream;<br />import javax.imageio.ImageIO;<br />import open.AnimatedGifEncoder; <br />/** <br />* @author Anders.Hu<br />* 2005-01-13<br />*/<br />public class TestMakeGIF {<br />public static void main(String[] args) {<br /> try {<br />  //指定Frame的文?br />  String imgFileName[] = new String[]{"c:\\1.jpg","c:\\2.jpg", "c:\\3.jpg"}; <br />  String outputFileName = "c:\\test.gif";<br />  AnimatedGifEncoder e = new AnimatedGifEncoder();<br />  e.start(outputFileName);//开始处?br />  e.setDelay(500); //讄延迟旉<br />  for (int i = 0; i < imgFileName.length; i++) {<br />   e.addFrame(ImageIO.read(new FileInputStream(imgFileName[i])));//加入Frame<br />  }<br />  e.finish();<br /> } catch (Exception e) {<br />  e.printStackTrace();<br />}<br />}<br /><br /><br />代码q行的结果如?br /><br />是不是觉得有了这个AnimatedGifEncoderc,合成GIF文g挺方便的Q现在我们再来看看GifDecoder的用?br />public class TestGifDecoder {<br />public static void main(String[] args) {<br /> try {<br />  String inputFileName = "c:\\test.gif";<br />  GifDecoder decoder = new GifDecoder();<br />  decoder.read(inputFileName);<br />  int n = decoder.getFrameCount();//得到frame的个?br />  for (int i = 0; i < n; i++) {<br />   BufferedImage frame = decoder.getFrame(i); //得到frame<br />   int delay = decoder.getDelay(i);//得到延迟旉<br />   //生成JPG文g<br />   String outFilePath = "c:\\test_"+i+".jpg";<br />   FileOutputStream out = new FileOutputStream(outFilePath);<br />   ImageIO.write(frame,"jpeg",out);<br />  }<br /> } catch (Exception e) {<br />  e.printStackTrace();<br /> }<br />}<br />} <br /><br />代码q行完毕之后Q就可以生成了相应的4个jpg文g?br />对于以上的代码有下面几点需要补充:<br />1Q?我测试过使用BMP文g的情况,但是没有通过代码的测试,可能是在把BMP囑փ转ؓ256色图像时出现了错误。所以在使用之前q需要用其他工具把BMP文g转ؓJPG格式?br />2Q?在合成GIF文g的AnimatedGifEncodercM有下面几个值得x的函?br />2.1QsetFrameRateQfloatQ每U种播放的?br />2.2QsetQuality(int quality) 讄在GIF规范中{换ؓ256位图像时的质量参数这个D|的小Q质量越高,但速度慢Q反之依Ӟ不过过20以后Q速度不会有明昄提升Q默认ؓ10?br />2.3QsetSize(int x,int y) 讄GIF囑փ的大,默认gؓW一个加入的帧的囑փ的大?br />三、对PSD囑փ文g的分?br />我们先用PSҎ板图片加上一串字W,保存为TestPsd.psdQ注意保存时不要合ƈ囑ֱ。然后从http://www.fmsware.com/stuff/PSDReader.java 下蝲一个分析PSD代码的JAVA文gQƈ加入到我们的目中。ƈq行下面的代?br />import java.awt.Point;<br />import java.awt.image.BufferedImage;<br />import java.io.FileOutputStream;<br />import open.PSDReader;<br />import com.sun.image.codec.jpeg.*;<br />/**<br />* @author Ander.Hu<br />* 2005-10-13<br />*/<br />public class TestPsd {<br /> public static void main(String[] args) {<br />  try {<br />  PSDReader r = new PSDReader();<br />      r.read("c:\\testPsd.psd");<br />       int n = r.getFrameCount();<br />       for (int i = 0; i < n; i++) {<br />          BufferedImage image = r.getLayer(i);<br />          Point offset = r.getLayerOffset(i);<br />          //生成JPG文g<br />    String outFilePath = "c:\\testPsd_"+i+".jpg";<br />    FileOutputStream out = new FileOutputStream(outFilePath);<br />    JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);<br />    encoder.encode(image);<br />       }<br /> } catch(Exception e) {<br />  e.printStackTrace();<br /> }<br />}<br />} <br /><br />此时我们便可以发?个解析后的JPG文gQ因为包括背景图层在内有3个图层,故有3个JPG文g?目前PSDReader cd支持没有压羃q的或者用RLE压羃的RGB文gQƈ且也不支持PS3.0以上的特D功能?br />ȝ<br />在JAVA对图像的处理q程中,通常基本步骤是通过d囑փ信息到图像缓冲中Q?gt;同时取得囑Ş上下文->对图像进行相应的处理Q?gt;生成囑փ文g?</font> <img src ="http://www.tkk7.com/hua/aggbug/56464.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/hua/" target="_blank">?/a> 2006-07-04 09:41 <a href="http://www.tkk7.com/hua/articles/56464.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JAR文g包及jar命o详解http://www.tkk7.com/hua/articles/45855.html?/dc:creator>?/author>Fri, 12 May 2006 07:35:00 GMThttp://www.tkk7.com/hua/articles/45855.htmlhttp://www.tkk7.com/hua/comments/45855.htmlhttp://www.tkk7.com/hua/articles/45855.html#Feedback0http://www.tkk7.com/hua/comments/commentRss/45855.htmlhttp://www.tkk7.com/hua/services/trackbacks/45855.html常常在网上看到有问:如何?java E序~译?.exe 文g。通常回答只有两种Q一U是制作一个可执行?JAR 文g包,然后可以像.chm 文档一样双击运行了Q而另一U是使用 JET 来进?~译。但?JET 是要用钱买的Q而且据说 JET 也不是能把所有的 Java E序都编译成执行文gQ性能也要打些折扣。所以,使用制作可执?JAR 文g包的Ҏ是最佳选择了,何况它还能保?Java 的跨q_Ҏ?

  下面来看看什么是 JAR 文g包吧Q?

  1. JAR 文g?

  JAR 文g是 Java Archive FileQ顾名思意Q它的应用是?Java 息息相关的,?Java 的一U文格式。JAR 文g非常cM ZIP 文g——准的_它就?ZIP 文gQ所以叫它文件包。JAR 文g?ZIP 文g唯一的区别就是在 JAR 文g的内容中Q包含了一?META-INF/MANIFEST.MF 文gQ这个文件是在生?JAR 文g的时候自动创建的。D个例子,如果我们h如下目录l构的一些文Ӟ

  ==

  `-- test

    `-- Test.class

  把它压羃?ZIP 文g test.zipQ则q个 ZIP 文g的内部目录结构ؓQ?

  test.zip

  `-- test

    `-- Test.class

  如果我们使用 JDK ?jar 命o把它打成 JAR 文g?test.jarQ则q个 JAR 文g的内部目录结构ؓQ?

  test.jar

  |-- META-INF

  |  `-- MANIFEST.MF

  `-- test

    `--Test.class

  2. 创徏可执行的 JAR 文g?

  制作一个可执行?JAR 文g包来发布你的E序?JAR 文g包最典型的用法?

  Java E序是由若干?.class 文gl成的。这?.class 文g必须Ҏ它们所属的包不同而分U分目录存放Q运行前需要把所有用到的包的根目录指定给 CLASSPATH 环境变量或?java 命o?-cp 参数Q运行时q要到控制台下去使用 java 命o来运行,如果需要直接双击运行必d Windows 的批处理文g (.bat) 或?Linux ?Shell E序。因此,许多QJava 是一U方便开发者苦了用LE序设计语言?

  其实不然Q如果开发者能够制作一个可执行?JAR 文g包交l用P那么用户使用h方便了。在 Windows 下安?JRE (Java Runtime Environment) 的时候,安装文g会将 .jar 文g映射l?javaw.exe 打开。那么,对于一个可执行?JAR 文g包,用户只需要双d可以运行程序了Q和阅读 .chm 文一h?(.chm 文默认是由 hh.exe 打开?。那么,现在的关键,是如何来创个可执行?JAR 文g包?

  创徏可执行的 JAR 文g包,需要用带 cvfm 参数?jar 命oQ同样以上述 test 目录ZQ命令如下:

jar cvfm test.jar manifest.mf test

  q里 test.jar ?manifest.mf 两个文gQ分别是对应的参?f ?mQ其重头戏在 manifest.mf。因创徏可执行的 JAR 文g包,光靠指定一?manifest.mf 文g是不够的Q因?MANIFEST ?JAR 文g包的特征Q可执行?JAR 文g包和不可执行?JAR 文g包都包含 MANIFEST。关键在于可执行 JAR 文g包的 MANIFESTQ其内容包含?Main-Class 一V这?MANIFEST 中书写格式如下:

  Main-Class: 可执行主cd?包含包名)

  例如Q假设上例中?Test.class 是属?test 包的Q而且是可执行的类 (定义?public static void main(String[]) Ҏ)Q那么这?manifest.mf 可以~辑如下Q?

Main-Class: test.Test <回R>

  q个 manifest.mf 可以攑֜M位置Q也可以是其它的文g名,只需要有 Main-Class: test.Test 一行,且该行以一个回车符l束卛_。创Z manifest.mf 文g之后Q我们的目录l构变ؓQ?

  ==

  |-- test

  |  `-- Test.class

  `-- manifest.mf

  q时候,需要到 test 目录的上U目录中M?jar 命o来创?JAR 文g包。也是在目录树中用?=”表C的那个目录中,使用如下命oQ?

jar cvfm test.jar manifest.mf test

  之后在?=”目录中创徏?test.jarQ这?test.jar 是执行?JAR 文g包。运行时只需要?java -jar test.jar 命o卛_?

  需要注意的是,创徏?JAR 文g包中需要包含完整的、与 Java E序的包l构对应的目录结构,像上例一栗?Main-Class 指定的类Q也必须是完整的、包含包路径的类名,如上例的 test.TestQ而且在没有打?JAR 文g包之前可以?java <cd> 来运行这个类Q即在上例中 java test.Test 是可以正运行的 (当然要在 CLASSPATH 正确的情况下)?

  3. jar 命o详解

  jar 是随 JDK 安装的,?JDK 安装目录下的 bin 目录中,Windows 下文件名?jar.exeQLinux 下文件名?jar。它的运行需要用?JDK 安装目录?lib 目录中的 tools.jar 文g。不q我们除了安?JDK 什么也不需要做Q因?SUN 已经帮我们做好了。我们甚至不需要将 tools.jar 攑ֈ CLASSPATH 中?

  使用不带M?jar 命o我们可以看到 jar 命o的用法如下:

  jar {ctxu}[vfm0M] [jar-文g] [manifest-文g] [-C 目录] 文g?...

  其中 {ctxu} ?jar 命o的子命oQ每?jar 命o只能包含 ctxu 中的一个,它们分别表示Q?

   -c 创徏新的 JAR 文g?

   -t 列出 JAR 文g包的内容列表

   -x 展开 JAR 文g包的指定文g或者所有文?

   -u 更新已存在的 JAR 文g?(d文g?JAR 文g包中)

     [vfm0M] 中的选项可以任选,也可以不选,它们?jar 命o的选项参数

   -v 生成详细报告q打印到标准输出

   -f 指定 JAR 文g名,通常q个参数是必ȝ

   -m 指定需要包含的 MANIFEST 清单文g

   -0 只存储,不压~,q样产生?JAR 文g包会比不用该参数产生的体U大Q但速度更快

   -M 不生所有项的清单(MANIFEST〕文Ӟ此参C忽略 -m 参数

     [jar-文g] 即需要生成、查看、更新或者解开?JAR 文g包,它是 -f 参数的附属参?

     [manifest-文g] ?MANIFEST 清单文gQ它?-m 参数的附属参?

     [-C 目录] 表示转到指定目录下去执行q个 jar 命o的操作。它相当于先使用 cd 命o转该目录下再执行不带 -C 参数?jar 命oQ它只能在创建和更新 JAR 文g包的时候可用。  

  文g?... 指定一个文?目录列表Q这些文?目录是要添加到 JAR 文g包中的文?目录。如果指定了目录Q那?jar 命o打包的时候会自动把该目录中的所有文件和子目录打入包中?

  下面举一些例子来说明 jar 命o的用法:

  1) jar cf test.jar test

  该命令没有执行过E的昄Q执行结果是在当前目录生成了 test.jar 文g。如果当前目录已l存?test.jarQ那么该文g被覆盖?

  2) jar cvf test.jar test

  该命令与上例中的l果相同Q但是由?v 参数的作用,昄Z打包q程Q如下:

  标明清单(manifest)

  增加Qtest/(d= 0) (写出= 0)(存储?0%)

  增加Qtest/Test.class(d= 7) (写出= 6)(压羃?14%)

  3) jar cvfM test.jar test

  该命令与 2) l果cMQ但在生成的 test.jar 中没有包?META-INF/MANIFEST 文gQ打包过E的信息也略有差别:

  增加Qtest/(d= 0) (写出= 0)(存储?0%)

  增加Qtest/Test.class(d= 7) (写出= 6)(压羃?14%)

  4) jar cvfm test.jar manifest.mf test

  q行l果?2) 怼Q显CZ息也相同Q只是生?JAR 包中?META-INF/MANIFEST 内容不同Q是包含?manifest.mf 的内?

  5) jar tf test.jar

  ?test.jar 已经存在的情况下Q可以查?test.jar 中的内容Q如对于 2) ?3) 生成?test.jar 分别应该此命令,l果如下Q?

  对于 2)

  META-INF/

  META-INF/MANIFEST.MF

  test/

  test/Test.class

  对于 3)

  test/

  test/Test.class

  6) jar tvf test.jar

  除显C?5) 中显C的内容外,q包括包内文件的详细信息Q如Q?

  0 Wed Jun 19 15:39:06 GMT 2002 META-INF/

  86 Wed Jun 19 15:39:06 GMT 2002 META-INF/MANIFEST.MF

  0 Wed Jun 19 15:33:04 GMT 2002 test/

  7 Wed Jun 19 15:33:04 GMT 2002 test/Test.class

  7) jar xf test.jar

  解开 test.jar 到当前目录,不显CZQ何信息,对于 2) 生成?test.jarQ解开后的目录l构如下Q?

  ==

  |-- META-INF

  |  `-- MANIFEST

  `-- test

    `--Test.class

jar xvf test.jar

  q行l果?7) 相同Q对于解压过E有详细信息昄Q如Q?

  创徏QMETA-INF/

  展开QMETA-INF/MANIFEST.MF

  创徏Qtest/

  展开Qtest/Test.class

  9) jar uf test.jar manifest.mf

  ?test.jar 中添加了文g manifest.mfQ此使用 jar tf 来查?test.jar 可以发现 test.jar 中比原来多了一?manifest。这里顺便提一下,如果使用 -m 参数q指?manifest.mf 文gQ那?manifest.mf 是作为清单文?MANIFEST 来用的Q它的内容会被添加到 MANIFEST 中;但是Q如果作Z般文件添加到 JAR 文g包中Q它跟一般文件无异?

  10) jar uvf test.jar manifest.mf

  ?9) l果相同Q同时有详细信息昄Q如Q?

  增加Qmanifest.mf(d= 17) (写出= 19)(压羃?-11%)

  4. 关于 JAR 文g包的一些技?

  1) 使用 unzip 来解?JAR 文g

  在介l?JAR 文g的时候就已经说过了,JAR 文g实际上就?ZIP 文gQ所以可以用常见的一些解?ZIP 文g的工h解压 JAR 文gQ如 Windows 下的 WinZip、WinRAR {和 Linux 下的 unzip {。?WinZip ?WinRAR {来解压是因为它们解压比较直观,方便。而?unzipQ则是因为它解压时可以?-d 参数指定目标目录?

  在解压一?JAR 文g的时候是不能使用 jar ?-C 参数来指定解压的目标的,因ؓ -C 参数只在创徏或者更新包的时候可用。那么需要将文g解压到某个指定目录下的时候就需要先这?JAR 文g拯到目标目录下Q再q行解压Q比较麻烦。如果?unzipQ就不需要这么麻烦了Q只需要指定一?-d 参数卛_。如Q?

  unzip test.jar -d dest/

  2) 使用 WinZip 或?WinRAR {工具创?JAR 文g

  上面提到 JAR 文g是包含?META-INF/MANIFEST ?ZIP 文gQ所以,只需要?WinZip、WinRAR {工具创建所需?ZIP 压羃包,再往q个 ZIP 压羃包中d一个包?MANIFEST 文g?META-INF 目录卛_。对于?jar 命o?-m 参数指定清单文g的情况,只需要将q个 MANIFEST 按需要修改即可?

  3) 使用 jar 命o创徏 ZIP 文g

  有些 Linux 下提供了 unzip 命oQ但没有 zip 命oQ所以需要可以对 ZIP 文gq行解压Q即不能创徏 ZIP 文g。如要创Z?ZIP 文gQ用带 -M 参数?jar 命o卛_Q因?-M 参数表示制作 JAR 包的时候不d MANIFEST 清单Q那么只需要在指定目标 JAR 文g的地方将 .jar 扩展名改?.zip 扩展名,创徏的就是一个不折不扣的 ZIP 文g了,如将上一节的W?3) 个例子略作改动:

  jar cvfM test.zip test



]]>
վ֩ģ壺 ׾ƷŮ| Ʒһ| ѿһػaaƬ| þúݺݰۺӰԺ| ߹ۿhƬ| 7777þĻ| ĻӰwwwĻ| ŷɫŷ| һëƬ| һĻר| һ| þŮվ| 컶ëƬ| ƷŮٸaѾþ| Ļ߹ۿ| ѿĻɫƬ| պëƬѹۿ| ޾ƷƷ벻| պƷһ | Ļ뾫ƷԴþ | ձxxxxɫƵ| ҹ޾Ʒ| һҹߴ | һëƬ߲| AVþþƷ | 91ɫƵ޹ۿ| ޾Ʒһ| һAvëƬþþƷ| Ƭѿ| ޹˾žۺ| պƷӰһ| þƵ99| ɫվwww| Ļ޾Ʒ | ھƷþþþþþ| 99߹ۿ| Ƶ߹ۿѲӰԺ | ձһѸƵ | aѹۿ| һƵѹۿ| ޹պŮaaaaaaëƬ|