最近一个项目要用到FTP作上传下载,我访问ftp的url中有中文名称,结果每次都报以下错:java
1 Exception in thread "main" java.lang.IllegalArgumentException
2 at sun.net.www.ParseUtil.decode(Unknown Source)
3 at sun.net.www.protocol.ftp.FtpURLConnection.decodePath(Unknown Source)
4 at sun.net.www.protocol.ftp.FtpURLConnection.getInputStream(Unknown Source)
5 at URLConnectionDownloader.download(URLConnectionDownloader.java:33)
6 at URLConnectionDownloader.main(URLConnectionDownloader.java:15)
原本能够用apache的FtpClient解决这个问题,可是我不太想用那种方式,我想省点步骤。因此坚持用linux
URL url = new URL("ftp://xxxx:1234@192.168.1.101:21/测试/测试.jpg");这种方式,网上搜了一大堆资料,基本都是说编码问题的。用了java.net.xxx自带转码的工具也没用,尝试了各类iso8859-一、GBK、UTF-8编码,依然无效。apache
最后发现windows的ftp服务器,是用gbk来处理的,linux的是utf-8,原来只须要在访问ftp前设置一下系统编码就OK了,下面放代码:windows
System.setProperty("file.encoding", "GBK"); URL url = new URL("ftp://xxxx:1234@192.168.1.101:21/测试/测试.jpg"); is =url.openConnection().getInputStream(); output = response.getOutputStream(); byte[] buffer = new byte[4096]; int count = 0; while ((count = is.read(buffer)) > 0) { output.write(buffer, 0, count); } output.flush(); response.flushBuffer(); is.close();
到此就算OK了,用了这个就不要再去给你的路径转码了,否则会致使读取失败!服务器
2015-04-08 PS:时隔三年回来看这篇博客,感受本身简直是个逗比,直接把FTP的用户和密码暴漏给了前台,若是我如今写的话,会通过服务器中转后才展现出来。当年刚入行,年轻啊。。。。工具