Java使用线程池递归压缩文件夹下面的所有子文件

简介:

本文将介绍Java中利用线程池递归的方式压缩文件夹下面的所有子文件,具体方法如下:

Gzip单个文件压缩

对于单个文件使用GZip压缩。

 
  1. package date0805.demo1; 
  2.  
  3. import java.io.BufferedInputStream; 
  4. import java.io.BufferedOutputStream; 
  5. import java.io.File; 
  6. import java.io.FileInputStream; 
  7. import java.io.FileOutputStream; 
  8. import java.io.InputStream; 
  9. import java.io.OutputStream; 
  10. import java.util.zip.GZIPOutputStream; 
  11.  
  12. public class GZipRunnable implements Runnable { 
  13.  
  14. private final File file; 
  15.  
  16. public GZipRunnable(File file) { 
  17.   this.file=file; 
  18.  
  19. @Override 
  20. public void run() { 
  21.   if(!file.getName().endsWith(".gz")) { 
  22.    File outputFile=new File(file.getParent(),file.getName()+".gz"); 
  23.    if(!outputFile.exists()) { 
  24.     CountTime countTime = new CountTime(file); 
  25.     Thread t=new Thread(countTime); 
  26.     t.start(); 
  27.     try
  28.      InputStream in =new BufferedInputStream(new FileInputStream(file)); 
  29.      OutputStream out=new BufferedOutputStream(new GZIPOutputStream(new FileOutputStream(outputFile))); 
  30.     ) { 
  31.      int b; 
  32.      while((b=in.read())!=-1
  33.       out.write(b); 
  34.      out.flush(); 
  35.     } catch(Exception ex) { 
  36.      ex.printStackTrace(); 
  37.     } 
  38.     t.interrupt(); 
  39.    } else { 
  40.     System.out.println(outputFile+"文件已经存在,无法压缩!"); 
  41.    } 
  42.   } 

创建线程池进行递归压缩

要实现对一个文件夹下面的所有的子文件进行压缩,首先递归找出所有子文件,然后调用压缩线程进行压缩。

 
  1. package date0805.demo1; 
  2.  
  3. import java.io.File; 
  4. import java.util.concurrent.ExecutorService; 
  5. import java.util.concurrent.Executors; 
  6.  
  7. public class GZipFiles { 
  8.  
  9. private final static int THREAD_COUNT=4
  10. private static ExecutorService service=Executors.newFixedThreadPool(THREAD_COUNT); 
  11. public static void GZip(File fileArgs) { 
  12.   if(!fileArgs.isDirectory()) { 
  13.    GZipRunnable gZipRunnable = new GZipRunnable(fileArgs); 
  14.    service.submit(gZipRunnable); 
  15.   } 
  16.   else { 
  17.    File[] files = fileArgs.listFiles(); 
  18.    for(File f:files) { 
  19.     GZip(f); 
  20.    } 
  21.   } 
  22. public static void shutdown() { 
  23.   service.shutdown(); 

压缩提示

 
  1. package date0805.demo1; 
  2.  
  3. import java.io.File; 
  4.  
  5. public class CountTime implements Runnable { 
  6.  
  7. private File file; 
  8.  
  9. public CountTime(File file) { 
  10.   super(); 
  11.   this.file = file; 
  12.  
  13. @Override 
  14. public void run() { 
  15.   System.out.println("正在压缩"+file.getAbsolutePath()); 
  16.   try { 
  17.    while(true) { 
  18.     System.out.print("."); 
  19.     Thread.sleep(1000); 
  20.    } 
  21.   }catch (InterruptedException e) { 
  22.    System.out.println(); 
  23.    System.out.println(file.getAbsolutePath()+".gz已经压缩完成!"); 
  24.   } 
  25.  

测试代码

 
  1. package date0805.demo1; 
  2.  
  3. import java.io.File; 
  4.  
  5. public class Test { 
  6.  
  7. public static void main(String[] args) { 
  8.   File file=new File("D://新建文件夹"); 
  9.   GZipFiles.GZip(file); 
  10.   GZipFiles.shutdown(); 
  11. }



来源:51CTO

相关文章
|
9天前
|
Arthas Java 测试技术
Java字节码文件、组成,jclasslib插件、阿里arthas工具,Java注解
Java字节码文件、组成、详解、分析;常用工具,jclasslib插件、阿里arthas工具;如何定位线上问题;Java注解
Java字节码文件、组成,jclasslib插件、阿里arthas工具,Java注解
|
10天前
|
监控 Java 调度
【Java学习】多线程&JUC万字超详解
本文详细介绍了多线程的概念和三种实现方式,还有一些常见的成员方法,CPU的调动方式,多线程的生命周期,还有线程安全问题,锁和死锁的概念,以及等待唤醒机制,阻塞队列,多线程的六种状态,线程池等
69 6
【Java学习】多线程&JUC万字超详解
|
3天前
|
Java 调度 开发者
Java并发编程:深入理解线程池
在Java的世界中,线程池是提升应用性能、实现高效并发处理的关键工具。本文将深入浅出地介绍线程池的核心概念、工作原理以及如何在实际应用中有效利用线程池来优化资源管理和任务调度。通过本文的学习,读者能够掌握线程池的基本使用技巧,并理解其背后的设计哲学。
|
3天前
|
缓存 监控 Java
Java中的并发编程:理解并应用线程池
在Java的并发编程中,线程池是提高应用程序性能的关键工具。本文将深入探讨如何有效利用线程池来管理资源、提升效率和简化代码结构。我们将从基础概念出发,逐步介绍线程池的配置、使用场景以及最佳实践,帮助开发者更好地掌握并发编程的核心技巧。
|
5天前
|
缓存 监控 Java
java中线程池的使用
java中线程池的使用
|
8天前
|
Java API 开发者
【Java字节码操控新篇章】JDK 22类文件API预览:解锁Java底层的无限可能!
【9月更文挑战第6天】JDK 22的类文件API为Java开发者们打开了一扇通往Java底层世界的大门。通过这个API,我们可以更加深入地理解Java程序的工作原理,实现更加灵活和强大的功能。虽然目前它还处于预览版阶段,但我们已经可以预见其在未来Java开发中的重要地位。让我们共同期待Java字节码操控新篇章的到来!
|
4天前
|
算法 Java 数据处理
Java并发编程:解锁多线程的力量
在Java的世界里,掌握并发编程是提升应用性能和响应能力的关键。本文将深入浅出地探讨如何利用Java的多线程特性来优化程序执行效率,从基础的线程创建到高级的并发工具类使用,带领读者一步步解锁Java并发编程的奥秘。你将学习到如何避免常见的并发陷阱,并实际应用这些知识来解决现实世界的问题。让我们一起开启高效编码的旅程吧!
|
9天前
|
存储 Java 程序员
优化Java多线程应用:是创建Thread对象直接调用start()方法?还是用个变量调用?
这篇文章探讨了Java中两种创建和启动线程的方法,并分析了它们的区别。作者建议直接调用 `Thread` 对象的 `start()` 方法,而非保持强引用,以避免内存泄漏、简化线程生命周期管理,并减少不必要的线程控制。文章详细解释了这种方法在使用 `ThreadLocal` 时的优势,并提供了代码示例。作者洛小豆,文章来源于稀土掘金。
|
5天前
|
Java API 开发者
【Java字节码的掌控者】JDK 22类文件API:解锁Java深层次的奥秘,赋能开发者无限可能!
【9月更文挑战第8天】JDK 22类文件API的引入,为Java开发者们打开了一扇通往Java字节码操控新世界的大门。通过这个API,我们可以更加深入地理解Java程序的底层行为,实现更加高效、可靠和创新的Java应用。虽然目前它还处于预览版阶段,但我们已经可以预见其在未来Java开发中的重要地位。让我们共同期待Java字节码操控新篇章的到来,并积极探索类文件API带来的无限可能!
|
6天前
|
算法 Java
Java 压缩文件
在Java中压缩文件是一个常见的需求,通常可以通过使用Java自带的`java.util.zip`包来实现。这个包提供了`ZipOutputStream`类来创建ZIP格式的压缩文件。以下是一个简单的示例,展示了如何将多个文件压缩到一个ZIP文件中。 ### 示例:将多个文件压缩到一个ZIP文件中 ```java import java.io.*; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; public class ZipFilesExample { public static vo