我使用org.apache.commons.net.ftp.FTPClient实现了

java代码将文件上传到服务器

对于多个文件,ftp上传速度非常慢.

我怎样才能提高速度.

– 改变图书馆?

用于上传多个文件的强大FTP客户端类库是什么?

– 使用多个线程?

如何用多线程实现ftp上传功能?

有人能告诉我一个例子吗?

我是多线程编程的新手.

在我阅读完所有答案后,我尝试更改我的代码并进行测试.

以下是一个示例FTPClient代码:

// create instance of FTPClient

FTPClient ftp = new FTPClient();

ftp.setControlEncoding("UTF-8");

ftp.setDefaultTimeout(30000);

// connect to server

try

{

ftp.connect("10.1.1.1", 990);

}

catch(Exception e)

{

System.out.println("Cannot connect to server");

return;

}

// login to server

if (!ftp.login("username", "password"))

{

ftp.logout();

System.out.println("Cannot login to server");

return;

}

try

{

ftp.setFileTransferMode(FTP.BINARY_FILE_TYPE);

ftp.enterLocalPassiveMode();

// ftp.setBufferSize(0);

}

catch(Exception e)

{

}

// create directory on server

// dirs is list of required directories on server

for (String dir : dirs)

{

try

{

ftp.makeDirectory(dir);

}

catch(IOException e)

{

}

}

// files is a map of local file and string of remote file

// such as

// file on client is "C://test/a.txt"

// location on server is "/test/a.txt"

for (Map.Entry entry : files.entrySet())

{

File localFile = entry.getKey();

String remoteFile = entry.getValue();

FileInputStream input = null;

try

{

input= new FileInputStream(localFile);

ftp.storeFile(remoteFile, input);

}

catch (Exception e)

{

try

{

ftp.deleteFile(remoteFile);

}

catch (IOException e1)

{

}

}

finally

{

if (input != null)

{

try

{

input.close();

}

catch (IOException e)

{

}

}

}

}

// disconnect

if (ftp != null && ftp.isConnected())

{

try

{

ftp.disconnect();

}

catch (IOException f)

{

// do nothing

}

}

当我上传1050个文件(每个文件大约1-20 KB)时,它花了大约49406 – 51000毫秒(这只是上传时间).

我想提高速度.

有人建议我使用ftp4j,但是当我用1050个文件测试库时,ftp4j的上传速度比FTPClient慢大约10000毫秒.

花了大约60000毫秒.

以下是示例ftp4j代码:

// create instance of FTPClient

FTPClient ftp = new FTPClient();

ftp.setCharset("UTF-8");

// connect to server

try

{

ftp.connect("10.1.1.1", 990);

}

catch(Exception e)

{

System.out.println("Cannot connect to server")

return;

}

// login to server

try

{

ftp.login("username", "password");

}

catch (Exception e)

{

try

{

ftp.logout();

}

catch (Exception e1)

{

}

System.out.println("Cannot login to server")

return;

}

try

{

ftp.setType(FTPClient.TYPE_BINARY);

ftp.setPassive(true);

}

catch(Exception e)

{

}

// create directory on server

// dirs is list of required directories on server

for (String dir : dirs)

{

try

{

ftp.createDirectory(dir);

}

catch (Exception e)

{

}

}

// files is a map of local file and string of remote file

// such as

// file on client is "C://test/a.txt"

// location on server is "/test/a.txt"

for (Map.Entry entry : files.entrySet())

{

final File localFile = entry.getKey();

final String remoteFile = entry.getValue();

BufferedInputStream input = null;

boolean success = false;

try

{

input = new BufferedInputStream(new FileInputStream(localFile));

// ftp.upload(localFile);

ftp.upload(remoteFile, input, 0, 2048, new MyTransferListener());

success = true;

}

catch (Exception e)

{

}

finally

{

if (input != null)

{

try

{

input.close();

}

catch (IOException e)

{

}

}

if (!success)

{

try

{

ftp.deleteFile(remoteFile);

}

catch (Exception e)

{

}

}

}

}

// disconnect

if (ftp != null && ftp.isConnected())

{

try

{

ftp.disconnect();

}

catch (IOException f)

{

// do nothing

}

}

我尝试使用多个线程.

以下是多线程代码:

final CountDownLatch latch = new CountDownLatch(files.size());

ExecutorService pool = Executors.newFixedThreadPool(10);

for (Map.Entry entry : files.entrySet())

{

final File localFile = entry.getKey();

final String remoteFile = entry.getValue();

pool.execute(new Runnable() {

public void run()

{

FileInputStream input = null;

try

{

input= new FileInputStream(localFile);

ftp.storeFile(remoteFile, input);

}

catch (Exception e)

{

try

{

ftp.deleteFile(remoteFile);

}

catch (IOException e1)

{

}

}

finally

{

if (input != null)

{

try

{

input.close();

}

catch (IOException e)

{

}

}

latch.countDown();

}

}

});

}

try

{

// waiting for all threads finish

// see: https://stackoverflow.com/questions/1250643/how-to-wait-for-all-threads-to-finish-using-executorservice

latch.await();

}

catch(Exception e)

