在 Python 中 URL 的这种操作,请问在 Java 中有吗?

2017-03-09 15:22:13 +08:00
 Adia

项目中要用 Java 去 get 到下载的 URL ,然后交给 linux 去 wget 。那么带着()之类的符号是不可以的。

在 Python 中可以这么做

from urllib import quote

from urllib import quote

#URL 是瞎给的
cli_url ="http://down1.chinaunix.net/distfiles/lrzsz-(0)12.20.tar.gz"
url_0 = cli_url.split('://')[0]
url_1 = cli_url.split('://')[1]
new_url = url_0+'://'+quote(url_1)
cli_url = new_url   #http://down1.chinaunix.net/distfiles/lrzsz-%280%2912.20.tar.gz
print cli_url

但是在 Java 中似乎并不是这么好做的,

	public static void main(String[] args)
			throws URISyntaxException, MalformedURLException, UnsupportedEncodingException {
		String _url = "http://down1.chinaunix.net/distfiles/lrzsz-(0)12.20.tar.gz";
	    String url=URLEncoder.encode(_url, "UTF-8"); 
		System.out.println(url); //http%3A%2F%2Fdown1.chinaunix.net%2Fdistfiles%2Flrzsz-%280%2912.20.tar.gz
		//先不管 http://还没有分割。蛋疼的是这里的 url 连 /都被编码了
	}

想在 Java 中得到从http://down1.chinaunix.net/distfiles/lrzsz-(0)12.20.tar.gz变成http://down1.chinaunix.net/distfiles/lrzsz-%280%2912.20.tar.gz的效果。 url 是不规则的,用正则应该不行..求各位大神指教。

4599 次点击
所在节点    Java
25 条回复
picasso250
2017-03-10 14:08:06 +08:00
@SoloCompany 你以为 python 底层是怎么做的?
所以不是 宁愿发明,而是 我就 wrap 一下 c 的接口。剩下的你自己解决。
SoloCompany
2017-03-10 14:28:35 +08:00
@picasso250 #21 我不清楚 python 或者 c 是怎么实现的,但我清楚 java 是怎么实现的,请参考

https://github.com/frohoff/jdk8u-jdk/blob/jdk8u60-b10/src/solaris/classes/java/lang/ProcessImpl.java#L83

79~83 行的内容很清楚的显示 unixprocess 调用的 argBlock 的结构是怎么样的,每一个 arg 都是一个 \0 终结的 CString ,请问和 shell escape 有任何关系吗?
cloudzhou
2017-03-10 15:53:08 +08:00
@Adia 如果怎么样,能使用 wget 或者 curl ,那就走标准的 http 协议啊,这样调用 shell ,一个是效率低下,不安全,并且平台相关。
picasso250
2017-03-13 20:35:12 +08:00
@SoloCompany #22 真不幸,你至少应该找到 java 的 UNIXProcess 类,如果你有点 sense ,应该对着 forkAndExec 方法陷入沉思。
显然,你应该想到 popen 之类的系统调用。这就是 PHP 的 wrap 。或许 PHP 不会把东西变得更好,但 PHP 也不会把东西变得更糟。而且 escapeshellarg 显然让事情比原来( c 语言时)变得更好了。

如果你现在还不清楚这和 shell escape 有什么关系,我建议你……不要参与程序员话题的讨论了。
SoloCompany
2017-03-13 21:04:46 +08:00
@picasso250 恭喜你找到了编程的真谛,已 block 不谢

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/346154

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX