??xml version="1.0" encoding="utf-8" standalone="yes"?>
]]>public class EscapeUnescape {
public static String escape(String src) {
int i;
char j;
StringBuffer tmp = new StringBuffer();
tmp.ensureCapacity(src.length() * 6);
for (i = 0; i < src.length(); i++) {
j = src.charAt(i);
if (Character.isDigit(j) || Character.isLowerCase(j)
|| Character.isUpperCase(j))
tmp.append(j);
else if (j < 256) {
tmp.append("%");
if (j < 16)
tmp.append("0");
tmp.append(Integer.toString(j, 16));
} else {
tmp.append("%u");
tmp.append(Integer.toString(j, 16));
}
}
return tmp.toString();
}
public static String unescape(String src) {
StringBuffer tmp = new StringBuffer();
tmp.ensureCapacity(src.length());
int lastPos = 0, pos = 0;
char ch;
while (lastPos < src.length()) {
pos = src.indexOf("%", lastPos);
if (pos == lastPos) {
if (src.charAt(pos + 1) == 'u') {
ch = (char) Integer.parseInt(src
.substring(pos + 2, pos + 6), 16);
tmp.append(ch);
lastPos = pos + 6;
} else {
ch = (char) Integer.parseInt(src
.substring(pos + 1, pos + 3), 16);
tmp.append(ch);
lastPos = pos + 3;
}
} else {
if (pos == -1) {
tmp.append(src.substring(lastPos));
lastPos = src.length();
} else {
tmp.append(src.substring(lastPos, pos));
lastPos = pos;
}
}
}
return tmp.toString();
}
public static void main(String[] args) {
String tmp = "中文";
System.out.println("testing escape : " + tmp);
tmp = escape(tmp);
System.out.println(tmp);
System.out.println("testing unescape :" + tmp);
System.out.println(unescape("%u6211%u4eec"));
}
}
以上Z个工L(fng)Qؓ(f)解决中文q
html前台:escape(escape('你好'))
后台:String txt=EscapeUnescape.unescape(aStringText);
escape本n参数~码为ISO8859-1,escape中文传替lservlet?x)直接?f)null接收不到Q经q以上特D处理即可解?其他Ҏ(gu)也可Q如Q手动{?..
]]>
]]>
package com.helloikvm.simple;
public class SimpleReturnString {
public String returnString() {
return "Hello, IKVM!";
}
public void throwException() throws Exception {
throw new Exception("Hello, Exception!");
}
}
// import java package
using com.helloikvm.simple;
namespace IKVMTest
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void btnTest_Click(object sender, EventArgs e)
{
// Initialize the Java method
SimpleReturnString simpler = new SimpleReturnString();
// Call Java method
String returnString = simpler.returnString();
txtTest.Text = returnString;
}
}
}
]]>
/** public class MD5 |
JarResources JR=new JarResources(" http://www.bt285.cn /GifBundle.jar");
Image logo=Toolkit.getDefaultToolkit().createImage(JR.getResources("logo.gif"));
JarResources
对象Qƈ其初始化ؓ(f)包含我们要用的资源?/span> jar 文g -- images.jar
。随后我们?/span>JarResources
?/span>getResource()
Ҏ(gu)来?/span> logo.gif 文g的原始数据提供给 awt Toolkit ?/span>createImage()
Ҏ(gu)?/span>JarReources
cȝ重要数据域用来跟t和存储指定 jar 文g的内容:(x)public final class JarResources {
public boolean debugon=false;
private Hashtable htsizes=new Hashtable();
private Hashtable htjarcontents=new Hashtable();
private String jarfilename;
init()
Ҏ(gu)完成全部实际工作?/span>
public JarResources(String jarfilename) {
this.jarfilename=jarfilename;
init();
}
init()
Ҏ(gu)只将指定 jar 文g的整个内容加载到一?/span> hashtableQ通过资源名访问)(j)中?/span> ZipFile
cMؓ(f)我们提供?jin)?/span> jar/zip 档案头信息的基本讉KҎ(gu)。这cM于文件系l中的目录信息。下面我们列?/span>ZipFile
中的所有条目,q用档案中每个资源的大小d htsizes hashtableQ?/span> private void init() {
try {
// extracts just sizes only.
ZipFile zf=new ZipFile(jarFileName);
Enumeration e=zf.entries();
while (e.hasMoreElements()) {
ZipEntry ze=(ZipEntry)e.nextElement();
if (debugOn) {
System.out.println(dumpZipEntry(ze));
}
htSizes.put(ze.getName(),new Integer((int)ze.getSize()));
}
zf.close();
ZipInputStream
c访问档案?/span>ZipInputStream
cd成了(jin)全部术Q允许我们单独读取档案中的每个资源。我们从档案中读取组成每个资源的_字节敎ͼq将其存储在 htjarcontents hashtable 中,(zhn)可以通过资源名访问这些数据:(x)
// extract resources and put them into the hashtable.
FileInputStream fis=new FileInputStream(jarFileName);
BufferedInputStream bis=new BufferedInputStream(fis);
ZipInputStream zis=new ZipInputStream(bis);
ZipEntry ze=null;
while ((ze=zis.getNextEntry())!=null) {
if (ze.isDirectory()) {
continue;////啊哟!没有处理子目录中的资源啊 http://www.5a520.cn 说520|?/span>
}
if (debugOn) {
System.out.println(
"ze.getName()="+ze.getName()+","+"getSize()="+ze.getSize()
);
}
int size=(int)ze.getSize();
// -1 means unknown size.
if (size==-1) {
size=((Integer)htSizes.get(ze.getName())).intValue();
}
byte[] b=new byte[(int)size];
int rb=0;
int chunk=0;
while (((int)size - rb) > 0) {
chunk=zis.read(b,rb,(int)size - rb);
if (chunk==-1) {
break;
}
rb+=chunk;
}
// add to internal resource hashtable
htJarContents.put(ze.getName(),b);
if (debugOn) {
System.out.println(
ze.getName()+" rb="+rb+
",size="+size+
",csize="+ze.getCompressedSize()
);
}
}
} catch (NullPointerException e) {
System.out.println("done.");
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
ZipEntry
cd被命名ؓ(f) "java/util/zip/ZipEntry"Q而不?/span> "java.util.zip.ZipEntry"?/span> /**
* Dumps a zip entry into a string.
* @param ze a ZipEntry
*/
private String dumpZipEntry(ZipEntry ze) {
StringBuffer sb=new StringBuffer();
if (ze.isDirectory()) {
sb.append("d ");
} else {
sb.append("f ");
}
if (ze.getMethod()==ZipEntry.STORED) {
sb.append("stored ");
} else {
sb.append("defalted ");
}
sb.append(ze.getName());
sb.append("\t");
sb.append(""+ze.getSize());
if (ze.getMethod()==ZipEntry.DEFLATED) {
sb.append("/"+ze.getCompressedSize());
}
return (sb.toString());
}
/**
* Extracts a jar resource as a blob.
* @param name a resource name.
*/
public byte[] getResource(String name) {
return (byte[])htJarContents.get(name);
}
public static void main(String[] args) throws IOException {
if (args.length!=2) {
System.err.println(
"usage: java JarResources < jar file name> < resource name>"
);
System.exit(1);
}
JarResources jr=new JarResources(args[0]);
byte[] buff=jr.getResource(args[1]);
if (buff==null) {
System.out.println("Could not find "+args[1]+".");
} else {
System.out.println("Found "+args[1]+ " (length="+buff.length+").");
}
}
} // End of JarResources class.
微Y公司.Net框架与Java Swing的GUI~程相比要简单很多,同样是事仉动模?Net框架p行了(jin)大量的封装处理,.Net把这U封装称之ؓ(f)委托?Delegate)Q其代码如下Q?
作ؓ(f)Ҏ(gu)Q我们来看看Java Swing的事件处理和委托p复杂很多代码如下Q?/p>
|
Ҏ(gu)以上代码Q我们可以清晰的看到Java Swing要比.Net的麻?ch)的多,而且更不能让人忍受的是Q一个页面如果有多个按钮的话Q我们必针Ҏ(gu)个按钮编写多个事件侦听类Q而且q些cM般都?x)被设?f)内部cR学qY件徏模的读者可能知道,内部软g建模在Y件工E中是不推荐使用的,所以这L(fng)代码~写明显?x)增加设计冗余度和复杂度Q因此,我们可以考虑自己~写一个类g.Net中EventHandler一L(fng)事g委托cL处理事g分发?/p>
׃我们无权修改Java的编译器Q所以我在这里将?x)借助于反技术,利用一个事件委托类处理所有的点击事gQ代码如下:(x)
|
现在我们来编写一个测试程序,代码如下Q?/p>
|
从以上代码中我们可以清晰的看刎ͼ事g处理和事件委托处于同一H体中了(jin)Q?Net方便的Delegate处理被我们用反射实现?jin)?/p>
public class Sub{
String str=new String( "good "); //一个地址的传?new出来的对象,在内存(sh)已经开辟了(jin)I间
public static void main(String args[]){
Sub ex=new Sub();
ex.change(ex.str);
System.out.println(ex.str);
}
public void change(String bb){
bb= "test ok " }
问题Q?/font>String str=new String( "good ") 和String str="good"的区别?
体会(x)1Q?/font>
体会(x)2Q?/font>字符串池Q{Q?/span>String a = "Hello";
String b = "Hello";
String c = new String("Hello");
String d = new String("Hello");
System.out.println(a == b);
System.out.println(b == c);
System.out.println(c == d);
System.out.println(a.equals(b));
System.out.println(b.equals(c));
System.out.println(c.equals(d));
l果是trueQfalseQfalseQtrueQtrueQtrue。这里就涉及(qing)到字W串池?#8220;字符串池”Q是JavaZ(jin)提高内存利用率而采用的措施Q?/span>
当遇到String a = "Hello"; q样的语句时QJava?x)先在字W串池中L是否已经存在"Hello"q个字符?如果没有Q则建立字符?Hello"对象Q然后变?a 指向q个地址Q然后遇到语句String b = "Hello"Q这时字W串池中已经?"Hello"?jin),所以直接让变量b也指向这个地址Q省M(jin)重新分配的麻?ch)。而在Java中,操作W?#8220;==”对于两个基本型来_(d)是判断其内容是否相同Q对于两个对象来_(d)则是判断其地址是否相同Q所以a == bq回 true?/span>
那么String c = new String("Hello")又如何处理呢Q如果是q种写法Q则不会(x)去访问字W串池,而是先ؓ(f)变量 c 开辟空_(d)然后值写入空间。所以a == cq回falseQc == d同样q回false?/span>
至于String的equalsҎ(gu)Q因为它比较的不是对象的地址Q而是对象的|所以都q回true׃奇怪了(jin)?/span>
Java虚拟机有一个字W串池,保存着几乎所有的字符串对象。字W串表达式L指向字符串池中的一个对象。用new操作创徏的字W串对象不指向字W串池中的对象但是可以用internҎ(gu)使其指向字符串池中的对象.Q注Q如果池中已l有相同的字W串--使用equalsҎ(gu)定Q则直接q回池中的字W串Q否则先字W串d到池中,再返回)(j)。池中两个相{的字符串如果?#8220;==”来比较将q回真?/span>
ȝQ?/font>也就是在changeq个Ҏ(gu)中,bb已经写入strI间。而bb在等?#8220;test ok”的时候是q用字符串池创徏?jin)对象中了(jin)。所以不能赋倹{可以这?bb="test ok"; this.str=bb;
理解有错误,希望看到的高手可以告诉我Q以便我可以更好的修改,谢谢?jin)?/span>