Java: как получить скорость загрузки и выгрузки - PullRequest
2 голосов
/ 29 июня 2010

Я пишу программу для загрузки и скачивания файлов на FTP-сервер, но не могу контролировать скорость и скорость передачи.
Я использовал класс FTPClient и два его метода retrievFile() и storeFile()

Ответы [ 2 ]

1 голос
/ 29 июня 2010

Попробуйте:

public class ReportingOutputStream extends OutputStream {
    public static final String BYTES_PROP = "Bytes";
    private FileOutputStream fileStream;
    private long byteCount = 0L;
    private long lastByteCount = 0L;
    private long updateInterval = 1L << 10;
    private long nextReport = updateInterval;
    private PropertyChangeSupport changer = new PropertyChangeSupport(this);

    public ReportingOutputStream(File f) throws IOException {
        fileStream = new FileOutputStream(f);
    }

    public void setUpdateInterval(long bytes) {
        updateInterval = bytes;
        nextReport = updateInterval;
    }

    @Override
    public void write(int b) throws IOException {
        byte[] bytes = { (byte) (b & 0xFF) };
        write(bytes, 0, 1);
    }

    @Override
    public void write(byte[] b, int off, int len) throws IOException {
        fileStream.write(b, off, len);
        byteCount += len;
        if (byteCount > nextReport) {
            changer.firePropertyChange( BYTES_PROP, lastByteCount, byteCount);
            lastByteCount = byteCount;
            nextReport += updateInterval;
        }
    }

    @Override
    public void close() throws IOException {
        if (fileStream != null) {
            fileStream.close();
            fileStream = null;
        }
    }

    public void removePropertyChangeListener(String propertyName, PropertyChangeListener listener) {
        changer.removePropertyChangeListener(propertyName, listener);
    }

    public void addPropertyChangeListener(String propertyName, PropertyChangeListener listener) {
        changer.addPropertyChangeListener(propertyName, listener);
    }
}

После создания потока добавьте прослушиватель изменения свойства для BYTES_PROP. По умолчанию он запускает обработчик для каждого полученного 1 КБ. Звоните setUpdateInterval, чтобы изменить.

0 голосов
/ 29 июня 2010

Поскольку retrieveFile и storeFile имеют дело с входными и выходными потоками, возможно ли для вас написать свои собственные подклассы, которые могут отслеживать количество байтов, передаваемых в течение или в течение определенного времени?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...