3

我正在使用 apache commons-net 从 FTP 服务器下载文件。这么多工作正常。我遇到问题的部分是使用JProgressBar.

以下代码演示了我如何下载所需的文件:

public void download() {
    try {
        FTPClient ftpClient = new FTPClient();

        String fileName = "OFMEX_MANUFACTURING.jar";

        ftpClient.connect("192.168.1.242");
        int replyCode = ftpClient.getReplyCode();

        if (!FTPReply.isPositiveCompletion(replyCode)) {
            JOptionPane.showMessageDialog(null, "Server Down");
        }

        boolean login = ftpClient.login("bioftp", "bioftp");

        boolean changeWorkingDirectory = ftpClient.changeWorkingDirectory("ofmex\\Linux\\");
        boolean setFileType = ftpClient.setFileType(FTP.BINARY_FILE_TYPE);

        ftpClient.enterLocalPassiveMode();

        OutputStream data = (OutputStream) new FileOutputStream(fileName);

        ftpClient.retrieveFile(fileName, data);
        ftpClient.abort();               
    } catch (Exception e) {
        e.printStackTrace();
    }
} 
4

3 回答 3

2

您应该能够使用CopyStreamListener。请注意,不使用bytesTransferred(CopyStreamEvent event)方法,但应该使用bytesTransferred(long totalBytesTransferred, int bytesTransferred, long streamSize)

于 2012-06-28T11:19:25.743 回答
2

如果您要retriveFile()直接调用,那么您可能无法知道传输了多少字节。相反,您可以逐字节检索文件并记录传输的每个字节的计数。您还可以获取要传输的总字节数,以便计算要在进度条中显示的百分比。

InputStream stSource = new FileInputStream(locFile);
OutputStream stDest = new BufferedOutputStream(ftp.storeFileStream(remFile), ftp.getBufferSize());

Util.copyStream(stSource, stDest, ftp.getBufferSize(),CopyStreamEvent.UNKNOWN_STREAM_SIZE, new CopyStreamAdapter() {
    public void bytesTransferred(long totalBytesTransferred,int bytesTransferred, long streamSize) {
        long megsTotal = 0;
        long megs = totalBytesTransferred / 1048576;

        for (long l = megsTotal; l < megs; l++) {
            System.err.print("|");
        }

        megsTotal = megs;
    }
});

请参阅上面代码中使用的这个apache commons util。

于 2012-06-28T11:27:18.750 回答
0

在 NetBeans 中创建一个桌面应用程序。它为您提供了一个带有任务监视器和忙碌图标以及您需要的一切的预建进度条。使用 CopyStreamListener 并使用 bytesTransferred 方法来管理进度条。

于 2012-06-28T11:30:52.290 回答