Java多线程下载图片并压缩实践与优化

8 下载量 44 浏览量 更新于2024-09-01 收藏 115KB PDF 举报
Java多线程在实际开发中常用于处理并发任务,尤其是在网络操作如下载和文件处理方面。本文档介绍了一种利用Java多线程技术来实现从FTP服务器下载图片URL,并对下载的图片进行批量压缩的场景。作者使用SpringMVC框架和Quartz定时任务机制来自动化这个过程。 首先,作者创建了一个名为`PictureTransferJob`的类,它继承自`org.springframework.scheduling.quartz.QuartzJobBean`,这是一个Spring框架与Quartz集成的定时任务基类。在`executeInternal()`方法中,关键步骤如下: 1. **设置FTP连接参数**: - FTP服务器地址(`String hostName`):用于连接FTP服务器的IP地址。 - FTP端口(`int port`):用于指定FTP服务器的端口号。 - 账号和密码:用于身份验证,这里分别使用`String userName`和`String password`。 - FTP下载目录(`String ftpDownload`):存放图片URL文件的位置。 - 本地文件存储路径(`String path`):通过`getClass().getResource()`获取当前类的资源路径,便于后续操作。 2. **定义文件路径**: - 定义图片地址文件的存储路径(`String addrPath`),以及实际下载图片的存储路径(`String picPath`)。 3. **下载图片**: - 逐行读取图片地址文件,对每个图片URL调用下载方法,这一步使用了多线程技术,例如可以使用`ExecutorService`或`Future`来异步下载,避免阻塞主线程。 - 下载完成后,将图片保存到本地。 4. **图片压缩**: - 对于大量下载的图片,可能一次性难以处理,所以可以采用分批压缩的方式,比如每下载完一定数量的图片就压缩一次,或者按照每天一个压缩包的策略。 - 使用Java的`java.util.zip`包中的`ZipOutputStream`或第三方库(如Apache Commons Compress)来实现图片的压缩。 5. **清理临时文件**: - 压缩完成后,删除下载的原始图片,只保留压缩后的文件,以保持磁盘空间的整洁。 在整个过程中,作者提到可能存在性能瓶颈,比如大量图片下载可能会占用较多网络带宽和磁盘IO,因此可能需要考虑优化下载策略,例如使用多线程下载,分块下载等方法来提高效率。此外,还可以通过调整Quartz定时任务的执行频率,确保系统资源的有效利用。 对于有经验的开发者来说,这篇文章提供了一个实用的示例,展示了如何结合Java多线程和Spring框架来处理大规模图片下载和压缩任务。同时,它也鼓励读者提出自己的优化建议,共同提升代码的性能和可扩展性。
2014-05-27 上传
1.得到服务器下载文件的大小,然后在本地设置一个临时文件和服务器端文件大小一致 a)获得访问网络地址 b)通过URL对象的openConnection()方法打开连接,返回一个连接对象 c)设置请求头 i.setRequestMethod ii.setConnectTimeout iii.setReadTimeout d)判断是否响应成功 e)获取文件长度(getContentLength()) f)随机访问文件的读取与写入RandomAccessFile(file, mode) g)设置临时文件与服务器文件大小一致(setLength()) h)关闭临时文件 2.计算出每个线程下载的大小(开始位置,结束位置) a)计算出每个线程下载的大小 b)for循环,计算出每个线程的开始、结束位置 c)最后一个线程处理 3.每创建好一次就要开启线程下载 a)构造方法 b)通过URL对象的openConnection()方法打开连接,返回一个连接对象 c)设置请求头 i.setRequestMethod ii.setConnectTimeout d)判断是否响应成功(206) e)获取每个线程返回的流对象 f)随机访问文件的读取与写入RandomAccessFile(file, mode) g)指定开始位置 h)循环读取 i.保存每个线程下载位置 ii.记录每次下载位置 iii.关闭临时记录位置文件 iv.随机本地文件写入 v.记录已下载大小 i)关闭临时文件 j)关闭输入流 4.为了杀死线程还能继续下载的情况下,从本地文件上读取已经下载文件的开始位置 a)创建保存记录结束位置的文件 b)读取文件 c)将流转换为字符 d)获取记录位置 e)把记录位置赋给开始位置 5.当你的n个线程都下载完毕的时候我进行删除记录下载位置的缓存文件 a)线程下载完就减去 b)当没有正在运行的线程时切文件存在时删除文件