/**
*
* @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()
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)