Почему медленная загрузка ftp в java 7

Я хотел спросить, знает ли кто-нибудь о проблемах с Java 7 с FTP? Я использовал как библиотеки Sun Net, так и Apache Commons Net, и оба выполняются так, как ожидалось, на Java 6. Но когда я переключаю свою среду разработки (Eclipse) на 1.7, те же операции выполняются очень медленно (от 4,5 до 8 КБ/с) и это для локальных серверов и другого сервера в локальной сети.

Я пробовал буферизованные потоки, передачу по байт-байту, выключение алгоритма Нагле и использование удобного метода хранения Apache storeFile(), при этом последний, наконец, выполнял скорость на локальном хосте, но снова замедлял сканирование на удаленный сервер. Я также установил все машины, чтобы отключить фильтрацию FTP с проверкой состояния.

    InputStream is = null;
    OutputStream os = null;
    try {
        is = new BufferedInputStream(prepareInputStream(data));
        os = new BufferedOutputStream(prepareOutputStream(data));
        if (is == null || os == null) {
            log.error("Can't build connection");
            return;
        }

        byte[] buf = new byte[4096];
        int c = 1;

        while (c > 0) {
            c = is.read(buf);
            if (c > 0)
            os.write(buf, 0, c);
            data.incrCurrentPosition();
            fireStateChanged(data);
        }
        data.incrCurrentPosition();
    } catch (IOException e) {
        log.error(e.getMessage(), e);
        setEnabled(false);  
    } catch (Exception e) {
        log.error(e.getMessage(), e);
    } finally {
        if (is != null) {
            try {
                is.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        if (os != null) {
            try {
                os.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

Как видно, это довольно стандартный код реализации. Опять же, в Java 6, вещи быстро застегиваются. В Java 7 он замедляется в 10-20 раз для библиотек Sun и Apache Commons. Использование FTP-клиента, такого как FileZilla, подтверждает, что FTP работает нормально, поэтому я думаю, что он действительно имеет отношение к Java 7. Я вырыл, насколько мог онлайн, для упоминания проблемы, но, в основном, то, что я видел, было конфликт между брандмауэром Java 7 и Windows 7.

Заранее благодарим за предоставленную информацию.

Ответ 1

Пожалуйста, проверьте, каков ваш текущий размер буфера:

ftpClient.getBufferSize();

Если вы еще не установили его на что-то другое, это будет 0 (0). Итак, установите его на более высокое значение:

ftpClient.setBufferSize(1048576);//1024*1024

Вы можете проверить его текущее значение, как и раньше:

ftpClient.getBufferSize();

Кстати, принятый ответ setBufferSize (0) не работал у меня. Я использую самую последнюю версию общих ресурсов Apache, поэтому, вероятно, это решение работало с более ранними версиями. Если вы установите размер буфера на ноль, текущая версия не изменится.

Ответ 2

Я нашел исправление, по крайней мере, для того, чтобы нормально работать в Java 7. Я сделал это с помощью FTPClient setBufferSize (0); К сожалению, я не думаю, что там есть аналогичные метод в Sun Java 7 Sun Net. Не то, чтобы это было важно для меня, так как я вполне доволен Apache Commons Net. Надеемся, что Oracle в ближайшее время достигнет своей цели.

Ответ 3

Известная проблема производительности с Commons Net 3.2, исправленная в снимке 3.3, который вы можете получить отсюда:

https://repository.apache.org/content/groups/snapshots/commons-net/commons-net/3.3-SNAPSHOT/

В то время как setBufferSize (0) кажется допустимым обходным путем, вероятно, лучше всего получить правильное исправление с помощью моментального снимка - если вы в порядке с использованием моментальных снимков;)