java多线程压缩文件

java多线程压缩文件,第1张

/**

 * 递归压缩文件

 * 

 * @param srcRootDir

 *            压缩文件夹根目录的兆兆子路径

 * @param file

 *            当前递归压缩的文件或目录对象

 * @param zos

 *            压缩文件存储对象

 * @throws Exception

 */

private static void zip(String srcRootDir, File file, ZipOutputStream zos) throws Exception {

if (file == null) {

return

}

// 如果是文件,则直接压缩该文件

if (file.isFile()) {

int 族隐租count, bufferLen = 1024

byte data[] = new byte[bufferLen]

// 获取文件相对于压缩文件夹根目录的子路径

String subPath = file.getAbsolutePath()

int index = subPath.indexOf(srcRootDir)

if (index != -1) {

subPath = subPath.substring(srcRootDir.length() + File.separator.length())

}

ZipEntry entry = new ZipEntry(subPath)

zos.putNextEntry(entry)

BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file))

while ((count = bis.read(data, 0, bufferLen)) != -1) {

zos.write(data, 0, count)

}

bis.close()

zos.closeEntry()

}

// 如果是目录,则压缩整个目录

else {

// 压缩目录中的文件或子目录

File[] childFileList = file.listFiles()

for (int n = 0 n < childFileList.length n++) {

childFileList[n].getAbsolutePath().indexOf(file.getAbsolutePath())

zip(srcRootDir, childFileList[n], zos)

}

}

}

/**

 * 对文件或文件目录进行压缩

 * 

 * @param srcPath

 *            要压缩的源文件路径。如果压缩一个文件,则为该文件的全路径;如果压缩一个目录,则为该目录的顶层目录路径

 * @param zipPath

 *            压缩文件保存的路径。注意:zipPath不能是srcPath路径下的子文件夹

 * @param zipFileName

 *            压缩文件名

 * @throws Exception

 */

public static void zip(String srcPath, String zipPath, String zipFileName) throws Exception {

if (StringUtils.isEmpty(srcPath) || StringUtils.isEmpty(zipPath) || StringUtils.isEmpty(zipFileName)) {

return

// throw new

// ParameterException(ICommonResultCode.PARAMETER_IS_NULL)

}

CheckedOutputStream cos = null

ZipOutputStream zos = null

try {

File srcFile = new File(srcPath)

// 判断压缩文件保存的路径是否为源文件路径的子文件夹,如果是,则抛出异常(防止无限递归压缩的发生)

if (srcFile.isDirectory() && zipPath.indexOf(srcPath) != -1) {

return

// throw new

// ParameterException(ICommonResultCode.INVALID_PARAMETER,

// "zipPath must 携卜not be the child directory of srcPath.")

}

// 判断压缩文件保存的路径是否存在,如果不存在,则创建目录

File zipDir = new File(zipPath)

if (!zipDir.exists() || !zipDir.isDirectory()) {

zipDir.mkdirs()

}

// 创建压缩文件保存的文件对象

String zipFilePath = zipPath + File.separator + zipFileName

File zipFile = new File(zipFilePath)

if (zipFile.exists()) {

// 检测文件是否允许删除,如果不允许删除,将会抛出SecurityException

SecurityManager securityManager = new SecurityManager()

securityManager.checkDelete(zipFilePath)

// 删除已存在的目标文件

zipFile.delete()

}

cos = new CheckedOutputStream(new FileOutputStream(zipFile), new CRC32())

zos = new ZipOutputStream(cos)

// 如果只是压缩一个文件,则需要截取该文件的父目录

String srcRootDir = srcPath

if (srcFile.isFile()) {

int index = srcPath.lastIndexOf(File.separator)

if (index != -1) {

srcRootDir = srcPath.substring(0, index)

}

}

// 调用递归压缩方法进行目录或文件压缩

zip(srcRootDir, srcFile, zos)

zos.flush()

} catch (Exception e) {

throw e

} finally {

try {

if (zos != null) {

zos.close()

}

} catch (Exception e) {

e.printStackTrace()

}

}

}

目录结构为树型结构,用多线程不大好做,线程最多在前几层进行分割手誉指,比如每个目录下有两个目录,共5层,那么root目录下就能启用2个线程分别进行遍历,所以第二层就启动了2个线程进行遍历,加上主线程共三个线程,虽然这样做是可以做,但是要更具实际情况进行线程的规划,否则容易线程过多导致cpu超负荷,或者假死,再提一点,遍历目录不建议用递归来写,因为毕配目录较多容易栈溢出。

随手写了个,会有点bug就是关闭线程池的时候,还有就是有可能目录太多进入拒绝策略,这个东西 可以考虑使用令牌桶算法,或者计数器算法来做。这里提供个简单的例子。

public class TraverseUtil {

public static BlockingQueue blockingQueue = new LinkedBlockingQueue(100)

public static ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(100,100,10, TimeUnit.SECONDS,blockingQueue)

public static void traverseFolder2(String path) {

File file = new File(path)

if (file.exists()) {

File[] files = file.listFiles()

if (null == files || files.length == 0) {

System.out.println("文件夹是虚前空的!")

return

} else {

for (File file2 : files) {

if (file2.isDirectory()) {

System.out.println("文件夹:" + file2.getAbsolutePath())

threadPoolExecutor.execute(new Runnable() {

@Override

public void run() {

traverseFolder2(file2.getAbsolutePath())

}

})

} else {

System.out.println("文件:" + file2.getAbsolutePath())

}

}

}

} else {

System.out.println("文件不存在!")

}

}

public static void main(String[] args) throws InterruptedException {

traverseFolder2("C:\\Users\\a8932\\Desktop\\md")

}

}

改成同顷袭步代雀袭兄码块试试

public void Thread_Synchronized_ReceiveData_7(String filepath,

String str) throws IOException {

synchronized (filepath) {

RandomAccessFile raf

raf = new RandomAccessFile(filepath, "rw")

raf.seek(raf.length())

raf.writeBytes(str + "\r\禅桥n")

raf.close()

}

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/12200957.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存