Posts Tagged ‘Java’

java.net.URLEncoder对空格的处理的问题

星期一, 7月 7th, 2008

java.net.URLEncoder对url进行编码处理的时候,对空格是替换成了加号,而不是%20

java.net.URLEncoder.java的源代码为:

[code]

if (dontNeedEncoding.get(c)) {
if (c == ‘ ‘) {
c = ‘+’;
needToChange = true;
}
//System.out.println(”Storing: ” + c);
out.append((char)c);
i++;
}

[/code]

测试代码

[code]

String url=”http://618119.com/docs/测试 空格.doc”;
String nurl=url.substring(0,url.lastIndexOf(’/')+1)+java.net.URLEncoder.encode(url.substring(url.lastIndexOf(’/')+1), “UTF-8″);
System.out.println(nurl);
System.out.println(java.net.URLDecoder.decode(nurl, “UTF-8″));

[/code]

执行的结果为:

http://618119.com/docs/%E6%B5%8B%E8%AF%95+%E7%A9%BA%E6%A0%BC.doc
http://618119.com/docs/测试 空格.doc

而在与同事调试的时候,发现对方的web服务器处理得有点问题,没能将加号还原为空格,

对文件名只截取到了空格前面部分的内容,导致在下载的时候,

头信息 content-disposition和Content-Type

写入的内容不对,导致手机无法正常下载文件。

无法正常下载到手机时的头信息是:

content-disposition: attachment; filename=”测试”
Content-Type: application/octet-stream因此修改代码,对url进行替换,将加号替换成”%20″;

修改后的代码为:

[code]

String url=”http://618119.com/docs/测试 空格.doc”;
String nurl=url.substring(0,url.lastIndexOf(’/')+1)+java.net.URLEncoder.encode(url.substring(url.lastIndexOf(’/')+1), “UTF-8″);
nurl=nurl.replaceAll(”\\+”, “%20″);//处理空格
System.out.println(nurl);
System.out.println(java.net.URLDecoder.decode(nurl, “UTF-8″));

[/code]

执行结果为:

http://618119.com/docs/%E6%B5%8B%E8%AF%95%20%E7%A9%BA%E6%A0%BC.doc
http://618119.com/docs/测试 空格.doc

用手机可以正常下载文件时的头信息为:
content-disposition: attachment; filename=”测试 空格.mp3″
Content-Type: audio/x-mpeg

Tags: Java

Related posts

Socket读取数据包时的1448字节问题

星期六, 7月 5th, 2008

昨天和同事调试接口的时候,发现接收到的数据包的字节内容后面部分全部是0.
而经过日志确认同事接口写回的数据包是正常的,
今天特意调试了一下,才发现是Socket读取数据时的1448字节问题。

通过google搜索,可以发现,javaSocket的getInputStream进行read到数组的时候,
每次的一次性读取时最多只能获得1448字节的数据。

下面是存在问题的写法:
[code]
//数据包前四个字节是数据包的长度说明
private byte[] readResponse(Socket sc) {
InputStream is;
try {
is = new BufferedInputStream(sc.getInputStream());
byte[] lenb = new byte[4];
is.read(lenb);
byte[] pakb = new byte[HessionIO.bytesToInt(lenb, 0, 4) + 4];
pakb[0] = lenb[0];
pakb[1] = lenb[1];
pakb[2] = lenb[2];
pakb[3] = lenb[3];
is.read(pakb, 4, pakb.length - 4);
return pakb;
} catch (IOException e) {
e.printStackTrace();
return new byte[0];
}

}

[/code]

修改bug之后的读取方法

[code]
/**
* 从Socket读取应答数据包
* 数据包前四个字节是数据包的长度说明
* @param sc
* @return
*/
private byte[] readResponse(Socket sc) {
InputStream is;
try {
is = sc.getInputStream();
byte[] lenb = new byte[4];
is.read(lenb);
byte[] pakb = new byte[HessionIO.bytesToInt(lenb, 0, 4) + 4];
pakb[0] = lenb[0];
pakb[1] = lenb[1];
pakb[2] = lenb[2];
pakb[3] = lenb[3];
//数据包太大的时候,无法一次性读取完毕,要考虑大于1448字节的问题,需要多次读取接收数据,
//每一次的read最多接收1448字节的数据:
int needDataLen=pakb.length - 4;
while (needDataLen>0) {
int readedlen=is.read(pakb, pakb.length-needDataLen, needDataLen);
log.info(”needDataLen==”+needDataLen +”,readedlen== “+readedlen);
needDataLen=needDataLen-readedlen;
}

return pakb;
} catch (IOException e) {
logger.error(”Hession readResponse error: “,e);
return new byte[0];
}

}

[/code]

