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

Gzip单个文件压缩

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

package date0805.demo1;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.zip.GZIPOutputStream;

public class GZipRunnable implements Runnable {

	private final File file;

	public GZipRunnable(File file) {
		this.file=file;
	}

	@Override
	public void run() {
		if(!file.getName().endsWith(".gz")) {
			File outputFile=new File(file.getParent(),file.getName()+".gz");
			if(!outputFile.exists()) {
				CountTime countTime = new CountTime(file);
				Thread t=new Thread(countTime);
				t.start();
				try(
					InputStream in =new BufferedInputStream(new FileInputStream(file));
					OutputStream out=new BufferedOutputStream(new GZIPOutputStream(new FileOutputStream(outputFile)));
				) {
					int b;
					while((b=in.read())!=-1)
						out.write(b);
					out.flush();
				} catch(Exception ex) {
					ex.printStackTrace();
				}
				t.interrupt();
			} else {
				System.out.println(outputFile+"文件已经存在,无法压缩!");
			}
		}
	}
}

创建线程池进行递归压缩

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

package date0805.demo1;

import java.io.File;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class GZipFiles {

	private final static int THREAD_COUNT=4;
	private static ExecutorService service=Executors.newFixedThreadPool(THREAD_COUNT);
	public static void GZip(File fileArgs) {
		if(!fileArgs.isDirectory()) {
			GZipRunnable gZipRunnable = new GZipRunnable(fileArgs);
			service.submit(gZipRunnable);
		}
		else {
			File[] files = fileArgs.listFiles();
			for(File f:files) {
				GZip(f);
			}
		}
	}
	public static void shutdown() {
		service.shutdown();
	}
}

压缩提示

package date0805.demo1;

import java.io.File;

public class CountTime implements Runnable {

	private File file;

	public CountTime(File file) {
		super();
		this.file = file;
	}

	@Override
	public void run() {
		System.out.println("正在压缩"+file.getAbsolutePath());
		try {
			while(true) {
				System.out.print(".");
				Thread.sleep(1000);
			}
		}catch (InterruptedException e) {
			System.out.println();
			System.out.println(file.getAbsolutePath()+".gz已经压缩完成!");
		}
	}

}

测试代码

package date0805.demo1;

import java.io.File;

public class Test {

	public static void main(String[] args) {
		File file=new File("D:\\新建文件夹");
		GZipFiles.GZip(file);
		GZipFiles.shutdown();
	}
}
时间: 2024-11-08 01:26:52

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

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

本文将介绍Java中利用线程池递归的方式压缩文件夹下面的所有子文件,具体方法如下: Gzip单个文件压缩 对于单个文件使用GZip压缩. package date0805.demo1; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream

用php遍历所有指定路径的文件夹以及其下所有子文件夹

<?php function bianli($dir){$list=scandir($dir);foreach($list as $v){ //遍历文件夹$file_location=$dir."/".$v; //记录路径if(is_dir($file_location)&&$v!="."&&$v!=".."){echo $v."&nbsp<br>";echo &quo

asp.net FileUpload上传文件夹并检测所有子文件

1.在FileUpload控件添加一个属性 webkitdirectory=""就可以上传文件夹了 <asp:FileUpload ID="FileUpload1" runat="server" webkitdirectory="" /> 2.检测文件夹下所有子文件 string DirectoryName = FileUpload1.PostedFile.FileName; string path = Serve

java打印出某一指定路径下的文件夹内的所有子文件夹和文件,并区分开来

public class printoutFile { public static void main(String[] args) { printFile(new File("D:\\test"),1); } public static void printFile(File file,int sub) { if (file.isFile()) { System.out.println("您给定的是一个文件"); // 判断给定目录是否是一个合法的目录,如果不是,

windows中遍历指定文件夹下的所有子文件夹

#include "stdafx.h" #include "Windows.h" #include <vector> #include <string> #include "iostream" using namespace std; int GetSubFolders(string& folder, vector<string>& subFolders ) { subFolders.clear

如何在linux系统下对文件夹名有空格的文件夹进行操作

http://www.2cto.com/os/201409/335119.html 在Windows操作系统中可以轻易地创建\移动\删除文件夹名带有空格的文件夹, 而在linux则需要进行一些特殊的处理才能实现以上功能. (1)创建文件夹 mkdir my\ first 这条命令创建了文件夹"my first",文件夹名中my和first之间有一个空格,在命令行中需要 添加一个"\"符号和一个空格的组合 mkdir my\ \ tow 这条命令创建了文件夹"

c# 封装的文件夹操作类之复制文件夹

c#  封装的文件夹操作类之复制文件夹 一.复制文件夹原理: 1.递归遍历文件夹 2.复制文件 二.FolderHelper.cs 1 /// <summary> 2 /// 文件夹操作类 3 /// </summary> 4 public static class FolderHelper 5 { 6 /// <summary> 7 /// 复制文件夹 8 /// </summary> 9 /// <param name="sourceFo

用字符流实现每个文件夹中创建包含所有文件信息的readme.txt

1 package com.readme; 2 3 import java.io.BufferedWriter; 4 import java.io.File; 5 import java.io.FileWriter; 6 import java.io.IOException; 7 import java.text.SimpleDateFormat; 8 import java.util.Date; 9 import java.util.Scanner; 10 11 /** 12 * @autho

Web 在线文件管理器学习笔记与总结(15)剪切文件夹 (16)删除文件夹

(15)剪切文件夹 ① 通过rename($oldname,$newname) 函数实现剪切文件夹的操作 ② 需要检测目标文件夹是否存在,如果存在还要检测目标目录中是否存在同名文件夹,如果不存在则剪切 dir.function.php 添加: //剪切文件夹 function cutFolder($src,$dst){ if(!file_exists($dst)){ return '目标目录不存在'; }else{ if(!is_dir($dst)){ return '不是目录'; }else{