{

}

这是对的吗?它工作正常,但无法提高速度.

它花了大约49000 – 51000毫秒与没有线程的代码相同.

我用内联网测试速度.互联网需要更多时间.

我该怎么做才能提高上传速度?

java优化上传速度慢怎么办_如何提高多个文件的ftp上传速度[Java]相关推荐

  1. php获取svn文件,然后ftp上传服务器代码

    配置文件 <?php //setup commandline $svn_cmd1 = 'svn.exe update '; $svn_cmd2 = ' --username xxx --pass ...

  2. 码云上传代码添加标签_第一次使用Git Bash Here 将本地代码上传到码云

    当我们安装成功git工具时候,初次使用Git时,需要Git进行配置. 1.点击桌面上的这个图标 ,打开Git Bash:如图所示 2.配置自己的用户名和邮箱 git config --global u ...

  3. 网站ftp上传工具,六款值得你去使用的网站ftp上传工具

    可能很多人都不太熟悉什么是网站ftp上传工具,但是这个工具使用的人还是非常多的,比如那些从事网站管理的人员.他们的日常工作中接触的最多的工具可能就是网站ftp上传工具.这款工具一般是英文版的偏多,那有 ...

  4. 用ftp上传到服务器视频文件夹,ftp 上传文件夹到服务器

    ftp 上传文件夹到服务器 内容精选 换一换 上传的文件和上传的文件夹中包含的文件支持的格式请参见支持的文件格式.文件上传:从本地上传:在Projects Explorer视图中选中一个文件夹,依次单 ...

  5. linux curl 命令 http请求、下载文件、ftp上传下载

    1. curl 命令简介 cURL(CommandLine Uniform Resource Locator),是一个利用 URL 语法,在命令行终端下使用的网络请求工具,支持 HTTP.HTTPS. ...

  6. java 将一串字符串 转换成_简单几步,教你如何轻松的将Java中的字符串转换为Integer,你学会了吗?...

    在Java中有两种将字符串转换为Integer的方法, 使用Integer.parseInt( )到Integer的字符串 使用Integer.value eOf( )到Integer的字符串 假设您 ...

  7. jsp向服务器上传文件,jsp ftp 上传文件到服务器

    jsp ftp 上传文件到服务器 内容精选 换一换 安装传输工具在本地主机和Windows云服务器上分别安装数据传输工具,将文件上传到云服务器.例如QQ.exe.在本地主机和Windows云服务器上分 ...

  8. java导出excel设置行高列宽_使用POI生成Excel文件,可以自动调整excel列宽

    //autoSizeColumn()方法自动调整excel列宽 importjava.io.FileOutputStream; importorg.apache.poi.hssf.usermodel. ...

  9. java 线性表的表示和实现_线性表中顺序表的的理解和实现(java)

    线性表的顺序表示指的是用一组地址连续的存储单元以此存储线性表的数据元素,这种表示也称作线性表的顺序存储结构或顺序映像.通常,称这种存储结构的线性表为顺序表.特点是:逻辑上相邻的数据元素,其物理次序上也 ...

最新文章

  1. SQLServer2000同步复制技术实现步骤
  2. 在一个TextArea中如何限制行数和字符数
  3. python 32的值_示例解读 Python 2 和 Python 3 之间的主要差异
  4. 静态路由心法口诀:路由表少什么网络加什么网络
  5. chrome charset使用_使用JWT保护你的Spring Boot应用 Spring Security实战
  6. 有必要月底Linux内核,如何确定linux内核是否会在月底插入闰秒
  7. 计算机的时间和dc的时间不同步_时间同步配置,让你轻松同步所有设备时间,让日志信息更有价值...
  8. WebService 出现因 URL 意外地以“/HelloWorld”结束,请求格式无法识别。
  9. 升级Linux下的sudo
  10. jAVA Annotation 小例
  11. Java垃圾回收(GC)机制
  12. Log4j(三)——Log4j配置文件位置详解
  13. 智慧校园信息化建设方案
  14. GIS三维可视化技术在输电领域的应用研讨
  15. 直播声音代码html,如何实现在直播中播放音频文件
  16. TS2339: Property 'debounceTime' does not exist on type 'Observableany'. - Angular 6
  17. echarts的legend显示不全_【报Bug】echarts图表的legend没有显示
  18. 第十六周项目3函数指针调用函数 吃饭睡觉打豆豆
  19. spark scala 求整列的总和值
  20. 调整autocad字体输入框大小

热门文章

  1. CentOS7搭建CDN
  2. EaxyExcel高亮单元格和填充颜色
  3. 学习编程的五个关键点!你需要get它,并运用!
  4. android bugly qq,android版Bugly诚邀体验 可以使用QQ登录
  5. 北电中国高管自述破产40天惊魂:对手抓着猛打
  6. LG30刷小米系统_初版BUG较多 小米9成功升级基于Android Q的MIUI系统
  7. 七月集训(第18天) —— 树
  8. Laravel 微信小程序后端实现用户登录的示例代码
  9. Linux 使用 docker 安装 Nexus3 私服
  10. 【数据结构---排序】庖丁解牛式剖析常见的排序算法