Этот способ подключения к FTP довольно ограничен и не до конца документирован. Я могу сначала дать вам ответ на EPSV. Соединение устанавливается внутренней реализацией, которая в моем JDK оказывается sun.net.www.protocol.ftp.FtpURLConnection
.
При подключении к серверу сначала будут опробованы EPSV
и PASV
(по умолчанию пассивный режим), затем он вернется к активному режиму - PORT
- если пассивный режим не может быть установлен. Вы можете увидеть детали реализации здесь .
Основной комментарий, объясняющий один из ваших вопросов:
/**
* Here is the idea:
*
* - First we want to try the new (and IPv6 compatible) EPSV command
* But since we want to be nice with NAT software, we'll issue the
* EPSV ALL cmd first.
* EPSV is documented in RFC2428
* - If EPSV fails, then we fall back to the older, yet OK PASV command
* - If PASV fails as well, then we throw an exception and the calling method
* will have to try the EPRT or PORT command
*/
Что касается вашего второго вопроса ... неудачный поиск subFour ... Что ж, на первый взгляд кажется, что он ведет себя так, потому что он глючит. Но я не могу установить правильную среду, чтобы проверить это сейчас. Далее у вас есть исключение. Я предполагаю, что проблема инициируется в строке 455, когда она пытается снова перейти к полному пути. Полный источник FTP-соединения здесь .
373 public InputStream getInputStream() throws IOException {
...
390 try {
391 decodePath(url.getPath());
392 if (filename == null || type == DIR) {
...
399 } else {
400 if (type == ASCII)
401 ftp.ascii();
402 else
403 ftp.binary();
404 cd(pathname);
405 is = new FtpInputStream(ftp, ftp.get(filename));
406 }
407
408
...
453 } catch (FileNotFoundException e) {
454 try {
455 cd(fullpath);
456 /* if that worked, then make a directory listing
457 and build an html stream with all the files in
458 the directory */
459 ftp.ascii();
460
461 is = new FtpInputStream(ftp, ftp.list());
462 msgh.add("content-type", "text/plain");
463 } catch (IOException ex) {
464 throw new FileNotFoundException(fullpath);
465 }
466 }
...
469 }
Я бы посоветовал вам использовать библиотеку Apache Commons Net для операций FTP. Он намного более продвинут и прост в использовании.
Приветствия и счастливой отладки, если вы хотите!