基于Java多线程操作文件案例分享
场景描述:某文件夹下有很多文件和文件夹,要求读取出该文件夹下的所有文件,并将文本打印输出。
案例分析:假设该文件夹下有10个文件,那么我们将所有的文件遍历一遍打印输出就可以了。但如果有100个, 1000个,10000个,甚至更多呢?这时候或许我们应该考虑使用多线程来解决这个问题喽,分批次读取文件。
实现思路:
(1)List<File> readFiles(String filePath)
(2)subFiles(List<File> fileList, int startIndex, int endIndex)
(3)readFile(File file)
(4)FavThreadUtil(List<File> fileList).run()
干货代码:
(一)FavFileUtil.java,上面步骤(1)(2)(3)读取操作文件用
package com.favccxx.favthread.util; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.List; public class FavFileUtil { public static List<File> getFileList(String filePath){ List<File> fileList = new ArrayList<File>(); File file = new File(filePath); if(!file.isDirectory()){ System.out.println("文件【" + file.getName() + "】:" + file.getAbsolutePath()); fileList.add(file); }else{ System.out.println("文件夹【" + file.getName() + "】:" + file.getAbsolutePath()); File[] files = file.listFiles(); for(int i = 0; i < files.length; i++){ if (!files[i].isDirectory()) { System.out.println(" 文件【" + files[i].getName() + "】:"); fileList.add(files[i]); } else if (files[i].isDirectory()) { getFileList(files[i].getAbsolutePath()); } } } return fileList; } public static List<File> subFiles(List<File> list, int startIndex, int endIndex){ if(endIndex>list.size()){ return list.subList(startIndex, list.size()); } return list.subList(startIndex, endIndex); } public static void readFile(File file) throws IOException{ //读取文件 FileInputStream is = new FileInputStream(file); //获取文件的字符流 InputStreamReader isr = new InputStreamReader(is); //缓冲 BufferedReader br = new BufferedReader(isr); String line = null; while((line = br.readLine())!=null ){ System.out.println(":::" + line); } br.close(); } }
(二)FavThreadUtil.java,上面步骤(4)操作文件列表用
package com.favccxx.favthread.util; import java.io.File; import java.io.IOException; import java.util.List; public class FavThreadUtil implements Runnable { private List<File> fileList; public FavThreadUtil(List<File> fileList) { this.fileList = fileList; } @Override public void run() { for(File file : fileList){ try { FavFileUtil.readFile(file); } catch (IOException e) { e.printStackTrace(); } } } }
(三)Main.java,Java Main程序运行测试。
package com.favccxx.favthread.main; import java.io.File; import java.util.List; import com.favccxx.favthread.util.FavFileUtil; import com.favccxx.favthread.util.FavThreadUtil; public class Main { public static void main(String[] args) { List<File> fileList = FavFileUtil.getFileList("D:\\log"); List<File> aList = fileList.subList(0, 10); List<File> bList = fileList.subList(10, 20); FavThreadUtil afavThreatUtil = new FavThreadUtil(aList); FavThreadUtil bfavThreatUtil = new FavThreadUtil(bList); new Thread(afavThreatUtil, "线程1").start(); new Thread(bfavThreatUtil, "线程2").start(); } }
Java多线程体现的是Java面向对象的封装特性,体现的人文的分而治之的思想。
本文出自 “这个人的IT世界” 博客,请务必保留此出处http://favccxx.blog.51cto.com/2890523/1623396
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。