下面是读取数据包时得到的日志:
2008-07-05 17:55:31.505 INFO needDataLen==49024,readedlen== 1444
2008-07-05 17:55:31.506 INFO needDataLen==47580,readedlen== 1448
2008-07-05 17:55:31.508 INFO needDataLen==46132,readedlen== 1448
2008-07-05 17:55:31.551 INFO needDataLen==44684,readedlen== 1448
2008-07-05 17:55:31.552 INFO needDataLen==43236,readedlen== 1448
2008-07-05 17:55:31.553 INFO needDataLen==41788,readedlen== 1448
2008-07-05 17:55:31.593 INFO needDataLen==40340,readedlen== 1448
2008-07-05 17:55:31.594 INFO needDataLen==38892,readedlen== 1448
2008-07-05 17:55:31.595 INFO needDataLen==37444,readedlen== 1448
2008-07-05 17:55:31.597 INFO needDataLen==35996,readedlen== 1448
2008-07-05 17:55:31.598 INFO needDataLen==34548,readedlen== 1448
2008-07-05 17:55:31.599 INFO needDataLen==33100,readedlen== 1448
2008-07-05 17:55:31.600 INFO needDataLen==31652,readedlen== 1448
2008-07-05 17:55:31.601 INFO needDataLen==30204,readedlen== 1448
2008-07-05 17:55:31.638 INFO needDataLen==28756,readedlen== 1448
2008-07-05 17:55:31.639 INFO needDataLen==27308,readedlen== 1448
2008-07-05 17:55:31.640 INFO needDataLen==25860,readedlen== 1448
2008-07-05 17:55:31.641 INFO needDataLen==24412,readedlen== 1448
2008-07-05 17:55:31.643 INFO needDataLen==22964,readedlen== 1448
2008-07-05 17:55:31.644 INFO needDataLen==21516,readedlen== 1448
2008-07-05 17:55:31.645 INFO needDataLen==20068,readedlen== 1448
2008-07-05 17:55:31.646 INFO needDataLen==18620,readedlen== 1448
2008-07-05 17:55:31.647 INFO needDataLen==17172,readedlen== 1448
2008-07-05 17:55:31.648 INFO needDataLen==15724,readedlen== 1448
2008-07-05 17:55:31.650 INFO needDataLen==14276,readedlen== 1448
2008-07-05 17:55:31.651 INFO needDataLen==12828,readedlen== 1448
2008-07-05 17:55:31.652 INFO needDataLen==11380,readedlen== 1448
2008-07-05 17:55:31.653 INFO needDataLen==9932,readedlen== 1448
2008-07-05 17:55:31.654 INFO needDataLen==8484,readedlen== 1448
2008-07-05 17:55:31.655 INFO needDataLen==7036,readedlen== 1448
2008-07-05 17:55:31.683 INFO needDataLen==5588,readedlen== 1448
2008-07-05 17:55:31.684 INFO needDataLen==4140,readedlen== 1448
2008-07-05 17:55:31.685 INFO needDataLen==2692,readedlen== 1448
2008-07-05 17:55:31.686 INFO needDataLen==1244,readedlen== 1244

具体的可以通过google搜索获得更多资料:

http://www.google.cn/search?q=--escaped_anchor:e392b3041728c87dd7d072bc842f146a--+1448+%CE%CA%CC%E2

Tags: 1448, Java, socket

Related posts

JProfiler 5.1.3 注册

星期二, 5月 27th, 2008

JProfiler 5.1.3

刚才看blog的访问日志,才注意到JProfiler 5.1.3已经出来了,
JProfiler 5.1.3 是在4月29日发布的,
相关下载连接:
http://download.ej-technologies.com/--escaped_anchor:d4ebd700ae3c0b9b55c445e91755d368--/jprofiler_windows_5_1_3.exe
http://download.ej-technologies.com/--escaped_anchor:d4ebd700ae3c0b9b55c445e91755d368--/jprofiler_windows-x64_5_1_3.exe

下载来源在
http://www.ej-technologies.com/download/--escaped_anchor:d4ebd700ae3c0b9b55c445e91755d368--/files.php

JProfiler.512crack.zip 的 注册机 Keygen.calss 计算出的注册码必须使用JProfiler.512crack.zip里的dll文件进行替换才能够使用。
否则在Start Session的时候还是会出Invalid license key的错误,
即使替换了能够用,但是在关闭 JProfiler 5.1.3的时候,好像会有java进程无法退出,必须到任务管理器里手工强行结束。

参考 : http://luanma.javaeye.com/blog/183827

有不替换dll的纯注册码,可以在google的博客搜索里找到:

http://blogsearch.google.cn/blogsearch?hl=zh-CN&ie=UTF-8&um=1&q=--escaped_anchor:08ec445965da9b23b677c659dae1d5b4--+5.1+LicenseKey&btnG=%E6%90%9C%E7%B4%A2%E5%8D%9A%E5%AE%A2&lr=

即: http://serendipityspaces.spaces.live.com/blog/cns!71616649A887E6A!604.entry

Tags: Java, JProfiler

Related posts