`
zx_code
  • 浏览: 99006 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

java 使用线程池处理文件夹下面的文件

    博客分类:
  • Java
阅读更多

读取某个文件夹下面的所有文件,使用多线程处理,例如读取E盘下面的文件内容:

package thread;

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

public class BigDataFile {
	
	private class DealFile implements Runnable
	{
		
		//存放遍历的结果
		BlockingQueue<File> bFile = null;
		
		//每个线程独有的file文件夹
		File file = null;
		
		public DealFile(BlockingQueue<File> bFile, File file)
		{
			this.bFile = bFile;
			this.file = file;
		}

		@Override
		public void run() {
			getFileName(file.listFiles());
		}
		
		/**
		 * 迭代遍历文件夹。
		 * */
		private final void getFileName(File[] fileDirectory)
		{
			for(File file : fileDirectory)
			{
				if(file.isDirectory())
				{
					//继续迭代处理
					getFileName(file.listFiles());
				}
				else
				{
					//输出文件的名称
					System.out.println(file.getName());
					bFile.add(file);
				}
			}
		}
	}
	
	public static void main(String[] args) throws InterruptedException {
		
		/**
		 * 由于LinkedBlockingQueue实现是线程安全的,实现了先进先出等特性,是作为生产者消费者的首选,LinkedBlockingQueue 
		 * 可以指定容量,也可以不指定,不指定的话,默认最大是Integer.MAX_VALUE,
		 * 其中主要用到put和take方法,put方法在队列满的时候会阻塞直到有队列成员被消费,take方法在队列空的时候会阻塞,
		 * 直到有队列成员被放进来。
		 * */
		BlockingQueue<File> bFile = new LinkedBlockingQueue<File>();
		
		//需要遍历的文件夹
		File file = new File("D://");
		
		//线程池
		ExecutorService es = Executors.newCachedThreadPool();
		
		BigDataFile bf = new BigDataFile();
		
		/**
		 * new File("D://") 文件夹下面有几个文件夹new 几个线程执行。
		 * */
		for(File f : file.listFiles())
		{
			if(f.isDirectory())
			{
				es.execute(bf.new DealFile(bFile, f));
			}
			else
			{
				System.out.println(f.getName());
				bFile.add(f);
			}
		}
		
		//关闭线程池
		es.shutdown();
	}
	
}
1
1
分享到:
评论
1 楼 KeepChanging 2017-11-20  
你这个根本就不对,我遍历了5遍,每次的到的count结果都不一样
private final void getFileName(File[] fileDirectory) {
for (File file : fileDirectory) {
if (file.isDirectory()) {
// 继续迭代处理
getFileName(file.listFiles());
} else {
// 输出文件的名称
System.out.println(file.getName() + "==========" + count++);
bFile.add(file);
}
}
}

相关推荐

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

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

    线程池拷贝目录程序代码

    利用线程池实现拷贝目录的效果,让其效果等同于cp命令。

    获取文件夹里所有图片

    在IT领域,获取文件夹中的特定类型文件,如图片,是一项常见的任务,尤其在处理大量数据或构建多媒体应用时。这个任务可以通过编程语言中的文件系统操作来实现,例如Python、Java、C#等。以下是一个关于如何在Python...

    监听文件下文件发生变化时复制文件到另一个文件夹

    为了解决这个问题,我们可以创建一个单独的线程或线程池来处理文件复制。在Python中,可以使用`threading`模块;在Java中,可以使用`Thread`类或`ExecutorService`;在C#中,可以使用`System.Threading.Thread`或`...

    多线程全面遍历磁盘文件

    在遍历磁盘文件时,如果使用多线程,我们可以将磁盘的不同区域分配给不同的线程,这样就能并行地读取和处理文件,从而显著提高遍历速度。 实现多线程遍历磁盘文件,我们需要以下几个关键步骤: 1. **创建线程池**...

    java实现csv导出千万级数据实例

    2. **流式处理**:使用Java的BufferedWriter类进行流式写入,每批数据读取后立即写入文件,减少内存占用。 3. **线程安全**:如果需要并发处理,可能需要使用多线程,并确保对文件的访问是线程安全的,比如使用...

    java多线程读取多个文件的方法

    在Java编程中,多线程读取多个文件是一项常见需求,尤其在文件数量较多或者文件较大时,能够提升处理效率。本文将详细介绍如何在Java中使用多线程来同时读取多个文件。 首先,本文涉及到的核心类是`Thread`类,这是...

    EPUB 解析 (java)

    同时,可能会使用线程池来并发处理文件,提高整体解析速度。 总的来说,Java EPUB解析模块是电子书应用的核心部分,它使得开发者可以轻松地与EPUB内容交互,创建阅读器应用或进行内容分析。通过从FBreader项目中...

    FTP文件管理管理模块 java实现

    FTP文件管理管理模块在Java中的实现涉及到多个关键知识点,涵盖了网络通信、文件处理以及多线程编程。以下是对这些知识点的详细阐述: 1. FTP(File Transfer Protocol)协议:FTP是一种用于在网络上进行文件传输的...

    JavaThreaddemo_DEMO_tidecme_线程池Java_

    Java线程池是一种高效管理线程的技术,它允许开发者预定义一组线程,这些线程可以重复使用,减少了创建和销毁线程的开销。在Java中,`java.util.concurrent` 包提供了线程池的相关实现,其中ExecutorService是线程池...

    仿ACE线程池机制实现的线程池类

    在"threadpool"和"common"这两个文件夹中,可能包含了实现这些类的源代码文件,以及可能用于支持线程池运行的通用工具类或辅助函数。"threadpool"可能包含了线程池相关的类和接口实现,而"common"可能包含了一些常用...

    java文件夹上传

    在Java中,我们可以使用`java.io`和`java.nio`包中的类来处理文件和目录。例如,`File`类用于表示文件或目录,`Files`类提供了大量静态方法用于操作文件系统对象。在遍历和读取文件夹时,通常会使用递归算法,确保...

    java批量解析微信dat文件

    对于需要处理或解析这些文件的情况,掌握java批量解析微信dat文件的技术显得尤为重要。 首先,要了解的是微信dat文件的结构,通常它是经过加密处理的,需要特定的解密手段才能正确读取内容。从文档提供的内容来看,...

    删除svn文件的java代码

    可以考虑优化算法,比如使用线程池异步删除文件。 #### 四、总结 本文详细介绍了一段用于删除SVN版本控制系统中`.svn`文件夹的Java代码。通过对代码结构的逐层解析,不仅展示了如何实现这一功能,还探讨了代码设计...

    httpClient 调用远程接口 获取数据到本地文件夹

    HttpClient支持多线程请求,可以使用ExecutorService来管理线程池。同时,注意防止对服务器的过度请求,遵守其速率限制政策,避免被封IP。 7. **安全性与身份验证**: 访问某些远程接口可能需要身份验证。...

    文件批量重命名工具

    在处理文件操作时,Java的`java.io`和`java.nio`包提供了强大的文件I/O功能。例如,`java.io.File`类可以用于文件和目录的创建、删除以及获取文件信息,而`java.nio.file.Files`类则提供了更现代的文件操作API,如...

    java多线程学习-ftp上传

    文档"Java线程池.doc"和文本文件"java线程池学习1.txt"、"java线程池学习2.txt"很可能是关于如何创建和使用线程池的教程,它们可能涵盖了以下内容: 1. 创建线程池的基本步骤:定义核心线程数、最大线程数、线程...

    一款基于Java设计的文件传输系统,其中包含了源码以供大家参考

    在这个Java实现的系统中,客户端负责发起文件传输请求,而服务器端则处理这些请求并完成实际的文件传输操作。 在Java中,文件传输可以利用多种API,如Java IO(输入/输出)和NIO(非阻塞输入/输出)。IO API包括...

    读取网络图片并输出zip压缩包(单文件夹/多文件夹)示例源码.rar

    10. **性能优化**:在处理大量图片或大文件时,可以考虑使用异步编程模型,如Java 8的`CompletableFuture`,或者使用线程池来并行处理任务,提高系统性能。 总的来说,这个示例源码涉及了Java网络编程、文件操作、...

    jspmusicupload_java_streamzdd_

    在本文中,我们将深入探讨如何使用Java和流处理(Stream)技术实现一个JSP音乐文件批量上传系统,并集成定时播放功能。"jspmusicupload_java_streamzdd_"项目可能是一个示例,展示了如何在Web应用程序中处理这样的...

Global site tag (gtag.js) - Google Analytics